成功的web抓取者遵循一些web抓取实践,使他们在该领域取得成功。如果您想在web抓取方面走得更远,就必须遵循这些最佳实践,现在请进来了解一下。
作为web抓取游戏的新手,你会认为你的小脚本可以在任何规模下获得任务,但迟早,你会发现你的脚本不仅只是一个概念证明,你会发现你是多么幼稚。
你会发现这是web抓取比你知道的,你会发现你需要处理很多anti-scraping技术你能刮一些网站,你就会知道,就像其他领域一样,web抓取自己的最佳实践,您必须遵守成功。
在本文中,您将学习抓取站点时的最佳实践。您还将学习如何处理在web抓取时遇到的常见问题以及如何解决这些问题。
目录
Web爬取中的常见陷阱
作为网络抓取工具,您需要知道在网络抓取练习中必须经历的一些陷阱。其中一些经常发生-有些不那么频繁发生。无论发生的频率如何,您都需要了解它们。常见的讨论如下。
- 更改页面的HTML
我决定从这一点开始,因为在大多数情况下,这与试图阻止您抓取内容的网站无关。但是,这是Web抓取脚本停止工作时最受欢迎的原因之一。大多数网站通常会在某些时候更改布局,而当这种情况发生时,HTML将必须更改。
这就意味着你的代码将会中断并停止工作。您需要一个系统,它可以立即向您报告在页面上发现的更改,以便您可以修复它。一些使用分页的网站在某些页面之后改变布局,使抓取器崩溃——你也必须考虑到这一点。
- 错误地删除错误的数据
作为web scraper,您必然会遇到的另一个常见的陷阱是删除错误的数据。通常,当您抓取几个页面并可以快速浏览抓取的数据时。这可能不会发生,因此,您可以判断抓取的数据是否存在问题。
- 如何使用代理从Linkedin抓取数据
- 使用软件抓取Craigslist数据的终极指南
- 使用代理抓取Whois域数据
但是,当要剪贴的数据量很大,而您又无法浏览时,则需要考虑所剪贴的整个数据的完整性和质量。这是因为某些数据可能不符合您的质量准则。为此,您需要先对数据进行测试,然后再将其添加到数据库中。
- Anti-Scraping技术
网站不希望其数据被废弃,如果愿意,它们将为您提供API。大多数复杂的网站都设有反垃圾邮件系统,以防止Web爬虫,爬网程序和其他自动化机器人访问其内容。
这些涉及一些防抓取技术,例如IP跟踪和禁止,蜜罐陷阱,验证码,对网站进行Ajax化,浏览器指纹识别等。之后,您将在本节中学习如何解决所有这些问题。
- 大规模抓取的问题
如果您是网络抓取领域的新手,您会认为抓取一个10000页的网站与抓取一个200万页的网站是一样的。但是,您必须抓取的数据越多,您就需要越仔细和计划。通常,您需要了解,需要抓取的数据越多,花费的时间就越多。
通常,开发刮板以同时进行刮板并在不同的计算机/服务器之间分配工作将使整个过程更快。另外,您的数据库系统需要可伸缩,快速,安全和可靠。否则,您可能会浪费大量时间尝试查询数据库。亚马逊网络服务(AWS)是市场上的最佳选择之一。
Web抓取最佳实践
就像我之前说过的那样,每一项有价值的活动都有其自己的最佳实践,并且网络抓取也不例外。本文的这一部分将用于描述这些最佳实践。
- 尊重网站的Robots.txt文件
大多数网站都有robots.txt,可用于与网页上的抓取工具和抓取工具等自动化机器人进行通信,以进行抓取或不抓取。他们还可以提供其他命令,例如爬网频率和请求之间的时间安排等。我发现,除搜索引擎拥有的大多数Web抓取工具外,一件事是网站的robots.txt文件不受尊重-它们被完全忽略了。实际上,某些网络抓取工具认为robots.txt已过时。
但是,考虑使用网站的robots.txt是最佳实践之一。通常,即使您不希望遵循它,也禁止规定不应该遵循的路径的规则,但您至少可以尊重爬网延迟指令,以使其在Web服务器上更为温和。您可以找到如何使用首选的编程语言和抓取框架来解析robots.txt文件。对于python程序员,他们可以使用urllib.robotparser模块来完成此任务。
- 如何使用Python构建简单的Web抓取工具
- 使用Chrome Headless抓取任何网站
- 欺骗用户代理和其他HTTP标头
当浏览器向Web服务器发送请求时,它会发送诸如User-Agent之类的详细信息,该字符串是标识浏览器的字符串。除User-Agent之外,发送的其他信息还包括“接受”,“接受语言”,“接受编码”和“引荐来源网址”以及其他数据。
网页抓取工具还必须提交其他信息。有些网站会拒绝他们访问。现在,某些站点使用其用户代理来自动阻止某些爬虫和抓取工具来识别它们。
如果您不希望您的机器人被识别为网络抓取工具,则需要通过将User-Agent替换为流行的Web浏览器来欺骗User-Agent。如果您可以轮换使用User-Agent,那就更好了,但是您必须确保该站点不会对其他User-Agent显示不同的布局。
如果您没有在代码中考虑布局更改,则代码将中断。使用流行浏览器的User-Agent字符串时,必须确保其他HTTP标头与此相对应。确保您还为引荐来源标头提供了一个值,以使其看起来更自然。
您可能感兴趣的某些数据隐藏在登录页面的后面。面对此问题时,您只需要仔细计划,因为对于网站而言,监视活动变得更加容易。
但是,您首先如何登录并维护会话cookie?
尽管这似乎是一项艰巨的任务,但如果您知道自己在做什么,实际上并不难。您只需要创建一个会话,然后将身份验证详细信息作为有效内容发送到登录URL的请求。请求成功后,您将获得包含会话cookie的响应。
返回会话cookie后,您可以将其附加到您的每个请求中,因为站点使用cookie来标识其用户,所以不会再次要求您登录。为了发现要用于有效负载的表单输入的登录URL和名称,您需要在浏览器环境中右键单击并检查Inspect元素选项,以检查表单。
表单操作的值是登录URL。对于有效载荷,请检查表单元素,并拔出用户名和密码字段的正确名称-如果有其他字段,请输入正确的名称。
对于具有隐藏安全字段以防止黑客和垃圾邮件发送者访问其站点的某些站点,以上登录方法可能不起作用。这是因为如果您尝试仅发送用户名和密码,而没有用于隐藏字段的数据,则请求将不会成功。
除了登录外,许多POST表单还具有安全性字段,例如对普通用户隐藏的csrf_token并自动填充有您无法复制的哈希值。
为了获取该字段的数据,您需要创建一个会话,访问该页面,然后从该隐藏页面中提取值。之后,您可以发送带有请求有效负载中隐藏字段值的请求。
- 放慢您的请求以避免网站过多
Web抓取涉及向您不拥有的网站发送大量请求。这意味着您自然会增加维护站点的成本,而不会为站点增加任何价值。如果您无法为要抓取的网站增加价值,请通过设置两次请求之间的延迟来尽量保持礼貌,以免使网站的服务器不堪重负。一些网站甚至说明其最佳的爬行延迟网络爬虫和刮削器在他们的robots.txt文件。
即使没有说明,它也是最佳实践和道德准则的一部分,对于您来说,避免在短时间内避免对过多请求的站点进行锤击。这是为了避免降低网站速度。在人们不活跃的夜晚或清晨抓取网站也很重要-这是为了确保您的操作不会使网站变慢,从而不会影响其他用户。
- 如何避免代理被禁止或阻止
- 跨多个IP分配您的请求
事实是,这一点甚至不应该成为最佳实践的一部分,因为在必须进行刮削时使用代理。每个网站都有给定时间段内单个IP所允许的请求限制。如果某个IP试图超过该IP,则有时会将该IP阻止。
因此,如果您希望以合理的规模进行抓取,则需要使用代理。使用代理,您可以跨多个IP分配请求,使它们看起来像是从不同设备进入网站的。
为此,最好使用代理池。这是因为它们的池中有许多IP,并且您不必担心IP轮换和处理不良IP的问题。当涉及到代理服务器的类型,住宅代理是最适合这个。但是,对于某些选定的站点,数据中心代理的工作效果非常好。
- 旋转代理以使用多个IP进行请求以进行Web抓取
- 如何为每个会话生成随机IP地址
当涉及到网络抓取时,您需要知道页面的HTML代码是不可信的,这是有原因的–它们不时地被更改。
因此,在尝试操作元素或从其中提取数据之前,务必检查是否存在元素,这一点很重要。当您尝试从缺少的HTML标记中提取数据时,某些解析库将返回None,而其他解析库将引发异常。
- 涉及什么数据解析和解析技术?
建议您始终先使用if语句检查标签的可用性,然后再尝试对其进行处理。并且,如果缺少某个元素,Web抓取工具应将其记录下来并通知您,以便您知道其他页面上的某些内容已更改,您可以对其进行处理。
- 处理网络错误
您正在为Web搜寻器编写代码,而没有考虑网络错误,对吗?
好吧,您可能会想知道它经常发生,这比您想像的要重要得多。这可能是由于您自己的问题,正在向其发送请求的Web服务器或代理提供商的问题。
经验法则是永远不要相信网络会按预期运行。将会出现问题,因此,您应该以某种方式编写代码,以考虑网络错误的可能性,并相应地进行处理。
确保代码中必须发送Web请求的每个部分都附加了异常处理,请尝试:
requests.get(https://www.google.com), requests.exceptions.RequestException: #用于在此处处理异常的代码。
在处理错误时,您可以重试,然后经过几次尝试,然后可以移至下一个URL并记录该特定的URL和错误,以便您可以手动完成该操作。另外,请确保仅在返回的HTTP状态代码为200时才开始解析数据。
- 最常见的HTTP代理错误代码
- 抓取Google缓存以获取非时间敏感数据
您尝试抓取的时间是否对时间不敏感?然后,您最好不理会网站,并通过在Google Cache上抓取副本来抓取其数据。您可能会想知道,您要抓取的大多数页面已经被Google抓取了,您可以直接从Google Cache抓取,尤其是在处理历史数据时。您可以从Google Cache获取页面的整个HTML,包括页面,图片和其他文件。
- 抓取Google时防止禁令和验证码的代理
- 适用于SERP数据的最佳Google代理,绝不会阻止Google
Google是一个非常大的网站,可以在一天中的任何时间接收您希望发送到其服务器的任何数量的请求,而您的网络抓取工具不会对其产生任何负面影响。
不能说其他网站的服务器很容易被请求淹没。甚至Scrapy也建议网络抓取工具应该从Google Cache抓取历史数据,而不是直接访问网站。
结论
Web抓取是一项严肃的业务,需要大量的计划和仔细的执行,尤其是如果您正以合理的规模进行研究时。在计划时,您必须考虑一些重要的Web抓取最佳实践。其中一些已在上面讨论。
- Scrapy、Beautifulsoup、Selenium用于Web抓取
- 使用Selenium和代理构建Web爬网程序
- Selenium代理设置–如何在Selenium上设置代理
- 卷曲代理设置–如何使用代理进行卷曲?