当前位置: 首页 > 后端技术 > Python

爬虫系列:通过网页表单和登录窗口采集

时间:2023-03-26 18:40:01 Python

上一期我们讲解了数据标准化的内容。首先,我们对单词的出现频率进行排序,然后将一些大小写字母进行转换,以减少2-gram序列的重复。.当我们真正踏入网络数据采集的基础时,遇到的第一个问题可能是:“如何获取登录窗口后面的信息?”如今,网络正朝着页面交互、社交媒体、用户生成内容的趋势不断演变。表单和登录窗口是许多网站不可或缺的一部分。不过,这些内容还是比较容易处理的。至此,在前面的例子中,网络爬虫在与大多数网站的服务器进行交互时,都是使用HTTP协议的GET方法来请求信息的。在本文中,我们重点介绍POST方法,该方法将信息推送到Web服务器以供存储和分析。一个页面表单基本上可以看作是用户提交POST请求的一种方式,但是这种请求方式是可以被服务器理解和使用的。就像网站的URL连接如何帮助用户发出GET请求一样,HTML表单帮助用户发出POST请求。当然,我们也可以稍微麻点自己创建这些请求,然后通过网络爬虫提交给服务器。PythonRequests库可以用Python标准库来控制Web表单,但有时一点点语法糖可以让生活变得更甜蜜。但是当你想要做的不仅仅是urllib可以做的基本GET请求时,你可以看看Python标准库之外的第三方库。Requests库就是这样一个Python第三方库,擅长处理复杂的HTTP请求、cookies、headers(响应头和请求头)等,下面是Requests的创始人KennethRetiz对Python标准的看法库工具:Python标准库urllib2为您提供了大部分HTTP功能,但它的API非常差。这是因为它是经过多年逐步建立起来的,不同的时期要面对不同的网络环境。所以为了完成最简单的任务,他需要花费大量的工作(甚至是写出整个方法)。

事情不应该这么复杂,更不用说在Python中了。与任何第三方Python库一样,Requests库也可以使用其他第三方Python库管理器(例如pip)或直接下载Requests库源代码来安装。提交基本表单大多数Web表单由一些HTML字段、一个提交按钮和一个“执行结果”(表单操作的值)页面组成,该页面在处理完表单后重定向。虽然这些HTML字段通常由文本内容组成,但也可以实现文件上传或其他非文本内容。由于大多数主流网站都会在其robots.txt文件中注明不允许爬虫访问登录表单,相关介绍可参考这篇文章:爬虫系列:爬虫带来的道德风险与法律责任。例如下面是一个表单的源码:username

密码
这里有几点需要注意:首先,两个输入域的名称分别是username和passwd,这一点很重要。字段名称决定了表单确认后发送到服务器的变量名称。如果你想模拟在表单中提交数据的行为,你需要确保你的变量名与字段名一一对应。它还要求表单的真实行为实际发生在index.php?c=session&a=login中。对表单的任何POST请求实际上都发生在这个页面上,而不是表单本身所在的页面。请记住:HTML表单的目的只是为了帮助网站访问者向服务器发送格式良好的请求以获取未出现的页面。除非你正在研究所要求的设计风格,否则不要在表单所在的页面上花费太多时间。使用Requests库提交表单只需要几行代码,包括导入库文件和打印内容的语句:importrequestsparams={'username':'admin','passwd':'5e_KR&pXJ9=J(c7d9P-twt9:'}r=requests.post("http://www.test.com/admin/index.php?c=session&a=login",data=params)print(r.text)表单提交后,程序会返回执行页面的源码,如下:<bodybgcolor='#FFFFFF'text='#000000'>你哥wser不支持框架!</body>作者:因为我们是通过Requests提交内容,并没有在浏览器中提交,所以会出现上面的提示。但是,当我们登录成功,后面需要使用浏览器采集内容时,我们会详细说明这部分内容。这里和那里的代码可以处理许多简单的形式。下面是一个邮件订阅的表格代码,如下:营销电子邮件地址虽然第一次看到有点吓人,但是在大多数情况下,我们只需要注意两件事:你要提交的数据字段的名字,比如上面的email表单的action属性,也就是提交表单后网站会显示的页面单选按钮、复选按钮等输入显然,并不是所有的页面都只是一堆文本域和一个提交按钮里面有大量可用的表单域HTML标准:radiobuttons,checkbuttons,dropdownoptions等。在HTML5中,还有scrollbar(rangeinputfield),mailbox,date等控件。自定义Javascriptfields可谓无所不能,可以实现颜色选择器(colorpickers))、日历,以及开发者能想到的任何其他功能。无论表单的字段看起来多么复杂,仍然只有两件事需要关心:字段名称和值。在源码中查找name属性即可轻松获取字段名称。字段值有时比较复杂,可能在表单提交前由Javascript生成。颜色选择器是一个奇怪的表单字段,他可能使用#f5c26b这样的值。如果您不确定输入字段值的数据格式,可以使用一些工具来跟踪浏览器通过网站发出或接收的GET和POST请求的内容。如前所述,跟踪GET请求的最好和最直接的方法是检查网站的URL链接。如果URL链接如下所示:https://pdf-lib.org/Home/SearchResult?Keyword=zabbix那么请求的表单可能如下所示:下面是一个例子更复杂的表单提交:如果遇到看起来更复杂的POST表单,查看浏览器发送给服务器的参数,最好的简单方法是使用Chrome的检查器或开发者工具。小结由于篇幅原因,今天只讲解基本的表单、单选按钮、复选框等表单输入,以及如何通过Requests提交到服务器。在接下来的文章中,我们将介绍提交文件、图像、处理登录、cookie、HTTP基本访问身份验证以及其他与表单相关的问题。源码已经托管在Github上,地址:https://github.com/sycct/Scrape_1_1.git如有问题,欢迎issue。