0x00

如果你对于爬虫,只具有简单的兴趣,那么前两篇文章可能已经足够。

但是,真正能够被投入应用的爬虫,是不能如此简单的。不是所有的网站,都只会站在那里等着你爬。一些网站中含有许多构造精巧的机关,它们使得你不能动作自如。

比如,同样的域下,一些页面可以自如浏览,而另一些却只能再登录之后浏览。因此,模拟成为一项必要的技术。

但是我在进行模拟登录的时候,却屡次遭遇400状态码,这代表请求格式出现错误。花了很长时间,终于解决问题。因此,将这个问题的来龙去脉记录下来是很有必要的。但在那之前,还是要先介绍一下模拟登录的具体步骤。

0x01 注意请求头

有的时候我会想,是否网络上写文章的dalao们实力都太强,以至于从来不会踩跟我一样的坑。

比如这次,当我上网查阅有关于爬虫模拟登陆的文章时,几乎所有的作者,在请求头部分,要么略过不写,要么简单地写一句要伪装得像是浏览器一样

这当然是人人都明白的道理了。只不过对于像我这样的新手,有时真的是理解不能。

什么时候可以用请求方法自带的头,而什么时候需要自定义头,这当然是需要分开讨论的。

让我们来看一下HTTP request header的常见参数:

Accept: 指定客户端能够接收的内容类型 Accept: text/plain, text/html

Accept-Encoding: 指定浏览器可以支持的web服务器返回内容压缩编码类型。 Accept-Encoding: compress, gzip

Connection: 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Connection: close

Cookie: HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。 Cookie: $Version=1; Skin=new;

Content-Type: 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded

Referer: 先前网页的地址,当前请求网页紧随其后,即来路 Referer: http://www.xxx.com/archives/xx.html

User-Agent: User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)

在发送登录请求之前,最好通过抓包工具观察一下浏览器发出的请求头是怎样的。然后将头简单删减一下重新发出,观察哪些参数是必需的,将那些不必需的参数舍弃即可。

一般情况下,Accept Cookie User-Agent是有必要保留的,其他均可酌情处理。 这里强调一下Content-Type参数,该参数定义的是请求网络文件的MIME类型,由于文件在爬虫的处理下可能会出现一些不符常理的情况,因此该参数非常不建议保留。

另外,有些服务器端脚本可能会额外验证Referer参数,用以验证你提交表单的页面是否合法。如果你在提交时将这个参数置空,可能会被ban。

在爬取条件不是那么苛刻的情况下,还是建议只使用各大框架request方法的默认头。

但在一些情况下,是必须使用自定义头的。例如,当网站加入类似于CSRF-token这种参数来防止scrf时,可能便需要额外爬取页面上某处生成该token的元素。

0x02 注意post参数

你的post表单中,真的只有用户名与密码这两项吗?刚刚截的包不要就这么扔掉了,要看清楚除了最重要的两项外,是否还有其他的hidden项。据我所知,一些网站为防止越权行为,一般会在登录界面加入一个随机字符串。例如各位dalao最爱爬的知乎,登录界面就有这样的一项。

然而这种字符串一般都是由js生成,并直接显示在一个hiddeninput元素里的。只是这种程度,根本无法阻止爬虫。只要将该字符串解析出来,填入自己构造的表单种即可。 只不过,有些登录机制比较复杂的网站,可能会具有多重验证字符串。如果其变量名再难懂一些,就成为了一个很棘手的问题。对此我也正处在研究阶段,等我有了一些成果之后,再发文章进行阐述。

0x03 待续

将来还会把遇到的问题继续写在这里。