css解密-为什么大量网站无法抓取? 爬虫突破禁令的6种常见方式

2023-08-29 0 9,045 百度已收录

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修改为以下内容,你就可以看到一个更容易采集的网站了!

用户代理:Mozilla/5.0(iPhone;CPU iPhone OS 7_1_2,如 Mac OS X)Apple WebKit/537.51.2(KHTML,如 Gecko)版本/7.0 Mobile/11D257 Safari/9537.53

2. 设置cookie的知识

虽然cookie是一把双刃剑,但正确处理它们可以避免许多收集问题。 该网站将使用cookies来跟踪您的访问过程。 如果它发现异常的爬虫行为,它会中断您的访问,例如非常快地填写表单,或者浏览大量页面。 虽然可以通过关闭并重新连接或更改 IP 地址来伪造此行为,但如果 cookie 暴露了您的身份,那么无论付出多少努力都将不起作用。

css解密-为什么大量网站无法抓取? 爬虫突破禁令的6种常见方式

在收集一些网站时,Cookie是必不可少的。 为了在网站上保持登录状态,需要在多个页面上保存 cookie。 有些网站不需要每次登录时都使用新的 cookie,而只需保留旧的“已登录”cookie 即可进行访问。

如果您正在采集一个或多个目标网站,建议您检测此类网站生成的cookie,然后思考哪些cookie需要被爬虫处理。 有些浏览器插件可以向您展示当您访问和离开网站时如何设置 cookie。 EditThisCookie() 是我最喜欢的 Chrome 插件之一。

由于 requests 模块无法执行 JavaScript,因此它无法处理许多老式跟踪软件(例如 Google Analytics)生成的 cookie,这些软件仅在执行客户端脚本时设置 cookie(或者在用户访问网站时根据网页扰动形成 cookie)浏览页面,例如单击按钮)。 要处理此类操作,需要 Selenium 和 PhantomJS 包。

Selenium 和 PhantomJS

Selenium()是一个强大的网络数据收集工具,最初是为了网站自动化测试而开发的。 近年来,它也被广泛用于拍摄准确的网站快照,因为它们可以直接在浏览器上运行。 Selenium 允许浏览器手动加载页面,获取所需的数据,甚至截取页面的屏幕截图,或者确定网站上是否发生了单独的操作。

Selenium本身没有浏览器,需要配合第三方浏览器使用。 例如,如果您在 Firefox 上运行 Selenium,您可以直接看到 Firefox 窗口打开,转到网站,并执行您在代码中设置的操作。 虽然这样更容易查看,但我更喜欢让程序在后台运行,因此我使用 PhantomJS() 而不是真正的浏览器。

PhantomJS 是一个“无头”浏览器。 它将把网站加载到显存中并在页面上执行JavaScript,但不会向用户显示网页的图形界面。 结合 Selenium 和 PhantomJS,您可以运行一个非常强大的网络爬虫,它可以处理 cookie、JavaScript、标头以及您需要执行的任何操作。

Selenium 库可以从 PyPI 网站 ( ) 下载,或使用第三方管理器(如 pip)从命令行安装。

您可以调用任何网站(本例中使用的)的webdriver的get_cookie方法来查看cookie:

点击查看大图

这会产生一个非常典型的 Google Analytics cookie 列表:

点击查看大图

您还可以调用delete_cookie、add_cookie和delete_all_cookies方法来处理cookie。 此外,还可以保存cookie以供其他网络爬虫使用。 以下示例演示了如何组合这些功能:

点击查看大图

在这种情况下,第一个网络驱动程序获取一个网站,打印cookie并将它们保存在变量savedCookies中。 第二个 webdriver 加载相同的网站(技术提示:必须首先加载网站,以便 Selenium 知道 cookie 属于该网站,即使加载网站对我们没有好处),删除所有 cookie,并替换为第一个 webdriver get饼干。 当页面重新加载时,两组 cookie 的时间戳、源代码和其他信息应该相同。 从 Google Analytics 的角度来看,第二个网络驱动程序现在与第一个网络驱动程序完全相同。

css解密-为什么大量网站无法抓取? 爬虫突破禁令的6种常见方式

3.正常时间访问路径

有一些保护良好的网站可能会阻止您快速提交表单或快速与网站交互。 即使没有这样的安全措施,以比普通人快得多的速度从网站下载大量信息也可能会导致您被禁止访问该网站。

因此,虽然多线程可能是快速加载页面的好方法(在一个线程中处理数据并在另一个线程中加载页面),但对于编写良好的爬虫来说,这是一种可怕的策略。 您仍然应该尝试确保页面加载一次并最小化数据请求。 如果条件允许,尽量减少每个页面访问的时间间隔,哪怕想减少一行代码:

time.sleep(3)

(小编:3+随机数是不是更好?)

合理的速率控制是您不应违反的规则。 过度消耗他人的服务器资源可能会让您陷入非法境地,更糟糕的是,这样做可能会严重损坏甚至导致大型网站下线。 关闭一个网站是不道德的,也是完全错误的。 所以请控制获取速度!

通用桌面相机爬虫安全措施揭晓

像 Litmus 这样的许多测试工具已经使用了很多年,并且仍然用于区分网络爬虫和使用浏览器的人类访问者,并取得了不同程度的成功。 虽然机器人下载公共文章和博客文章并不是什么大问题,但如果机器人在您的网站上创建数千个帐户并开始向所有帐户发送垃圾邮件,那就是一个大问题。 Web 表单,尤其是用于帐户创建和登录的表单,如果被机器人滥用并且其安全和流量成本受到严重威胁,则符合许多网站所有者的最佳利益。 (至少他们是这么认为的)。

这些针对表单和登录的反机器人安全措施对于网络爬虫来说确实是严峻的挑战。

4. 注意暗示输入数组值

在 HTML 表单中,“隐藏”字段使数组值对浏览器可见,但对用户不可见(除非查看页面源代码)。 随着越来越多的网站开始使用cookie来存储状态变量来管理用户状态,直到找到另一个最佳用途为止,隐式数组主要用于防止爬虫手动提交表单。

下图显示了 Facebook 登录页面上隐含数组的示例。 尽管表单中只有三个可见数组(用户名、密码和确认按钮),但在源代码中表单向服务器发送了大量信息。

Facebook 登录页面上的含义数组

利用蕴含数组实现网络数据采集主要有两种方式。 第一个是表单页面上的数组可以用服务器生成的随机变量来表示。 如果提交时该值不在表单处理页面上,则服务器可以合理地假设该提交不是从原始表单页面进行的,而是由网络机器人直接提交到表单处理页面的。 解决这个问题的最好方法是首先收集放置表单的页面上生成的随机变量,然后提交到表单处理页面。

第二种形式是“蜜罐”。 如果表单包含一个带有通用名称(设置蜜罐陷阱)的隐含数组,例如“用户名”或“电子邮件地址”,设计不良的机器人通常会忽略该数组对用户可见,直接填写此数组并将其提交给服务器,从而陷入服务器的蜜罐陷阱。 服务器会忽略牵连数组的所有真实值(或者与表单提交页面默认值不同的值),填写牵连数组的访问用户也可能被网站屏蔽。

总之,有时候非常有必要检测一下表单所在的页面,看看服务器预设的一些隐含数组(蜜罐陷阱)是否有遗漏或错误。 如果您看到一些隐含数组,通常带有大型随机字符串变量,那么 Web 服务器很可能会在提交表单时检测到它们。 此外,还有其他检查来确保当前生成的表单变量仅使用一次或最近生成(这避免了变量被简单地存储在程序中以供重复使用)。

5. 爬虫一般如何避开蜜罐?

css解密-为什么大量网站无法抓取? 爬虫突破禁令的6种常见方式

虽然在进行网页抓取时使用 CSS 属性很容易区分有用信息和无用信息(例如,通过读取 id 和 class 标签来获取信息),但这样做有时会导致问题。 如果通过 CSS 使 Web 表单中的数组对用户不可见,则可以假设访问该网站的普通用户无法填写该数组,因为该数组未显示在浏览器上。 如果数组已满,则可能是机器人,因此提交将无效。

这种方法除了应用于网站的形式之外,还可以应用于链接、图片、文件以及任何可以被机器人读取但普通用户在浏览器上看不到的内容。 如果访问者访问网站上的“隐藏”内容,则会触发服务器脚本来封锁用户的IP地址、将用户踢出网站或采取其他措施严格禁止用户访问该网站。 事实上,很多商业模式都在做这样的事情。

以下示例中使用的网页位于。 此页面包含两个链接,一个通过 CSS 隐藏,另一个可见。 此外,页面上还包含两个隐式数组:

点击查看大图

这三个元素以三种不同的方式对用户隐藏:

由于 Selenium 可以访问所访问页面的内容,因此它可以区分页面上的可见元素和隐含元素。 元素在页面上是否可见可以通过is_displayed来判断。

例如下面的代码示例就是获取后一种页面的内容,然后找到隐含的链接和隐含的输入数组:

点击查看大图

Selenium 获取每个位所包含的链接和数组,结果如下:

点击查看大图

虽然您不太可能访问找到的隐含链接,但在提交之前,请记住确认已在准备提交的表单中的隐含数组的值(或让 Selenium 手动为您提交它们)。

使用远程服务器防止IP封锁

那些启用远程平台的人通常有两个目标:需要更大的估计能力和灵活性,以及​​需要可变的 IP 地址。

6.使用可变的远程IP地址

构建网络爬虫的首要原则是:所有信息都可以伪造。 你可以使用非个人邮箱发送短信,通过命令行自动化键盘行为,或者通过IE 5.0浏览器花费网站流量来欺骗网络管理员。

但无法伪造的一件事是您的 IP 地址。 任何人都可以向您发送一封信,地址为:“总统,1600 宾夕法尼亚大道西北,华盛顿特区 20500,美国。” 但是,如果这封信是从新墨西哥州阿尔伯克基寄来的,那么你一定可以确定这封信不是美国总统寄给你的。

从技术上来说,可以通过发送数据包的方式来伪装IP地址,这就是分布式拒绝服务攻击技术(Distributed Denial of Service,DDoS),攻击者不需要关心收到的数据包(这样在发送数据包时)请求时,可以使用假 IP 地址)。 但网络数据收集是一种需要关注服务器响应的行为,所以我们觉得IP地址是不能造假的。

防止网站被窃取的大部分注意力都集中在识别人类和机器人之间的行为差​​异上。 这些封杀IP地址的矫枉过正的行为,就好像农民没有依靠喷洒化肥来给农作物除虫,而是直接通过烧毁来解决问题一样。 这是最后一步,但却是忽略来自危险 IP 地址的数据包的非常有效的方法。 然而,使用这些方法会遇到以下问题。

尽管存在这一缺点,阻止 IP 地址仍然是服务器管理员用来防止可疑网络爬虫入侵其服务器的一种非常常用的方法。

Tor 代理服务器

洋葱路由器网络(通常缩写为 Tor)是一种匿名 IP 地址的方法。 网络志愿者服务器建立的洋葱路由器网络,使用不同的服务器形成多层(像白菜一样),将客户端包裹在上面。 数据在进入网络之前将被加密,因此任何服务器都无法窃取通信数据。 另外,虽然可以查看每台服务器的入站和出站通信,但是为了找出通信的真正起点和终点,需要了解整个服务器上所有服务器的入站和出站通信详细信息。通讯联系,这基本上是不可能的。

Tor 匿名的局限性

尽管我们在本文中使用 Tor 来更改 IP 地址而不是实现完全匿名,但值得注意的是 Tor 匿名方法的功能和局限性。

虽然 Tor 网络允许您访问无法追踪到您的 IP 地址的网站,但您在网站上留下给服务器的任何信息都会泄露您的身份。 例如,如果您登录 Gmail 帐户,然后使用 Google 进行搜索,这些搜索历史记录将与您的身份绑定。

此外,登录 Tor 的行为本身就可能使您的匿名性面临风险。 2013年12月,一名哈佛本科生想要逃避期末考试,于是他使用匿名电子邮件帐户通过Tor网络向该中学发送了一封炸弹威胁信。 结果,哈佛大学IT部门通过日志发现,炸弹威胁信发送时,Tor网络的流量仅来自一台机器,而且是由一名学生注册的。 虽然他们无法确定流量的原始来源(只知道是通过 Tor 发送的),但作案时间和注册信息都有据可查,且该时间段内只有一台机器登录,这使得这是起诉那种中学生的充分理由。

登录 Tor 网络不是手动匿名行为,也不会让您进入互联网的任何区域。 虽然它是一个有用的工具,但必须谨慎、清醒和道德地使用它。

要在Python中使用Tor,您需要先安装并运行Tor,这将在下一节中介绍。 Tor 服务易于安装和启动。 只需前往 Tor 下载页面下载并安装,打开并连接即可。 但请注意,使用 Tor 时互联网速度会变慢。 这是因为代理可能要绕过世界网络好几次才能到达目的地!

pysocks

PySocks 是一个非常简单的 Python 代理通信模块,可与 Tor 一起使用。 您可以从其网站 ( ) 下载它,或使用任何第三方模组管理器安装它。

该模块的使用非常简单。 示例代码如下所示。 在运行时,Tor 服务必须在端口 9150(默认)上运行:

网站会显示客户端所连接的网站服务器的IP地址,可以用来测试Tor是否正常运行。 程序执行后css解密,显示的IP地址不是您原来的IP。

如果你想在Tor中使用Selenium和PhantomJS,则不需要PySocks,只需确保Tor正在运行,然后降低service_args参数设置代理端口,让Selenium通过端口9150连接到网站:

和之前一样,这个程序复制的IP地址不是你原来的,而是你通过Tor客户端获取的IP地址。

从网络主机运行

如果您有个人或公司网站,那么您可能已经知道如何使用外部服务器来运行网络爬虫。 即使对于一些相对封闭的Web服务器,没有可用的命令行访问方法,您也可以通过Web界面控制程序。

如果您的网站部署在 Linux 服务器上,Python 应该已经在运行。 如果你使用的是Windows服务器,你可能就没那么幸运了; 需要仔细检查Python是否安装,或者询问网络管理员是否可以安装。

大多数大型网络主机都会提供一个名为cPanel的软件,该软件为网站管理和后台服务提供基本的管理功能和信息。 如果您有权访问 cPanel,则可以设置 Python 在服务器上运行 - 转到“Apache 处理程序”并降低处理程序(如果还没有):

这告诉服务器所有 Python 脚本都将作为 CGI 脚本运行。 CGI即通用网关接口(Common Gateway Interface),任何可以运行在服务器上、动态生成内容并显示在网站上的程序。 将Python脚本显式定义为CGI脚本,就是赋予服务器执行Python脚本的权限,而不仅仅是将它们显示在浏览器上或让用户下载它们。

编写完Python脚本后,上传到服务器,然后将文件权限设置为755,使其可执行。 通过浏览器找到程序上传的位置(也可以手动编写爬虫来完成)并执行程序。 如果您担心在公共域中执行脚本不安全,有两种方法可以选择。

事实上,通过最初主要用于显示网站的服务运行 Python 脚本有点复杂。 例如,您可能会发现当网络爬虫运行时您的网站加载速度变慢。 事实上,直到整个收集任务完成后css解密,页面才会加载(您必须等到所有“打印”语句的输出都显示出来)。 根据程序的不同,这可能需要几分钟、几小时或永远无法完成。 虽然它最终肯定会完成任务,但你可能还想看到实时结果,所以你需要一个真正的服务器。

从云主机运行

虽然云计算成本可能无底线,但在撰写本文时,最便宜的估算实例启动费用为每小时 1.3 美分(亚马逊的 EC2 微型实例,其他实例更贵),而 Google 最实惠的估算实例为每小时 1.3 美分。 每小时收费 4.5 美分,至少需要 10 分钟。 考虑到估算能力的规模效应,从大公司购买大型云计算实例的成本应该与自己购买专业物理机的成本类似——但使用云估算不需要雇用人员来维护设备。

设置估计实例后,您将拥有新的 IP 地址、用户名以及用于通过 SSH 连接到实例的公钥和私钥。 后面要做的一切都应该和你在物理服务器上做的一样——当然,你不再需要担心硬件维护,也不需要运行复杂冗余的监控工具。

总结爬虫被禁止的常见触发因素列表

如果您仍然被某个网站阻止并且无法找出原因,这里列出的测试可以帮助您诊断问题所在。

【以上内容整理自《Python网络数据采集》第10、12、14章】

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 css css解密-为什么大量网站无法抓取? 爬虫突破禁令的6种常见方式 https://www.wkzy.net/game/178398.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务