3.2 抓取并解析JSON数据
3.2.1 利用Fiddler找出所抓取的网址
大数据系统通常都是从数据获取开始的。本章将模拟从新闻站点(http://站点IP地址:8081/site2.com/)抓取数据。用户在检索页面上输入“数据”二字,点击搜索按钮,搜索结果随即出现在下方,用户并没有感觉到页面有任何刷新或提交动作。这时,点击鼠标右键,在源码中也没有找到<form>标签。由此判断页面使用了Ajax方式获取数据。
Ajax属于客户端技术,通过JavaScript语法实现。查看页面源码,在其JavaScript代码中并没有找到所提交的URL(Uniform Resource Locator)地址。可以使用网络流量监控软件来辅助查找。读者可以下载、安装Fiddler软件,打开后的界面如图3-1所示。
图3-1 Fiddler软件界面
Fiddler软件打开后默认会监控本机的网络访问状态,可以使用F12键暂停/开启该功能。用户在浏览器中点击模拟站点页面中的搜索按钮后,在Fiddler监控窗口中就可以看到一条访问日志,如图3-2所示。
图3-2 Fiddler访问日志监控界面
监控窗口每一列的含义如下:
URL一栏中显示了请求数据的真实地址 /site2.com/search_content/,该地址返回的内容是JSON(JavaScript Object Notation)对象,可以在Fiddler右侧的Inspectors面板中查看,如图3-3所示。
图3-3 Inspectors面板
检索URL通常都要附带很多参数,这些内容也可以在Inspectors面板的WebForms选项卡中找到,如图3-4所示。Body部分有一个参数,名字叫作keyword,其值为“数据”。参数提交方式分为两种:GET方式和POST方式。其中,采用GET方式提交的所有参数都在QueryString列表中显示,采用POST方式提交的所有参数都在Body列表中显示。
网络爬虫要抓取数据,首先要解决的就是“抓什么”的问题,即我要抓哪个网址。很多网站均采用Ajax方式局部刷新来获取数据。通过浏览器的地址栏看不到URL的变化,这时就要考虑使用HTTP抓包工具来查看。如果要抓取手机或其他移动设备上运行的App中的数据,也必须借助抓包工具。此外,如果是在PC端访问网页,则可以通过Chrome浏览器的DevTools→Network面板来分析数据。
图3-4 Inspectors面板的WebForms选项卡
3.2.2 解析JSON对象
检索URL附带的参数一般包括关键字、开始页码、结束页码等,而本处演示程序只有第一个参数。读者在抓取其他网站的页面时,要注意正确计算出开始页码、结束页码,这样才能完整地获取数据。在前述Fiddler中获得了JSON格式的数据,下面在Python中就要实现解析数据。
Python抓取代码片段如下:
从第2行代码开始,依次使用我们设定好的4个不同关键字去请求检索URL,第4行代码在get方法中设定了verify参数。如果所检索的URL网址是以https开头(HTTPS是包含SSL认证的HTTP协议)的,verify=False就是告诉requests不要为HTTPS请求认证SSL证书。如果爬虫的request对象在访问某个网站时,网站服务器要求request对象附带证书,就可以在verify属性中指定证书存放的路径。requests在使用HTTPS方式请求网址时就会开启认证。
第6行代码指的是,使用Python的JSON模块把获取的text字符串转换为JSON对象,其等价写法是jObj = r.json()。由于检索结果页面只包含了每个新闻的链接地址,因此,JSON对象中只需要提取item_id的值即可。第11行代码会根据页面的ID再去抓取新闻详情页面的内容。
第12行代码指的是,在抓取一页完成后,程序会休眠10秒,以免其访问频次太高而被服务器封掉。
Python中和JSON对象有关的方法主要有json.loads()和json.dumps(),其详细语法可以参考“菜鸟教程”网站。