需求
- 希望得到大量(几乎全部)符合一定搜索条件的推文
现状
- 推特自身的API限制诸多,免费API每次请求只能得到100条,只能得到最近7天的推文。付费API虽然能检索full archive,但时间窗口被限定为30天,即只能检索过去所有推文中任意一个30天窗口内的推文…
思路
- 模拟浏览器向推特搜索网页发送GET请求。
- 在显示结果的网页中,模拟浏览器不断下拉网页加载新的推文,直至无法加载更多。
- 获取此时网页的源码,定位并解析出推文内容已经其他相关感兴趣信息。
讨论
为何要模拟浏览器而不是直接用相关库(比如requests)发起请求?
- requests库直接发起请求会被推特识别为爬虫,无法返回包含推文的搜索结果页面。(解决方法:可以先用Chrome浏览器发起请求,然后查看请求的headers,并将其设置为requests的GET方法的headers参数)
- requests库无法模拟浏览器的下拉操作,而搜索结果界面一次只显示20条推文。
为何不使用官方api,或者是对官方api进行封装的工具(比如twarc)?
官方搜索api限制诸多,且免费版只能搜索七天内的推文,数据量太小,无法满足需求。该方法的优缺点?
- 优点:思路直观,实现简单
- 缺点:selenium慢,占用资源多。
用到的工具
语言
Python 3.6+
包
- selenium
- 调用浏览器发起请求,并执行js脚本下拉加载网页
- 加载完成后保存源码
- lxml
- 利用xpath解析源码,定位到推文部分
- beautifulsoup
- 解析推文部分网页源码,提取出推文及其他信息。
关键代码
发起请求 & 下拉网页
1 | from selenium import webdriver |
定位内容 & 解析网页
1 | from lxml import etree |