动态页面爬取
好久没有写爬虫了,今天敲了一份爬虫出来——爬取百度百科的历史记录,结果在时隔四个月之后再次遇到的对手居然是一个动态页面(一开始把百度想的太简单了),不过在一番努力之后还是达到了我的目标,然后就当复习似的写了篇博客。
一、概念
动态页面其实是相对于静态页面而言的。在面对静态页面的时候直接查看response一般就是网页的全部代码了,但是动态页面不然,一般动态页面的response再打开的时候和你在网页看的不一样了。
二、实践及实践之前
因为本人超喜欢实践,所以二话不说进行上实践,实践出真知,多实践就懂了。
目标网页:万科百度百科历史版本
实现环境:win32
version : python 3.6.2
实践目标:获取万科百度百科历史版本的历史修改时间,做成图表或者csv文件
三、流程阐述
和所有的爬虫一样,我们第一步会进行网页的分析,因为我们目标选取了一个动态网页,所以我们还需要对json文件等进行追踪。
流程:
1、网页分析
2、查询、追踪json等文件或者xhr
3、进行文本匹配
4、画图或者制作csv
四、工具准备
我们所需要的库有(都是最新版):
1.requests
2.re
(以下的库不是爬虫必须的,但是是我这次所需要)
3.matplotlib(进行可视化)
4.datetime(对时间进行操作)
5.Pandas(python强大的数据处理库)
6.os(对系统进行操作)
(本人更偏爱原始的re库,当然这里使用正则表达式已经能够解决所有问题了)
所需了解的知识:
1.python语法基础
2.正则表达式的匹配规则
(以下非爬虫必要)
3.datetime一些基本功能
4.matplotlib可视化的操纵(虽然此项为非爬虫必要,但是很多时候数据可视化出来会让数据更为直观,让人更容易做出判断)
5.pandas库的基本使用(此项为非爬虫必要,但是为数据分析必学)
五、网页分析
首先我们打开我们的目标网页→万科百度百科历史版本。
看上去一切正常,然后我们查看url,也有之前所讲的规律,但是真的一切正常了吗?
如果你把这个网页当作静态页面来做那肯定完蛋了,因为我一开始就是这么做的,当你查询第一页的代码时候你会发现一切正常,然而在你查询第二页的代码的时候,你会发现一个事实就是——你所看到的第二页甚至直到最后一页的最后代码都是相同的,有没有觉得违背了常识?
六、追踪
其实不然,这是很正常的事情,很多页面都会做成动态的,使用json或其他等文件来传输数据(不尽准确,也可能是用java、JavaScript等代码调用端口等等),这样子更安全些。
到了这一步很多人都会选择使用fiddle等第三方软件来抓包这样子方便点,但是这里笔者比较难,直接在控制者平台上看就好了。
在一番查找之后我们锁定了我们需要的几个文件和xhr文件。
很多网页的数据会藏在json里面,莫非这个也是?当然,查看之后就失败了,那么我们看到xhr里面,发现这个很熟悉的字段(当然可能是我比较熟悉)
明显的答案在此了,简单解读一下这条
get historylist , 获得历史数据
tk 这个东西我猜是万科的quantio语句(不知道这个单词有没有拼错,实在是自己用的少,搞前后端的朋友可能认识)
lemmald 这不就是万科在百度里面的号码嘛
from 一眼就看出是第七页
size 显示25条消息
这个发现非常的棒,解决了许多问题。
七、伪装
作为玩爬虫的人,了解反爬虫的套路是非常必要的,在这里如果你对xhr进行正常的爬虫你会发现,返回给你的是{error:xxxxx},这个时候就要警觉了,这证明你机器人的身份被百度识破了,它拒绝把数据给你,那么我们就需要进行一些简单伪装。之前讲过更改headers头,这次讲多一些。
1.headers伪装,服务器使用这个判断你使用的浏览器,当有这个的时候,服务器会认为是浏览器正常的请求。
2.Referer:浏览器通过此来判断你从哪一个网页跳转过来。
3.ip伪装,这个只要构建好ip池就没有问题了,推荐去西刺代理查看一些所需
4.Cookie伪装,cookie是服务器用来辨别你此时的状态的,比如你已经登录啊,什么的,每一次向服务器请求cookie都会随之更新。
最常用的就是上面几个了,上面从上到下越来越难整,在此面对百度,仅仅只是改变headers显然是不行的,于是我添加了Referer和cookie码(关键是两个月前建立的IP池已经废掉了,懒得整)。
好,做到这里我们发现我们可以正常的获得数据了。
八、文本匹配
不得不说,解决上面的问题之后,文本匹配成为了最为简单的事情了。
其实这是一个类似词典的格式了,但是懒得思考的笔者,决定使用简单粗暴的正则表达式。
九、转化时间戳
这个时候我们会发现,再creattime那里给的时间是个什么鬼?
但是仔细一思考你会发现这是一个时间戳
python的时间戳:从1970年1月1日上午12:00到现在的秒数
是不是很崩溃?
不过还好决解这个问题只需要几段简短的代码
输入时间戳,好了,问题解决了。
十、画图、做csv
图
csv
十一、总结和代码
感觉这次爬虫还行,时隔两个多月我还能想起来实属不易