【爬虫-反爬虫】系列一:基础之模拟请求(2)

基础之模拟请求(2)

在开发爬虫程序前,你应该知道你需要的数据来自哪儿,以及怎么获取。

为了更快的做到这一点,需要对http请求进行模拟进行验证。

以下是我常用的几种方式,基本上是足够用了。

以南方航空官网为例,假如我想爬南航的机票航班信息,那么我会先用浏览器调试一番。

浏览器调试

用火狐浏览器打开南航官网,先打开调试器【右击页面->查看元素】,再提交如下查询。

接下来会跳转到航班页面。

这个时候航班信息已经出来了,说明刚才肯定有某个请求是负责获取这些航班数据的,我们要找到这个请求。

通过查看所有请求的响应数据,很容易就能找到,这是一个名为query.ao的请求(还有另一个query.ao请求,它获取的是另一类数据)。

响应数据是一个JSON格式的字符串,在火狐中自动显示成对象,能方便展开。

看到这里,你就知道通过这个请求能够获取到对应的航班信息,接下来看看这个请求是什么样的。

这是一个POST类型的HTTP请求,通过【编辑和重发】按钮,你可以修改请求的POST参数再次发送给服务器,这里我们不做任何修改,再次发送同样的请求,你会发现返回的数据是一模一样的。

换句话说,这个请求在任何电脑上执行都会得到相同的结果,不信你可以试试。

浏览器的调试功能还有很多,也有很多插件辅助调试,比如我就习惯在chrome里使用【EditThis Cookie】插件,可以很全面的调试cookie,而且我也习惯在chrome里调试js代码,基本上是火狐和chrome切换着调试,有兴趣的可以多琢磨琢磨。

以上是通过浏览器来模拟请求,既方便也快捷,但如果执行一些非常灵活的调试会比较慢,如参数,cookie,请求头的更改。

Fiddler调试

如果嫌浏览器调试麻烦,我也会用Fiddler来调试。

Fiddler可以当做代理来用,尤其是通过它能捕获到来自手机app的http请求。

也可以直接使用Fiddler模拟请求发送,如下图所示,我把刚才的请求复制到Fiddler中进行模拟发送。

返回的数据如下图所示:

返回的航班数据是一样的,通过Fillder,可以比浏览器更方便的调试请求。

关于Fillder工具的使用方法在网上能找到,这里不再赘述。

以上介绍的是我常用的方式,你也可以使用其它工具来达到类似目的,如Wireshark。

Python模拟

对于爬虫程序,最终目的就是在程序中实现数据请求,这样才能自动化批量获取数据。

这里展示一个最基础的网页数据请求,获取南航官网的html页面源码。

源代码如下:

!/usr/bin/python

import urllib2

def getHtml(url):

page = urllib2.urlopen(url)

html = page.read()

return html

url = "http://www.csair.com/cn/index.shtml"

print getHtml(url)

本节介绍的是最基础的使用方式,目的是为新手搭建一个基础观念以及解决思路。

关于http请求,很多细节需要读者自己摸索,比如http请求头各字段的含义?get请求与post请求的区别?以及urlencode编码与json格式等概念。以上答案都可以在互联网上搜索到。