前四篇回顾请戳下面链接:
Python爬虫(01): 零基础十分钟上手
Python爬虫(02): 伪装浏览器爬取Boss直聘网页数据
Python爬虫(03): 二级网页
Python爬虫(04): JS动态生成数据
以前在简书发了一些文章,涉及的分类特别杂乱,有TensorFlow的,有Web开发的,还有一些小学生编程教程和绘图设计教程...最近又在做人工智能通识专题和智能决策系列教程的文章。
这些天很多简友关注我,但我很迷茫,并不知道哪些文章最受大家重视,对大家更有用些,而简书也没有这方面的统计功能开放给作者们使用。
我就想能不能自己把这些变化数据抓取下来,自己分析一下,于是就开动写这个案例教程了。
这个教程推荐使用Chrome浏览器和Jupyter Notebook编辑器。Notebook的安装请参照Anaconda使用说明
1. 有哪些数据可以获取?
从自己的文章列表页面可以看到总体【关注数】和每篇文章的【观看数】都是直接获取的,我们只要汇总每天哪些文章观看数增加了,再对比粉丝数的变化,就能知道哪些文章引发的关注最多。
因为目测我的文章每天总阅读量的增加数,和每天粉丝的增加数相差不太大,也就是说,大部分阅读都引发了被关注,所以两者之间是强关联的。
如果不是这样,比如每天增加阅读1万,粉丝增加100,那就不好说了,因为可能A文章被观看100次都引发了被关注,而B文章被观看了9000次却没有引发一个被关注,那么就没办法从单个文章阅读量上分析粉丝变化,也就猜不出哪些文章更受喜欢。
2. 爬虫数据是在html里还是在动态json请求里?
首先我们要知道页面上这些数据是怎么来的,是直接html标签显示的?还是通过JavaScript动态填充的?请参阅系列教程的前4节。
我们的套路:
右键【显示网页源代码】,打开的就是浏览器地址栏里面的地址请求直接从服务器拉取到的html数据,如果这里可以Ctrl+F搜索到需要的数据(比如可以搜到“人工智能通识-AI发展简史-讲义全篇”),那么用最简单的html数据提取就可以。
如果上面一个办法搜不到,那就右键【检查元素】,然后查看Network面板里面type为xhr的请求,点击每一个,看哪个Response里面可以Ctrl+F搜到我们需要的数据。(很多时候可以从请求的英文名字里面猜个八九不离十)
在这个案例里,我们需要的数据看上去就在网页源代码里面,暂且是这样。
3. 怎么用header和params模拟浏览器?
为了不让网站的服务器知道我们是爬虫,就还要像浏览器一样发送附加的额外信息,就是header和params。
我们右键【检查】,然后切换到【Network】网络面板,然后刷新网页,我们会看到一个和网页地址一致的请求。 如下图,我的主页地址是https://www.jianshu.com/u/ae784c57b353,就看到Network最顶上的是ae784c57b353:
如果我们切换到请求的Response响应结果面板,就可以看到这个请求获取的实际就是网页源代码。它的type类型是document,也就是html文档。
就是它了,我们需要它的header头信息和params参数。 【右击-Copy-Copy Request Headers】就能复制到这个请求的头信息了。
但是,如果你留意,就会发现这个请求的Response结果(也就是网页源代码)并不是包含所有文章,而只是只包含了9个文章。但是如果我们用鼠标往下滚动页面,发现文章就会越来越多的自动添加进来。(右侧的滚动条越变越短)
我们刷新页面重置,然后清空Network网络面板,一点点轻轻往下滚动,直到列表里出现了一个xhr请求:
点击这个请求,可以在Headers里看到它的Parameters参数,其实就是请求名称的问号后面的部分:
order_by
是排序, page
是第几页。所以不是简书文章列表不分页,默认加载的是 page=1
,而当你往下滚动的时候自动添加下一页的内容 page=2,page=3...
。
我们查看它的Response也会发现,它所得到的内容和我们上面的网页源代码格式是一致的:
4. 设定参数
打开Jupyter Notebook,在第一个cell单元编写代码,设定相关参数(headers字段涉及到个人隐私已经被我简化了,你须要在浏览器里面复制自己的):
url = 'https://www.jianshu.com/u/ae784c57b353'
params = {
'order_by': 'shared_at', 'page': '1'}
headers = '''
GET /u/ae784c57b353 HTTP/1.1
Host: www.jianshu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7
Cookie: read_mode=day; default_font=font2; locale=zh-CN;....5b9fb068=1538705012
If-None