网页抓取解密(除了处理网站表单,requests模块还是一个设置请求头的利器)
优采云 发布时间: 2021-12-26 15:16网页抓取解密(除了处理网站表单,requests模块还是一个设置请求头的利器)
除了处理网站表单之外,请求模块也是设置请求头的强大工具。HTTP 请求标头是每次向 Web 服务器发送请求时传递的一组属性和配置信息。HTTP 定义了十多种奇怪的请求头类型,但大多数并不常用。大多数浏览器仅使用以下七个字段来发起所有网络请求(表中的信息是我自己的浏览器数据)。
当经典的 Python 爬虫使用 urllib 标准库时,它会发送以下请求头:
如果你是一个防范爬虫的站长,你会允许哪个请求头访问你的网站?
安装请求
您可以在模块的网站上找到下载链接 () 和安装方法,或者使用任何第三方 Python 模块安装程序进行安装。
可以通过 requests 模块自定义请求头。网站是一个很棒的网站,它允许服务器测试浏览器的属性。我们使用以下程序采集
本网站上的信息并验证我们浏览器的 cookie 设置:
程序输出中的请求头应与程序中设置的头相同。
尽管网站可能会对 HTTP 请求标头的每个属性进行“人性化”检查,但我发现通常真正重要的参数是 User-Agent。不管你在做什么项目,一定要记得把User-Agent属性设置成不容易引起怀疑的东西,不要使用Python-urllib/3.4。另外,如果你正在处理一个非常警惕的网站,你应该注意那些经常使用但很少检查的请求头,比如Accept-Language属性。也许这是该网站判断您是个人访问者的关键。
请求头会改变你查看网络世界的方式
假设您想为机器学习研究项目编写语言翻译器,但您没有大量翻译文本来测试其效果。许多大型网站对相同的内容提供不同的语言翻译,根据请求头的参数响应网站的不同语言版本。因此,您可以简单地将请求头属性从 Accept-Language:en-US 修改为 Accept-Language:fr,就可以从网站获取“Bonjour”(法语,你好)的数据,提高翻译效果翻译(大型跨国公司通常是很好的采集
对象)。
请求头还可以让网站改变内容的布局风格。例如,当使用移动设备浏览网站时,您通常会看到网站的简化版,没有广告、Flash 和其他干扰因素。所以把你的请求头User-Agent改成下面这样,就可以看到一个更容易采集
的网站了!
User-Agent:Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) App leWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 手机/11D257 Safari/9537.53
2.设置cookies的知识
虽然 cookie 是一把双刃剑,但正确处理 cookie 可以避免很多采集
问题。该网站将使用 cookie 来跟踪您的访问。如果发现异常爬虫行为,您的访问将被中断,例如非常快速地填写表格或浏览大量页面。虽然这些行为可以通过关闭和重新连接或更改 IP 地址来伪装,但如果 cookie 暴露了您的身份,则不会浪费任何努力。
采集
某些网站时,Cookie 是必不可少的。要持续登录网站,您需要在多个页面上保存 cookie。有些网站不需要每次登录都需要一个新的cookie,只要保存一个旧的“登录”cookie,就可以访问。
如果您正在采集
一个或多个目标网站,建议您检查这些网站生成的cookies,然后再考虑爬虫需要处理哪些cookies。有一些浏览器插件可以显示当您访问网站和离开网站时 cookie 是如何设置的。EditThisCookie() 是我最喜欢的 Chrome 浏览器插件之一。
由于请求模块无法执行 JavaScript,因此无法处理许多新的跟踪软件(例如 Google Analytics)生成的 cookie。cookie 仅在客户端脚本执行后设置(或根据用户浏览页面时的 web 事件生成 cookie,例如单击按钮。)。要处理这些操作,您需要使用 Selenium 和 PhantomJS 包。
硒和 PhantomJS
Selenium() 是一个强大的网络数据采集
工具,最初是为自动化网站测试而开发的。近年来,它也被广泛用于获取准确的网站快照,因为它们可以直接在浏览器上运行。Selenium 可以让浏览器自动加载页面,获取所需的数据,甚至可以对页面进行截图,或者判断网站上是否发生了某些操作。
Selenium 本身没有浏览器,需要配合第三方浏览器使用。比如你在Firefox上运行Selenium,可以直接看到Firefox窗口打开,进入网站,然后执行你在代码中设置的动作。虽然这样可以看得更清楚,但我更喜欢让程序在后台运行,所以我使用 PhantomJS() 而不是真正的浏览器。
PhantomJS 是一个“无头”浏览器。它会将网站加载到内存中并在页面上执行 JavaScript,但不会向用户显示页面的图形界面。结合 Selenium 和 PhantomJS,您可以运行一个非常强大的网络爬虫,它可以处理 cookie、JavaScript、标题以及您需要做的任何事情。
您可以从 PyPI 网站 () 下载 Selenium 库,也可以使用第三方管理器(如 pip)在命令行上安装它。
您可以在任何网站(在本例中)调用 webdriver 的 get_cookie() 方法来查看 cookie:
点击查看大图
这样就可以得到一个非常典型的谷歌分析cookie列表:
点击查看大图
您还可以调用 delete_cookie()、add_cookie() 和 delete_all_cookies() 方法来处理 cookie。此外,可以保存 cookie 以供其他网络爬虫使用。以下示例演示了如何组合这些功能:
点击查看大图
在这个例子中,第一个 webdriver 获取一个网站,打印 cookie 并将它们保存在变量 savedCookies 中。第二个webdriver加载同一个网站(技术提示:网站必须先加载,这样Selenium才能知道cookie属于哪个网站,即使加载网站的行为对我们没有用),删除所有cookie,并将其替换为第一个 webdriver 获取的 cookie。再次加载页面时,两组cookies的时间戳、源码等信息应该完全一致。从 Google Analytics 的角度来看,第二个 webdriver 现在与第一个 webdriver 完全相同。
3.正常时间访问路径
有一些受到良好保护的网站可能会阻止您快速提交表单或与网站交互。即使没有这些安全措施,以比普通人快得多的速度从网站下载大量信息也可能导致自己无法访问该网站。
因此,虽然多线程程序可能是一种很好的方式来加载页面——在一个线程中快速处理数据并在另一个线程中加载页面——但这对于一个编写良好的爬虫来说是一个可怕的策略。仍然应该尽量确保页面加载一次并且数据请求被最小化。如果可能,尽量增加每次页面访问的时间间隔,即使要添加一行代码:
time.sleep(3)
(小编:3+随机数比较好?)
合理的速度控制是你不应该打破的规则。过度消耗别人的服务器资源会让你处于非法状态,更严重的是,这样做可能会导致小网站宕机甚至下线。关闭网站是*敏*感*词*的,这是一个彻头彻尾的错误。所以请控制好采集
速度!
解密常见表单反爬虫安全措施
许多像 Litmus 这样的测试工具已经使用了很多年,并且仍然用于区分网络爬虫和使用浏览器的人类访问者。这些方法都取得了不同程度的效果。尽管网络机器人下载一些公共文章和博客文章并不是什么大问题,但如果网络机器人在您的网站上创建了数千个帐户并开始向所有用户发送垃圾邮件,那就是一个大问题。如果网页表单,特别是用于创建和登录的表单被机器人滥用,网站的安全和流量成本将面临严重威胁。因此,尝试限制网站访问是许多网站所有者的最大利益。(至少他们是这么认为的)。
这些针对表单和登录链接的反机器人安全措施,确实是对网络爬虫的严峻挑战。
4.注意隐含的输入字段值
在 HTML 表单中,“隐藏”字段可以使该字段的值对浏览器可见,但对用户不可见(除非您查看网页的源代码)。随着越来越多的网站开始使用 cookie 来存储状态变量来管理用户状态,隐藏字段主要用于防止爬虫自动提交表单,直到找到另一个最佳用途。
下图中的示例是 Facebook 登录页面上的隐藏字段。尽管表单中只有三个可见字段(用户名、密码和确认按钮),但源代码中的表单向服务器发送了大量信息。
Facebook 登录页面上的隐藏字段
有两种主要方法可以防止使用隐藏字段采集
网络数据。第一个是表单页面上的字段可以由服务器生成的随机变量表示。如果提交时该值不在表单处理页面上,则服务器有理由认为该提交不是从原创
表单页面提交,而是由网络机器人直接提交到表单处理页面。规避这个问题最好的办法是先采集
表单所在页面产生的随机变量,然后提交到表单处理页面。
第二种方式是“蜜罐”(honey pot)。如果表单中收录
一个隐藏字段的常用名称(设置蜜罐陷阱),例如“用户名”或“电子邮件地址”,设计不好的网络机器人通常不会关心这个字段是否对用户可见,直接填写此字段并提交给服务器,服务器将被服务器的蜜罐困住。服务器会忽略所有隐藏字段的真实值(或与表单提交页面默认值不同的值),填写隐藏字段的用户也可能被网站屏蔽。
总之,有时候需要检查一下表单所在的页面,看看有没有服务器预设的隐藏字段(蜜罐陷阱)有遗漏或错误。如果您看到一些隐藏字段,通常带有大的随机字符串变量,那么 Web 服务器很可能会在提交表单时检查它们。此外,还有其他检查可以确保这些当前生成的表单变量只使用一次或最近生成的(这可以防止变量简单地存储在程序中以供重复使用)。
5.爬虫通常如何避免蜜罐
虽然在网络数据采集
过程中通过CSS属性很容易区分有用信息和无用信息(例如通过读取id和class标签来获取信息),但这有时会导致问题。如果web表单的某个字段通过CSS设置为对用户不可见,那么可以认为普通用户在访问网站时无法填写该字段,因为它不会显示在浏览器中。如果填写此字段,则可能是由机器人完成的,因此此提交将无效。
这种方法不仅可以应用于网页表单,还可以应用于链接、图片、文件以及任何机器人可以读取但普通用户在浏览器中看不到的内容。如果访问者访问了网站上的“隐性”内容,将触发服务器脚本封锁用户的IP地址、将用户踢出网站或采取其他措施禁止用户访问网站。事实上,很多商业模式都在做这些事情。
下面例子中使用的网页是in。这个页面收录
两个链接,一个是CSS隐含的,另一个是可见的。此外,该页面还收录
两个隐藏字段:
点击查看大图
这三个元素以三种不同的方式对用户隐藏:
因为 Selenium 可以获取被访问页面的内容,所以可以区分页面上的可见元素和隐藏元素。您可以通过 is_displayed() 确定该元素在页面上是否可见。
比如下面的代码示例就是获取上一页的内容,然后找到隐式链接和隐式输入字段:
点击查看大图
Selenium 抓取了每一个隐含的链接和字段,结果如下:
点击查看大图
虽然你不太可能访问你找到的隐藏链接,但在提交之前,请记住确认表单中已经存在并准备提交的隐藏字段的值(或让Selenium自动为你提交)。
使用远程服务器避免 IP 阻塞
启用远程平台的人通常有两个目标:需要更强的计算能力和灵活性,以及需要可变 IP 地址。
6. 使用可变远程 IP 地址
构建网络爬虫的第一个原则是:所有信息都可以伪造。您可以从非个人邮箱发送电子邮件,通过命令行自动执行鼠标操作,也可以使用 IE 5.0 浏览器消耗网站流量来吓唬站长。
但是有一件事是无法伪造的,那就是您的 IP 地址。任何人都可以通过以下地址给您写信:“1600 Pennsylvania Avenue Northwest, Washington, DC, US President, Zip Code 20500。” 但是,如果这封信来自新墨西哥州的阿尔伯克基,那么您必须确定写信给您的不是美国总统。
从技术上讲,可以通过发送数据包来伪装IP地址,这就是分布式拒绝服务(DDoS)攻击技术。攻击者不需要关心接收到的数据包(这样可以发送请求。使用假IP地址)。但是网络数据采集是一种需要关注服务器响应的行为,所以我们认为IP地址是不可伪造的。
阻止网站被采集
的注意力主要集中在识别人类和机器人之间的行为差异。封杀IP地址的杀伤力就像农民不喷农药杀虫在庄稼上,而是直接用火彻底解决问题。这是最后一步,但它是一种非常有效的方法,只要您忽略从危险IP地址发送的数据包即可。但是,使用这种方法会遇到以下问题。
尽管存在这些缺点,但阻止 IP 地址仍然是服务器管理员用来防止可疑网络爬虫入侵服务器的一种非常常用的方法。
Tor代理服务器
洋葱路由器(The Onion Router)网络,通常缩写为 Tor,是一种匿名化 IP 地址的手段。网络志愿者服务器构建的洋葱路由器网络通过不同的服务器形成多层(就像洋葱一样),将客户端包裹在最里面。数据在进入网络之前被加密,因此没有服务器可以窃取通信数据。另外,虽然可以查看每个服务器的入站和出站通信,但是如果要查明通信的真正开始和结束,就必须知道整个通信链路上所有服务器的入站和出站通信明细。这基本上是不可能的。
Tor匿名的局限性
虽然本文使用Tor的目的是为了改变IP地址,而不是实现完全匿名,但还是需要注意Tor的匿名方式的能力和不足。
尽管 Tor 网络允许您在访问无法追踪到您的网站时显示 IP 地址,但您在网站上留给服务器的任何信息都会暴露您的身份。例如,如果您登录 Gmail 帐户,然后在 Google 上进行搜索,那么这些搜索历史记录将与您的身份相关联。
此外,登录 Tor 的行为也可能使您的匿名性处于危险之中。2013年12月,一位哈佛大学本科生为了逃避期末考试,于是使用匿名邮箱通过Tor网络向学校发送*敏*感*词*威胁信。结果,哈佛大学IT部门通过日志发现,在发送*敏*感*词*威胁信时,Tor网络流量仅来自一台机器,并且是该校一名学生注册的。虽然他们无法确定流量的原创
来源(只知道它是通过Tor发送的),但*敏*感*词*时间和注册信息有充分证据,并且在该时间段内只有一台机器登录。这是起诉学生的一个很好的理由。
登录 Tor 网络不是自动匿名措施,也不允许您进入 Internet 上的任何区域。虽然它是一个实用的工具,但您在使用它时必须谨慎、清醒和合乎道德。
在Python中使用Tor需要先安装并运行Tor,下一节会介绍。Tor 服务易于安装和启动。直接到Tor下载页面下载安装,打开后连接即可。但请注意,使用 Tor 时互联网速度会变慢。这是因为代理可能要在世界网络上多次旅行才能到达目的地!
袜子
PySocks 是一个非常简单的 Python 代理服务器通信模块,可以和 Tor 一起使用。您可以从其网站 () 下载它,也可以使用任何第三方模块管理器进行安装。
这个模块的使用非常简单。示例代码如下所示。运行时,Tor 服务必须运行在 9150 端口(默认值):
网站会显示客户端连接的网站服务器的IP地址,可以用来测试Tor是否正常工作。程序执行后,显示的IP地址不是你原来的IP。
如果你想在 Tor 中使用 Selenium 和 PhantomJS,你不需要 PySocks,只要确保 Tor 正在运行,然后增加 service_args 参数设置代理端口,让 Selenium 通过端口 9150 连接到网站:
和之前一样,这个程序打印的IP地址不是你原来的,而是你通过Tor客户端获取的IP地址。
从网站主机运行
如果您有个人网站或公司网站,那么您可能已经知道如何使用外部服务器来运行您的网络爬虫。即使一些相对封闭的Web服务器没有可用的命令行访问方式,您也可以通过Web界面控制程序。
如果您的网站部署在 Linux 服务器上,则 Python 应该已经在运行。如果你使用的是 Windows 服务器,你可能就没那么幸运了;你需要仔细检查是否安装了Python,或者问站长是否可以安装。
大多数小型网络主机都会提供一个名为 cPanel 的软件,它为网站管理和后台服务提供基本的管理功能和信息。如果您连接到 cPanel,您可以设置 Python 在服务器上运行 - 输入“Apache Handlers”并添加一个处理程序(如果还没有):
这将告诉服务器所有 Python 脚本都将作为 CGI 脚本运行。CGI是Common Gateway Interface,它是任何可以在服务器上运行的程序,它动态地生成内容并在网站上显示出来。将 Python 脚本显式定义为 CGI 脚本是为了赋予服务器执行 Python 脚本的权限,而不仅仅是在浏览器中显示它们或让用户下载它们。
写好Python脚本后,上传到服务器,然后将文件权限设置为755,使其可执行。通过浏览器找到程序上传的位置(你也可以写一个爬虫来自动完成)来执行程序。如果担心公域脚本执行不安全,可以采取以下两种方法。
事实上,通过这些最初用于显示网站的服务运行 Python 脚本有点复杂。例如,您可能会发现在网络爬虫运行时网站的加载速度变慢。实际上,直到整个采集
任务完成后页面才会加载(您必须等到所有“打印”语句的输出都显示出来)。这可能需要几分钟、几小时,甚至永远不会完成,具体取决于程序的具体情况。虽然它最终能够完成任务,但您可能希望看到实时结果,因此您需要一个真实的服务器。
从云主机运行
虽然云计算的成本可能是无底的,但在写这篇文章的时候,启动一个计算实例是最便宜的,只要1.3美分/小时(Amazon EC2微实例,其他实例会更贵) , 谷歌最便宜的计算例子是4.5美分每小时,至少需要10分钟。考虑到算力的规模效应,从大公司购买一个小型云计算实例的成本应该和自己购买一台专业物理机的成本差不多——但使用云计算不需要雇人维护设备.
设置计算实例后,您将拥有一个新的 IP 地址、用户名和公钥和私钥,可用于通过 SSH 连接到实例。以后需要做的一切都应该和在物理服务器上做的一样——当然,你再也不用担心硬件维护了,也不需要运行复杂冗余的监控工具。
总结爬虫被屏蔽的常见原因列表
如果您被网站阻止但找不到原因,那么这里有一份检查清单可以帮助您诊断问题。
【以上内容编译自《Python网络数据采集》第1章0、12、14】