如何在网页抓取时不被抓住?
在本文中,我们将讨论如何在网页抓取时不被抓住。让我们详细看看所有这些替代方案:
机器人.txt
- 它是由站长创建的文本文件,它告诉搜索引擎爬虫允许爬虫爬取哪些页面,因此最好在抓取之前尊重 robots.txt。
- 示例:这里GFG的robot.txt有“User-agent:*”,表示该部分适用于所有robots,少数网站不允许被任何网络爬虫抓取。
知识产权轮换
- 从单个 IP 地址发送过多请求清楚地表明您正在自动执行 HTTP/HTTPS 请求,并且网站管理员肯定会阻止您的 IP 地址以停止进一步抓取
- 最好的选择是使用代理并在来自单个代理的一定数量的请求后轮换它们,这减少了 IP 阻塞的机会并且抓取工具不受影响。
- 始终确保获得高级代理,尤其是住宅 IP 地址,因为数据中心 IP 地址很可能被其他用户标记并可能返回连接错误。
代理类型:
- 数据中心代理:这些代理来自云服务提供商,有时被标记为使用它们的人很多,但由于它们更便宜,因此可以为网络抓取活动带来一组代理。
- 住宅 IP 代理:这些代理包含来自本地 ISP 的 IP 地址,因此网站管理员无法检测它是抓取工具还是浏览网站的真人。与数据中心代理相比,它们非常昂贵,并且可能会导致法律同意,因为所有者并不完全知道您是否将他们的 IP 用于网络抓取目的。
- 移动 IP 代理:这些代理是私人移动设备的 IP,其工作方式与住宅 IP 代理类似。它们非常昂贵并且可能会导致法律同意,因为设备所有者并不完全知道您是否使用他们的 GSM 网络进行网络抓取,因为它们是由移动网络运算符提供的。
例子:
- 创建代理服务器池并轮换或迭代它们。
- 导入请求模块并将GET请求与代理一起发送到“https://www.geeksforgeeks.org/”。
句法:
requests.get(url, proxies={“http”: proxy, “https”: proxy})
- 如果没有连接错误,发送GET请求后收到的响应是当前代理服务器的IP地址。
程序:
Python3
# Import the required Modules
import requests
# Create a pool of proxies
proxies = {
'http://114.121.248.251:8080',
'http://222.85.190.32:8090',
'http://47.107.128.69:888',
'http://41.65.146.38:8080',
'http://190.63.184.11:8080',
'http://45.7.135.34:999',
'http://141.94.104.25:8080',
'http://222.74.202.229:8080',
'http://141.94.106.43:8080',
'http://191.101.39.96:80'
}
url = 'https://www.geeksforgeeks.org/'
# Iterate the proxies and check if it is working.
for proxy in proxies:
try:
# https://ipecho.net/plain returns the ip address
# of the current session if a GET request is sent.
page = requests.get(url,
proxies={"http": proxy, "https": proxy})
# Prints Proxy server IP address if proxy is alive.
print("Status OK, Output:", page.text)
except OSError as e:
# Proxy returns Connection error
print(e)
Python3
# Create a list of User-Agents
import requests
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) \
AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 \
Safari/537.2'}
response = requests.get(url, headers=header)
# Use UserAgent from fake_useragent module
import requests
from fake_useragent import UserAgent
ua = UserAgent()
header = {'User-Agent':str(ua.chrome)}
response = requests.get(url, headers=header)
Python3
# Using Selenium Chrome Webdriver to create
# a headless browser
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe",
chrome_options=options)
driver.get(url)
用户代理
- User-Agent 请求头是一个字符,字符串让服务器和网络对等体识别请求用户代理的应用程序、操作系统、供应商和/或版本。
- 一些网站需要主要浏览器的 User-Agent 否则它不允许查看内容,所以最好的方法是创建一个假用户代理列表并迭代它们或使用来自fake-useragent模块的UserAgent并将其作为请求网站时的标题。
例子:
蟒蛇3
# Create a list of User-Agents
import requests
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) \
AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 \
Safari/537.2'}
response = requests.get(url, headers=header)
# Use UserAgent from fake_useragent module
import requests
from fake_useragent import UserAgent
ua = UserAgent()
header = {'User-Agent':str(ua.chrome)}
response = requests.get(url, headers=header)
引用头
- Referer 标头是一个 HTTP 请求标头,它让站点知道您来自哪个站点。
- 如果您来自 Google,请在发送 GET 请求时在 referer 标头中提供 referer_url。
句法:
requests.get(url, headers={‘referer’: referer_url})
无头浏览器
- 在无头模式下使用Selenium/Puppeteer会好得多,因为网站是通过自动化浏览器来抓取的。
- 它主要用于废弃动态网站,并且可以在此处自动执行分页、身份验证等许多功能。
- JavaScript 命令也可以在这里执行。
例子:
蟒蛇3
# Using Selenium Chrome Webdriver to create
# a headless browser
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(executable_path="C:/chromedriver.exe",
chrome_options=options)
driver.get(url)
时间间隔
- 最好在代码中使用 time 模块应用一些随机时间间隔来增加持续时间,从而减少阻塞的机会。
例子:
time.sleep(1) # Sleeps for 1 second
验证码解决
- 很少有网站通过验证码检测网络爬虫,这可以通过实现验证码解决服务或等待几个小时或更改IP地址恢复抓取来解决。
- 这些服务需要额外收费,并且可能会增加从网站上抓取数据的时间。如果您选择使用 CAPTCHA 解决服务,请考虑您可能需要承担的额外时间和费用。
有一些 CAPTCHA 解决服务,例如:
- 反验证码。
- 死亡验证码
避免蜜罐陷阱
- 许多网站会尝试通过放入只有爬虫才会跟踪的隐形链接来检测网络爬虫。
- 检测链接是否设置了“display: none”或“visibility: hidden” CSS 属性设置,并应避免关注该链接,否则它会将您识别为抓取工具。蜜罐是智能网站管理员检测爬虫并阻止用户发出的所有请求的最简单方法之一。
检测网站更改
- 许多网站出于多种原因更改布局,这通常会导致抓取工具失败。
- 另外,有些网站在意想不到的地方会有不同的布局。
- 所以应该有一个完美的监控系统来检测布局的变化并给出修复代码的警报。
所以这些是您可以避免在网络抓取过程中被抓住的方法。