非常有效:为何大量网站不能抓取?爬虫突破封禁的6种常见方法
优采云 发布时间: 2022-11-24 07:16非常有效:为何大量网站不能抓取?爬虫突破封禁的6种常见方法
除了处理网站表单外,requests 模块也是设置请求头的强大工具。HTTP 请求标头是您每次向 Web 服务器发送请求时传递的一组属性和配置信息。HTTP 定义了十几种奇怪的头部类型,但其中大部分并不常用。大多数浏览器仅使用以下七个字段来发起所有网络请求(表中的信息是我自己浏览器的数据)。
当一个经典的 Python 爬虫使用 urllib 标准库时,它会发送以下请求头:
如果您是防止爬虫的网站管理员,您会允许哪个请求标头访问您的网站?
安装请求
下载链接 () 和安装说明可以在模块的网站上找到,或使用任何第三方 Python 模块安装程序安装。
可以通过请求模块自定义请求标头。该网站是一个很棒的网站,可以让服务器测试浏览器的属性。我们使用以下程序从本网站采集
信息,验证我们浏览器的 cookie 设置:
点击查看大图
程序输出中的请求头应该与程序中设置的头相同。
虽然网站可能会对 HTTP 请求标头的每个属性执行“人性化”检查,但我发现通常真正重要的参数是用户代理。不管做什么项目,一定要记得将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) Apple WebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53
2.设置cookies的知识
虽然 cookie 是一把双刃剑,但正确处理它们可以避免许多采集
问题。网站使用 cookie 来跟踪您的访问并在检测到爬虫的异常行为时中断您的访问,例如快速填写表格或浏览大量页面。虽然可以通过关闭并重新连接或更改 IP 地址来伪装这些行为,但如果 cookie 揭示了您的身份,则不会做出任何努力。
采集
一些网站时,Cookies是必不可少的。要在网站上保持持久登录,需要跨多个页面保存一个 cookie。有些站点不需要在您每次登录时都获取新的 cookie,而只是保留一个旧的“已登录”cookie 以供访问。
如果你是在抓取一个或几个目标网站,建议你查看这些网站产生的cookies,然后想想爬虫需要处理哪些cookies。有一些浏览器插件可以向您展示在您访问和离开网站时 cookie 是如何设置的。EditThisCookie() 是我最喜欢的 Chrome 插件之一。
因为requests模块不能执行JavaScript,所以不能处理很多新的跟踪软件生成的cookies,比如Google Analytics,它只会在客户端脚本执行后设置cookies(或者在用户浏览页面时根据web事件生成cookies,比如如单击按钮)。要处理这些操作,需要 Selenium 和 PhantomJS 包。
硒和 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 以供其他网络爬虫使用。以下示例演示了如何组合这些功能:
点击查看大图
在这个例子中,第一个 webdriver 获取一个网站,打印 cookies 并将它们保存在变量 savedCookies 中。第二个 webdriver 加载同一个网站(技术说明:必须首先加载网站,以便 Selenium 知道 cookie 属于哪个网站,即使加载网站的行为对我们没有任何作用),删除所有 cookie,并替换为第一个webdriver 获取 cookie。再次加载页面时,两组cookie的时间戳、源代码等信息应该是完全一样的。从 Google Analytics 的角度来看,第二个网络驱动程序现在与第一个网络驱动程序完全相同。
" />
3. 正常时间访问路径
有一些受到良好保护的网站可能会阻止您快速提交表单或与网站快速交互。即使没有这些安全措施,以比普通人快得多的速度从网站下载大量信息也可能导致您自己被禁止访问该网站。
因此,虽然多线程程序可能是一种快速加载页面的好方法——在一个线程中处理数据并在另一个线程中加载页面——但对于编写良好的爬虫来说,这是一种糟糕的策略。您仍然应该尝试确保页面加载一次并且数据请求最小化。如果条件允许,尽量在每次访问页面的时候加一点时间间隔,哪怕需要加一行代码:
time.sleep(3)
(小编:是不是3+随机数比较好?)
合理的速度控制是你不应该打破的规则。过度消耗别人的服务器资源会使你陷入非法境地,更严重的是,这样做可能会拖垮甚至导致小网站下线。关闭网站是*敏*感*词*的,也是彻头彻尾的错误。所以请控制采集速度!
常见形式反爬虫安全措施解密
许多测试工具(如 Litmus)已经使用多年,并且仍然用于区分网络爬虫和使用浏览器的人类访问者,并取得了不同程度的成功。虽然机器人下载公共文章和博客文章不是什么大问题,但如果机器人在您的网站上创建了数千个帐户并开始向所有用户发送垃圾邮件,那就是一个大问题。Web 表单,尤其是那些用于帐户创建和登录的表单,如果被漫游器不加区别地滥用,可能会使网站的安全和流量成本面临严重风险,因此,为了许多网站所有者的最佳利益,尝试限制对网站的访问(位于至少他们是这么认为的)。
这些针对表单和登录的反机器人安全措施确实对网络爬虫提出了严峻的挑战。
4.注意隐式输入字段值
在 HTML 表单中,“隐藏”字段使字段的值对浏览器可见,但对用户不可见(除非查看网页的源代码)。随着越来越多的网站开始使用cookie来存储状态变量来管理用户状态,隐藏字段主要用于防止爬虫自动提交表单,直到找到另一个最佳用途。
下图显示了 Facebook 登录页面上隐藏字段的示例。虽然表单中只有三个可见字段(用户名、密码和确认按钮),但在源代码中,表单向服务器发送了大量信息。
Facebook 登录页面上的隐藏字段
有两种主要方法可以防止隐藏字段的网络数据采集
。第一个是表单页面上的字段可以由服务器生成的随机变量表示。如果提交时该值不在表单处理页面上,则服务器有理由认为提交不是从原创
表单页面进行的,而是由网络机器人直接提交到表单处理页面的。解决这个问题的最好方法是在提交到表单处理页面之前,首先捕获表单所在页面上生成的随机变量。
第二种方式是“蜜罐”。如果一个表单收录
一个带有通用名称(设置蜜罐陷阱)的隐藏字段,例如“用户名”或“电子邮件地址”,设计不良的机器人通常会忽略该字段是否对用户可见,直接填写该字段并提交给服务器,这样你就会落入服务器的蜜罐陷阱。服务器会忽略所有隐藏字段的真实值(或与表单提交页面默认值不同的值),填写隐藏字段的访问用户也可能被网站屏蔽。
总之,有时需要检查表单所在的页面,看看是否有任何服务器预先设置的隐藏字段(蜜罐陷阱)丢失或错误。如果您看到一些隐藏字段,通常带有较大的随机字符串变量,那么很可能是 Web 服务器在提交表单时检查了它们。此外,还有其他检查以确保这些当前生成的表单变量仅使用一次或最近生成(这可以防止变量被简单地存储在程序中并重复使用)。
5、爬虫通常如何避开蜜罐
虽然在进行网络抓取时很容易使用 CSS 属性来区分有用信息和无用信息(例如,通过读取 id 和 class 标签来获取信息),但这样做有时会出现问题。如果通过 CSS 使 Web 表单上的某个字段对用户不可见,则可以假定普通用户在访问该站点时无法填写该字段,因为它不会显示在浏览器上。如果此字段被填充,则它可能是机器人,因此提交将无效。
这种方法不仅可以应用于网站的形式,还可以应用于链接、图片、文件,以及任何可以被机器人阅读,但普通用户在浏览器上看不到的内容。如果访问者访问网站上的“隐藏”内容,将触发服务器脚本封锁用户的IP地址,将用户踢出网站,或采取其他措施禁止用户访问网站。事实上,很多商业模式都在做这些事情。
以下示例中使用的网页位于。此页面收录
两个链接,一个通过 CSS 隐藏,另一个可见。此外,页面上还收录
两个隐藏字段:
点击查看大图
这三个元素以三种不同的方式对用户隐藏:
因为 Selenium 可以访问被访问页面的内容,所以它可以区分页面上的可见元素和隐藏元素。元素在页面上是否可见可以通过is_displayed()来判断。
例如,下面的代码示例获取上一页的内容,然后查找隐藏的链接和隐藏的输入字段:
点击查看大图
Selenium 抓取每个隐藏的链接和字段,结果如下:
点击查看大图
虽然您不太可能访问找到的隐藏链接,但在提交之前,请记住确认表单中已准备好提交的任何隐藏字段的值(或让 Selenium 为您完成)。
使用远程服务器避免 IP 阻塞
那些启用远程平台的人通常有两个目标:需要更强大的计算能力和灵活性,以及需要可变 IP 地址。
6.使用可变的远程IP地址
构建网络爬虫的首要原则是:所有信息都可以伪造。您可以使用非个人邮箱发送电子邮件,通过命令行自动化鼠标的行为,或者通过 IE 5.0 浏览器消耗网站流量来吓唬网络管理员。
" />
但有一件事是无法伪造的,那就是您的 IP 地址。任何人都可以通过以下地址给您写信:“The President, 1600 Pennsylvania Avenue NW, Washington, DC 20500, USA。” 但是,如果这封信是从新墨西哥州的阿尔伯克基寄来的,那么您一定是。您可以放心,给您写信的不是美国总统。
从技术上讲,可以通过发送数据包来伪装IP地址,这就是分布式拒绝服务攻击技术(Distributed Denial of Service,DDoS),攻击者不需要关心接收到的数据包(这样在发送请求,它可以使用伪造的 IP 地址)。但是网络数据采集是一个需要关注服务器响应的行为,所以我们认为IP地址是不能伪造的。
防止网站被采集
的注意力主要集中在识别人类和机器人之间的行为差异上。这种封杀IP地址的矫枉过正的行为,就好像农民没有靠喷洒农药来杀死庄稼里的虫子,而是直接通过焚烧来解决问题。这是最后一步,但非常有效,只要忽略来自危险 IP 地址的数据包即可。但是,使用这种方法会遇到以下问题。
尽管存在这些缺点,但阻止 IP 地址仍然是服务器管理员用来防止可疑网络爬虫入侵其服务器的一种非常常用的方法。
代理服务器
洋葱路由器网络,通常缩写为 Tor,是一种匿名化 IP 地址的方法。由网络志愿者服务器构建的洋葱路由器网络使用不同的服务器形成多层(像洋葱)将客户端包裹在最里面。数据在进入网络之前被加密,因此任何服务器都无法窃取通信数据。另外,虽然可以查看各个服务器的入站和出站通信,但是要想找出真正的通信起点和终点,还是需要知道整个服务器的所有出站通信的详细信息。通信链路,这基本上是不可能的。
Tor 匿名的局限性
尽管我们在本文中使用 Tor 来更改 IP 地址而不是实现完全匿名,但值得注意 Tor 匿名方法的功能和局限性。
虽然 Tor 网络允许您使用无法追踪到您的 IP 地址访问网站,但您在网站上留给服务器的任何信息都会泄露您的身份。例如,如果您登录到您的 Gmail 帐户,然后使用 Google 进行搜索,这些搜索历史将与您的身份相关联。
此外,登录 Tor 的行为本身可能会使您的匿名性处于危险之中。2013年12月,一名哈佛本科生想逃避期末考试,于是使用匿名邮箱通过Tor网络向学校发送*敏*感*词*威胁信。结果,哈佛大学IT部门通过日志发现,在发送*敏*感*词*威胁信时,Tor网络的流量仅来自一台机器,而且是一名学生注册的。虽然他们无法确定流量的原创
来源(只能确定它是通过 Tor 发送的),但时间和注册信息都有很好的记录,并且在那段时间只有一台机器登录,这是一个很好的理由起诉学生。
登录 Tor 网络不是一种自动的匿名措施,也不会让您访问互联网的任何区域。虽然它是一个有用的工具,但必须谨慎、清醒和遵守道德规范地使用它。
要在 Python 中使用 Tor,需要先安装并运行 Tor,这将在下一节中介绍。Tor 服务易于安装和启动。只需到Tor下载页面下载安装,打开并连接即可。但请注意,使用 Tor 时互联网速度会变慢。这是因为在到达目的地之前,agent 可能要绕世界网络好几圈!
PySocks
PySocks 是一个非常简单的 Python 代理通信模块,用于与 Tor 一起使用。您可以从其网站 ( ) 下载它,或使用任何第三方 mod 管理器安装它。
这个模块的使用非常简单。示例代码如下所示。运行时,Tor 服务必须在端口 9150(默认)上运行:
网站会显示客户端连接的网站服务器的IP地址,可以用来测试Tor是否正常工作。程序执行后,显示的IP地址不是你原来的IP。
如果你想在Tor中使用Selenium和PhantomJS,你不需要PySocks,只要确保Tor正在运行,然后添加service_args参数设置代理端口,让Selenium通过9150端口连接网站:
和以前一样,这个程序打印的IP地址不是你原来的,而是你通过Tor客户端得到的。
从虚拟主机运行
如果您有个人或公司网站,那么您可能已经知道如何使用外部服务器来运行您的网络爬虫。即使对于一些相对封闭的网络服务器,没有命令行访问,您也可以通过网络界面控制程序。
如果您的网站部署在 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 微型实例,其他实例会更贵),谷歌最便宜的计算实例是每小时 1.3 美分。它每小时收费 4.5 美分,至少需要 10 分钟。考虑到计算能力的规模效应,从大公司购买小型云计算实例的成本应该与自己购买专业物理机的成本相近——但使用云计算不需要雇人维护设备。
设置计算实例后,您将拥有一个新的 IP 地址、用户名以及公钥和私钥,可以通过 SSH 连接到该实例。以后你需要做的一切都应该和你在物理服务器上做的一样——当然,你不需要担心硬件维护,也不需要运行复杂冗余的监控工具。
总结爬虫被禁止的常见原因列表
如果您一直被某个网站阻止并且找不到原因,这里有一个清单可以帮助您诊断问题所在。
【以上内容整理自《Python网络资料大全》第10、12、14章】
事实:如何把相似度高的文章变成伪原创(伪原创相似度多少可以发出来)
本文阅读提示词:伪原创文章相似度多少可以发表,伪原创文章的方法,与原创文章相似度过高
如何将相似度高的文章变成伪原创
1、标题修改
" />
如何将相似度高的文章改成原来的文章?很多网站使用一些完全复制的采集软件,但是有的采集软件采集的内容基本上相似度很小,甚至有的采集软件采集的内容都是低的。质量,这样的文章对搜索引擎没有影响,收录量自然会下降。
2、内容修改
如何把相似度高的文章变成伪原创,虽然搜索引擎不会在语义上进行惩罚,但是我们还是要努力让文章更有价值。毕竟原创度高的文章内容和文集的内容是不一样的。采集
的文章需要处理。伪原创程度高的文章应该放在首页,这样搜索引擎才会更喜欢你的网站。
3. 更新站内文章
" />
SEO文章更新频繁:SEO更新文章有什么规则?当搜索引擎更新文章时,我们需要控制和更新关键词文章的频率。网站上的所有内容均基于文章更新。更新文章要有规律,更新文章要有规律。不能今天2篇,明天2篇,明天5篇,后天1篇。这是不可取的。
更新的文章要以用户的需求为中心,这样你的网站才能更快更高被收录。或者给用户提供数据,只有这样搜索引擎才会喜欢你的网站。这样的更新行为对于网站的SEO优化作用不是很大,甚至会引起搜索引擎作弊的嫌疑。
相关文章