一. 基本信息
如何获取登录窗口背后的信息,我们目前示例中的网络爬虫与大多数网站服务器进行数据交互时,都是用HTTP协议的GET方法去请求信息,这边我们将使用POST方法,把信息推送给网络服务器进行存储和分析。
页面表单基本上就可以看成是一种用户提交POST请求的方式,且这种请求方式是服务器能够理解和使用的。就像网站的URL链接可以帮助用户发送GET请求一样,HTML表单可以帮助用户发出POST请求。当然,我们也可以使用一点代码来创建这些请求,然后通过网络爬虫把它们提交给服务器。
Requests库就是这样一个擅长处理那些复杂HTTP请求、cookie、header(响应头和请求头)等内容的Python第三方库。
二.实现表单提交
大多数网页表单都是由一些HTML字段、一个提交按钮、一个在表单处理完之后跳转的“执行结果”(表单action的值)页面构成,虽然这些HTML字段通常由文字内容构成,但是也可以实现文件上传或其他非文字内容。
因为大多数主流网站都会在它们的robots.txt文件里注明禁止爬虫接入登录表单,所以为了安全起见,pythonscraping网站里放入了一个一组不同类型的表单和登录内容,这样可以进行爬虫采集了,最简单的表单位于http://pythonscraping.com/pages/files/form.html,表单内容如下:
<h2>Tell me your name!</h2>
<form method="post" action="processing.php">
First name: <input type="text" name="firstname"><br>
Last name: <input type="text" name="lastname"><br>
<input type="submit" value="Submit" id="submit">
</form>
需要注意一下,首先,两个输入字段firstname和lastname,这一点非常重要,字段的名称决定了表单被确认后要传送到服务器上的变量名称。如果你想要模拟表单提交数据的行为,你就需要保证那你的变量名称与字段名称是一一对应的。
表单任何POST请求都发生在这个页面上,并非表单本身所在的页面。切记:HTML表单的目的,只是帮助网站的访问者发送格式合理的请求,向服务器请求没有出现的页面。除非你要对请求的设计样式进行研究,否则不需要花太多时间在表单所在的页面上。
用Requests库提交表单,只用四行代码就可以实现,包括导入库文件和打印内容的语句:
import requests
params={'firstname':'Peter','lastname':'Wang'}
r=requests.request('POST',"http://pythonscraping.com/pages/files/processing.php",data=params)
print(r.text)
表单提交之后,程序返回执行页面的源代码,包括这行内容:
此处,需要注意的是,脚本取名字不能叫request.py,不能与库同名,否者会一直报错,报找不到模块。