朋友有个爬数据填表的需求,想让我实现一下,正好Python在爬虫上应用广泛,我也可以藉此练练手。
2020年的第一天,开工。
小目标:每日定时爬取某网页中一个表格中指定数据。
早上,先了解了各种爬虫技术(其实就是第三方库)的差异、优缺点,发现功能上基本类似或者有交集。
其中一篇文章说到Scrapy适用于大项目,Requests使用于小项目,暂时作参考吧,先用着Requests。
在查阅资料过程中,发现Requests库的作者又有个新库——Requests-html。So,决定了,用Requests-html。
做个小demo,先爬个百度,我要爬到搜索键中的“百度一下”四个字。步骤如下:
- 安装Requests-html,pip安装即可。(过程中因为本地之前装了几个Python环境,pip命令无法正常使用。想到以后项目、包、环境都要管理,所以最好开始使用Anaconda,这就是另一个Blog了)
- 上代码,参考
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.baidu.com/')
print(r.html.html)
- print可以看到baidu.com所有的html代码,在Chrome中使用开发者工具(F12)查看到“百度一下”四字嵌套在多层的标签当中,要提取出来就要使用定位元素的技术,这时有一个重要的概念“CSS选择器”,简单理解就是元素嵌套位置的路径。如图:(获取CSS选择器,可以在开发者工具中的element页中,对选中的元素右键选择“Copy”→“Copy selector”)
- 元素的id = su,使用find函数中,CSS选择器的参数填入’#su’,取出attribute为’value’,代码如下
from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.baidu.com/')
searchword = r.html.find('#su', first=True)
print(searchword.attrs['value'])
# 百度一下
至此,小demo完成,输出“百度一下”四字。
回到朋友的需求,以同样的方法,获取到了指定位置的数据。
但是这种方式的缺点也很明显,要爬取数据的CSS选择器要逐个去寻找,不能模糊匹配、模糊查找、向上父级标签遍历。应该有更好的解析HTML方法,以后继续研究(XPATH等)。另外,朋友的需求中,有网页登录账户、爬取滚动刷新信息等技术未完全解决。
贴几个链接
doc:
模拟登录
解析HTML模糊查找、匹配(在后半部分)