摆脱屏蔽抓取网页

2 min read
摆脱屏蔽抓取网页

教程:如何摆脱屏蔽抓取网站。了解克服网站屏蔽的9种解决方案。

抓取网页就像是寻宝,不同之处在于,您是在网页上探索API不会提供的隐藏信息。不过与其他精彩的寻宝游戏一样,都需要克服一些挑战。

访问目标网站时遇到屏蔽是其中一个主要障碍。被屏蔽的原因有很多,比如抓取策略严格、担心资源滥用、源IP声誉问题,或是检测到(伪造的)用户代理。

不过不用担心,本教程会教您如何在不被目标网站屏蔽的情况下抓取网页,以便您可以在互联网上轻松找到“宝藏”。

帮助您避免访问受阻的策略

由于网络抓取是一项复杂的工作,因此您需要利用多种技巧来避免访问受阻。您可以使用以下9种策略,来摆脱高峰期访问受阻问题。

1.了解目标网站的政策和服务条款

在开始抓取新网站时,除了学习页面的HTML结构,您还需要对目标网站进行深入了解,熟悉网站的政策和服务条款。通常来说,这涉及网站对网页抓取的立场,是否允许抓取,以及允许抓取哪些特定页面。不遵守这些条款会导致您访问受阻,甚至可能面临法律风险。

需要注意的一个关键文件是robots.txt文件。该文件位于网站的根目录中,并向网络机器人提供指令,规定不可扫描或处理的网站部分。

以下是一个robots.txt文件示例:

User-agent: *
Disallow: /private/
Disallow: /temp/

此处, robots.txt文件指示所有网络机器人(在用户代理后面用*表示)抓取网站时避开抓取private目录和temp目录。

尊重网站的规定和准则对于网页抓取来说是必要的。

2.遵守道德伦理标准

与遵守网站政策一样,您最好也遵守行为准则。符合伦理标准不仅可以帮助您摆脱屏蔽,还尊重了目标网站的权利和资源。

遵循这些准则至关重要:

  • 请不要不间断地发送请求轰炸服务器:在请求之间留出足够的时间间隔。一些网站可能会检测出网络爬虫并阻止其快速提取大量数据,因为这看起来不像人类行为。为了显得更自然,减少被封锁的几率,建议您有间隔得发送请求。同时更建议您使用不规则的间隔,这样能更好模仿人类行为。
  • 未经许可,请勿抓取个人数据:这不仅是伦理问题,通常也是一个法律问题。在抓取个人数据之前,请务必确保获得必要的许可。
  • 尊重所获数据:请合法负责地使用您抓取的数据。确保您对数据的使用遵守所有适用的法律法规,如版权法和通用数据保护条例 (GDPR)等。

以下是如何在Python请求中实施不规则间隔示例:

import time
import random

urls = ['https://www.targetwebsite.com/page1', 'https://www.targetwebsite.com/page2', 'https://www.targetwebsite.com/page3']

for url in urls:
    response = requests.get(url)
    # Process response
    sleep_time = random.uniform(1, 10)  # Generate a random sleep time between 1 and 10 seconds
    time.sleep(sleep_time)  # Sleep for a random time between requests

这段代码循环遍历了urls数组中的URL列表。该代码对每个 URL发出一个获取请求,然后使用time.sleep()函数暂停,接着继续处理下一个请求。这些随机的时间间隔能更好地模仿人类浏览行为,降低被检测到的几率。

3. 使用(轮动)代理

代理是网络抓取工具包中一个有用的工具,特别是轮动代理。代理服务器作为网关,充当您和抓取网站之间的中间人。它会掩盖您的IP地址,使请求看似来自不同位置。

轮动代理更进了一步,不使用单个代理IP,而是提供一个IP池。您的请求会在这些IP之间轮动,不断更改您的数字身份。由于网站更难识别请求中的模式,这极大降低了爬虫被检测和阻止的几率。

此外,轮动代理有助于将您的请求分发到多个IP,从而降低单个IP因发送过多请求而被封锁的风险。

以下代码片段可帮助您在Python中实施轮动代理:

import requests
from itertools import cycle

# List of proxies
proxy_list = ['ip1:port1', 'ip2:port2', ...]
proxy_pool = cycle(proxy_list) # create a cycle of proxies

url = 'https://www.targetwebsite.com'

for i in range(1,3):
# Get a proxy from the pool
proxy = next(proxy_pool)
print(f"Request #{i}:")
try:
response = requests.get(url, proxies={"http": proxy, "https": proxy})
print(response.content)
except:
# Most free proxies will often get connection errors, so we catch them here
print("Connection error with proxy:", proxy)

此代码片段使用代理列表(proxy_list)循环遍历,从而使每个请求具有不同的IP地址。这会使网站更难检测您的网页抓取操作。

轮动代理是强大的工具,但应该作为更大的战略组成。要摆脱屏蔽抓取网页,您必须将轮动代理与本文中提到的其他技术结合使用。

4. 使用正确的标头和用户代理

网站通常使用标头和用户代理来检测机器人。用户代理是浏览器发送到服务器的标头,提供关于(发起请求的)软件和系统的详细信息。用户代理通常包括应用程序类型、操作系统、软件提供商和软件版本。此信息有助于服务器提供适合您特定浏览器和系统的内容。

在抓取网页时,使用合法的用户代理字符串至关重要。通过模拟真实用户,您可以有效地避开检测机制,降低被封锁的可能性。

除了用户代理之外,另一个需要考虑的重要标头是Referer标头。Referer标头显示与所请求资源相关联的网页URL。将此标头包含在爬虫中,会让网页抓取看起来更像是真人用户从一个网页导航到另一个网页。

您的爬虫还可以包含其他有用标头,如Accept-LanguageAccept-EncodingConnection。这些标头通常由网页浏览器发送,很少包含在爬虫中;由于它们对检索网页内容没有直接影响,所以网络爬虫往往会忽略这些标头。然而,包含这些标头有助于使爬虫请求看起来更真实,减少被检测到的几率。

下是一段Python代码片段:在请求标头中设置了用户代理和Referer标头,以模拟真实的浏览会话:

url = 'https://www.targetwebsite.com'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
'Referer': 'https://www.google.com/'
}

response = requests.get(url, headers=headers)

5. 处理蜜罐陷阱和错误

蜜罐陷阱等障碍会让网站导航具有挑战性。蜜罐是故意设计的隐藏链接,不会被普通用户注意到,但会被爬虫和机器人检测到。这些链接通常使用HTML元素设置hide或none来实现隐藏,或伪装成与页面背景颜色相匹配的按钮。引入蜜罐陷阱的主要目的是识别机器人并将其列入黑名单。

以下是一个简单的代码片段,可用于尝试避免Python中的蜜罐陷阱:

from bs4 import BeautifulSoup
import requests

url = 'https://www.targetwebsite.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

for link in soup.select('a'):
    if 'display' in link.get('style', '') and 'none' in link['style']:
        continue  # Skip this link
    # Process link

display: none是蜜罐链接的常见特征,此代码跳过了style属性中带display: none的所有链接。

抓取数据时,另一个重要事项是注意错误,因为错误响应经常出现。这些错误通常由4xx范围(客户端错误)或5xx范围(服务器错误)中的HTTP 状态代码指示。要避免过多请求导致服务器超负荷或被屏蔽,必须好好处理这些错误。

处理此类错误的一种有效策略是实施指数退避算法。此方法会逐步增加后续重试之间的时间间隔,从而更有效地处理错误。

6.使用验证码解决服务

区分电脑和人的完全自动化公共图灵测试 (CAPTCHA) ,又称验证码,是许多网站实施的一项安全措施,用于防止自动化的机器人活动,包括抓取网页。CAPTCHA因其设计对人类很容易,但对机器却是挑战而得名。

如果您遇到验证码,您可以考虑使用Bright Data亮网络解锁器。该服务多种方法,如机器学习算法,甚至是人类解决者手动操作,代表您破译验证码。亮网络解锁器会自动解决验证码,让您的爬虫能继续提取数据。

7. 监控速率限制和拒绝访问

大多数网站都会限制速率和拒绝访问,以保护其资源不被自动化机器人滥用。由于您发送到服务器的每个请求都会消耗资源,所以数千个机器人同时发送请求很容易导致服务器瘫痪或网站性能降低。为防止这种情况,网站会实施速率限制,有些网站甚至在响应中提供X-RateLimit-Limit标头,详细说明其速率限制。您必须遵守这些限制以避免访问受阻。

服务器通常通过HTTP状态代码来传达这些限制。状态代码200表示一切正常,但代码429表示您在一定时间内发送了太多请求。同样, 403表示访问被禁止,而503表示服务器可能因为过载不可用。了解这些代码对于浏览并提取数据至关重要。

以下Python代码片段使用了requests库来遵守速率限制:

import time
import requests

def respectful_requester(url, delay_interval=1):
    response = requests.get(url)
    # If the status code indicates rate limiting, sleep then retry
    if response.status_code == 429:
        print('Rate limit reached. Sleeping...')
        time.sleep(delay_interval)
        return respectful_requester(url, delay_interval)
    elif response.status_code != 200:
        print(f'Error: {response.status_code}. Try a different proxy or user-agent')
    
    return response

此函数发送GET请求到指定URL,并检查响应。如果遇到429状态代码,会暂停一段指定的延迟时间后再次尝试请求。您还可以根据需要对其他状态代码进行更复杂的处理。

8. 从谷歌浏览器缓存中抓取数据

对于难以抓取的网站或无时间限制的数据,从网站缓存(非网站本身)中抓取数据是一个替代方法。在处理极具挑战性的网站(会主动阻止爬虫)时,这种技术特别有用。抓取这些缓存页面而不是原始网页能避免触发反抓取机制。但请注意,这种方法并非万无一失,因为某些网站禁止谷歌缓存其内容。此外,谷歌缓存中的数据可能不是最新数据。

要从谷歌缓存中抓取网站,只需将网站URL添加到http://webcache.googleusercontent.com/search?q=cache:末尾。例如,如果您想抓取亮数据网站,可以使用以下 URL: http://webcache.googleusercontent.com/search?q=cache:https://https://brightdata.com/。

尽管抓取谷歌缓存数据可能比抓取会屏蔽请求的网站更可靠,但请记得考虑其局限性,并验证缓存数据的相关性。

9.改变请求模式

要想避免在网络爬虫中被检测到,关键在于融入。想象每个服务器都是一位警惕的守卫 – 如果你的爬取模式太容易被预测,比如按照精确的间隔发送请求,你就会被抓到。为了在爬取时避免被检测到,要多样化!使用Python添加随机暂停并改变访问顺序,就像真实用户一样通过使用randomtime库来浏览。利用像Selenium或Puppeteer这样的工具,甚至可以让你的脚本表现得像普通用户一样,点击页面并输入不同的信息。保持不可预测,就能在不触发任何警报的情况下进行爬取。

10.使用第三方代理和抓取服务

随着网络爬虫和网站管理员之间的猫鼠游戏加剧,维护高效隐秘的网络抓取设置也越来越复杂。网站总是想方设法来检测、减缓或阻止网络爬虫,因此需要一种动态的方法来应对。

有时,最好的做法是将难题交给专家,比如亮数据等第三方代理和抓取服务提供商。 亮数据始终处于反抓取技术的前沿,迅速调整策略,随时应对新的挑战。

亮数据的解决方案可以帮助您在抓取数据时逼真地模仿人类行为,如轮动住宅代理自动解决验证码,让您的抓取工作保持隐匿。这些服务具备可扩展性,可轻松满足您网络抓取项目不断增长的需求。

利用这些解决方案可以帮您节省时间和资源,让您将精力专注于项目的其他部分,例如分析所获数据并形成洞察。

结论

至此,您已经克服了充满难题的网络爬虫障碍。通过了解目标网站政策;使用道德合规的爬虫;采用轮动代理、合适的标头和用户代理等策略;处理蜜罐陷阱和错误。到这一步,您已经具备了摆脱屏蔽并设置网络抓取项目的能力。

但是,请记住,即使最熟练的探险家也需要可靠的工具。亮数据能帮助您:亮数据的综合解决方案提供了一系列服务,旨在简化您的网络抓取之旅。利用亮网络解锁器访问隐藏在验证码后的数据。或者从多种代理服务中进行选择,包括使用强大的代理服务器机房代理动态住宅代理来保持隐匿。

享受快乐的网页抓取之旅!