项目印记
预测未来的最好办法,就是把它创造出来。--艾伦.凯(美)
【Flask】自动化网络数据库-利用Python实现自动化建立数据库
2021年末的寒假是一个特殊的日子,疫情原因不能回内地老家,不能到处去旅游,所以假期里只用在家里码代码学习Python。
项目设想:根据关键词利用python实现自动化在预定网上书城网站,查询关键词,将查询到的书籍信息(书名、作者、简介、图书介绍等)自动化上传到云数据库中保存,书籍封面图片自动保存在本地电脑上。该项目在网上搜寻资料自动化存储为数据库等项目中有极具研究的意义!
经过4~5天的反复测试和网上查找资料学习,项目已经完成!本文不是一篇专业学习Python编程的文章,作为一个总结及备忘。
Python Spider网络爬虫又被称为网络蜘蛛,我们可以把互联网想象成一个蜘蛛网,每一个网站都是一个节点,我们可以使用一只蜘蛛去各个网页抓取我们想要的资源。举一个最简单的例子,你在百度和谷歌中输入‘Python',会有大量和Python相关的网页被检索出来,百度和谷歌是如何从海量的网页中检索出你想要的资源,他们靠的就是派出大量蜘蛛去网页上爬取,检索关键字,建立索引数据库,经过复杂的排序算法,结果按照搜索关键字相关度的高低展现给你。
首先是安装chromedriver驱动,具体学习一下链接1:文章资料。爬取动态网页还可以使用Selenium库。Selenium是一种自动化测试工具,能模拟浏览器的行为,它支持各种浏览器,包括Chrome、Firefox等主流界面式浏览器,在浏览器里面安装一个Selenium的插件,即可方便地实现Web界面的测试。Selenium3调用浏览器时,必须下载并安装一个类似补丁的文件,例如,Firefox的补丁文件为geckodriver,Chrome的补丁文件为chromedrive。将下载好的chromedrive.exe文件存放至Python安装的根目录(与python.exe文件同一目录)即可。目前只能在控制台使用,Sublime Text3不能使用。我的做法是在Sublime Text3修改代码,复制到python命令窗口,执行。
其二、以下代码可以对窗口的操作。
#切换窗口
n2 = driver.window_handles#所有窗口句柄
driver.switch_to.window(n2[-1])#切换窗口
driver.current_window_handle#当前窗口句柄
但是,网页源码需要重新生成,二者不会自动同步。
html=driver.page_source
soup = BeautifulSoup(html,'lxml')
html=etree.HTML(html,parser=etree.HTMLParser(encoding='utf8'))
其三、在网页中查看网页个元素的Xpath或html等:在谷歌浏览器中-选中元素-右键检查-在自动打开的开发者工具窗口中的代码上-右键选择COPY- Copy XPth等-在python编辑器中粘贴。XML路径语言(XMLPathLanguage,XPath)是一门在XML文档中查找信息的语言。XPath最初被设计用来搜寻XML文档,但是同样适用于HTML文档的搜索。XPath的选择功能十分强大,它提供了非常简洁明了的路径选择表达式,还提供了超过100个内建函数,用于字符串、数值、时间的匹配,以及节点、序列的处理等等,几乎所有定位的节点都可以用XPath来选择。(Document Object Model),W3C 制定的标准接口规范,是一种处理 HTML 和 XML 文件的标准 API。它把文档作为一个树形结构,树的每个结点表示了一个 HTML 标签或标签内的文本项。DOM 树结构精确地描述了 HTML 文档中标签间的相互关联性。将 HTML 或 XML 文档转化为 DOM 树的过程称为解析(parse)。DOC学习链接2:初识DOM 链接3: python lxml中etree的简单应用
其四、pymysql.err.InterfaceError: (0, '')解决办法。
导致这个错误的原因是通过pymysql连接MySQL,没有关闭连接的操作,所以短时间内不会出问题,长时间保持这个连接会出现连接混乱。虽然看着自己的代码没错,还是会报pymysql.err.InterfaceError: (0, '')错误。所以这个连接要么连上之后,用完就关闭。要么就用下面的代码,检查连接是否存在,断开的话会重连。
db = pymysql.connect(host='127.0.0.1',port=3306,user='user', passwd='pwd', db='db_name', charset='utf8')
sql = 'select * from table_name'
db.ping(reconnect=True)
cur.execute(sql)
db.commit()
其五、python爬虫获取img标签的 src属性
imgs.append(img[0].get('src'))
其六、获取字符最后一个“/”后文本。
title = data.split('/')[-1]
其七、将书籍封面图以原图文件名保存到本地电脑fengmian文件夹中。(代码块中tab空格缺失,需自行修改)
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36'}
for data in imgs:
title = data.split('/')[-1]
print(title)
pic = requests.get(url=data, headers=headers).content
with open('fengmian/' + title + '.jpg', mode='wb') as f:
f.write(pic)
其八、获取标签属性
for li_2 in range(len(li)): # todo 从上一个li标签中获取到我要的信息。参考:https://www.jb51.net/article/132145.htm
print(li[li_2].tag) #获取<a>标签名a
print(li[li_2].attrib) # 获取<a>标签的属性href和class
print(li[li_2].text) # 获取到li下面的文本
其九、if与while语句的区别:对于if语句,输出就是“Hi” ;而对于while语句,输出是“Hi”重复了5次。
i=0
if i<5:
print('Hi')
i+=1
i=0
while i<5:
print('Hi')
i+=1
其十、while语句结束后需空一行。
其十一、每次不能爬取的搜到的全部书籍信息,且每个关键词的爬取量不尽相同,但每个关键词多次爬取的数目一定。经初步测试,使用以下方法初步解决问题:在代码72行使用time.sleep(10)# 延时几秒,既可以等待页面加载,也可以防止爬取太快被封IP。
其十二、switch_to_window不建议使用,解决方法很简单就是将to后面的下滑线改成 . 就好了(switch_to.window)
最后,明确python爬取的内容,如果只是基本情况,Chrome浏览器的开发者工具中分析Network-Fetch/XHR中的信息,发现网址https://www.ptpress.com.cn/bookinfo/wsBookSearch?rows=9&page={page}&keyword=&jc=中书籍的基本情况,只要爬取这个内容、整理输出格式就能满足。不需要自动化打开每个书详细的网址去爬去资料。完整代码在附件:待完善代码
import requests
import parsel
import csv
for page in range(1, 50):
print(f'========================正在保存第{page}页数据内容===================================')
url = f'https://www.ptpress.com.cn/bookinfo/wsBookSearch?rows=9&page={page}&keyword=&jc='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
print(response.text)
浏览器整个编程框架的设计、全局变量、数据库结构等是很重要的。
基础学习是以《Python网上爬虫》内容为基础,基本语法数列、数组、循环语句等,静态网页爬取、动态网页爬取,各种数据保存、数据库保存等。问题解决主要是网上百度,找到的资料记得保存,整理以便后续使用。直接把网址复制单mac下的Bear app文档中,好处是不用自己设置,自动生成超链接,很方便!
以下是部分代码:设置浏览器环境,根据关键词打开网页
#设置谷歌驱动器的环境
options = webdriver.ChromeOptions()
#设置chrome不加载图片,提高速度。
options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
#设置不显示窗口
options.add_argument('--headless')
#创建WebDriver对象,参数options=options
driver=webdriver.Chrome(options=options)
#等待变量
wait=WebDriverWait(driver,10)
#模拟搜索“Python编程”
#打开网页
driver.get('http://www.ptpress.com.cn/search/books')
#等待“搜索”按钮加载完成
search_btn=driver.find_element_by_id("searchVal")
#在搜索框填写“Python编程”
search_btn.send_keys('Python编程')
#确认元素是否已经出现
#input=wait.until(EC.presence_of_element_located((By.ID,'searchVal'))
#等待“确认”按钮加载完成
confirm_btn=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'#app>div:nth-child(1)>div>div>div.search_main.down_search>button')))
#单击“确认”按钮
confirm_btn.click()
对于浏览器窗口操作(前面加"Driver.")
| 名称 | 用法 |
|---|---|
| switch_to.window(window_handle) | 切换窗口 |
| current_window_handle | 当前窗口句柄 |
| window_handles | 所有窗口句柄 |
| close() | 关闭当前窗口 |
| quit() | 关闭浏览器 |
Xpath
find_element_by_xpath(Xpath表达式)
| 表达式 | 说明 |
|---|---|
| / | 从根节点选取 |
| // | 不考虑位置,从匹配选择的当前节点选择文档中的节点 |
| . | 选取当前节点 |
| .. | 选取当前节点的父节点 |
| @ | 选取属性 |
主要参考资料:
毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服
Python自动化测试--Selenium:current_url获取页面跳转后的新页面地址
Python和Selenium对浏览器窗口进行处理的代码实例
代码备份:Python自动化查询存储代码