网页抓取代理的完整指南
在计算机网络中,代理服务器是一种服务器应用程序或设备,它充当客户端请求的中介,从提供这些资源的服务器寻求资源。
由于网页抓取需要从 IP 地址向服务器发出大量请求,因此服务器可能会检测到太多请求并可能阻止 IP 地址以停止进一步抓取。为了避免阻塞,使用了代理,并且随着 IP 地址的更改,抓取将继续工作,并且不会导致任何问题。它还有助于隐藏机器的 IP 地址,因为它创建了匿名性。
代理类型
共有三种类型的代理。
- 数据中心代理:这些代理来自云服务提供商,有时被标记为使用它们的人很多,但由于它们更便宜,因此可以为网络抓取活动带来一组代理。
- 住宅 IP 代理:这些代理包含来自本地 ISP 的 IP 地址,因此网站管理员无法检测它是爬虫还是浏览网站的真人。与数据中心代理相比,它们非常昂贵,并且可能会导致法律同意,因为所有者并不完全知道您是否将他们的 IP 用于网络抓取目的。
- 移动 IP 代理:这些代理是私人移动设备的 IP,其工作方式与住宅 IP 代理类似。它们非常昂贵并且可能会导致法律同意,因为设备所有者并不完全知道您是否使用他们的 GSM 网络进行网络抓取,因为它们是由移动网络运算符提供的。
管理代理池
- 识别禁令——代理应该能够检测各种类型的阻止方法并修复潜在的问题——即验证码、重定向、阻止、重影等。
- 重试错误- 如果当前代理存在任何连接问题、阻塞、验证码等,请使用不同的代理服务器重试请求。
- 控制代理- 很少有具有身份验证的网站需要使用相同的 IP 保持会话,否则如果代理服务器发生任何变化,则可能需要再次进行身份验证。
- 添加延迟– 随机化延迟并应用良好的节流,以便网站无法检测到您正在抓取。
- 地理位置- 很少有网站可能需要来自特定国家/地区的 IP,因此代理池应包含来自给定地理位置的代理集。
不推荐使用公共代理,因为它们质量低,而且被认为是危险的,因为如果 SSL 证书配置不正确,它们会感染机器,甚至使网络抓取活动公开。
如果预算较低且需要共享 IP 池,则通常使用共享代理。如果预算更高并且性能是重中之重,那么专用代理池是最佳选择。
代理轮换
从单个 IP 地址发送过多请求清楚地表明您正在自动执行 HTTP/HTTPS 请求,并且网站管理员肯定会阻止您的 IP 地址以停止进一步抓取。最好的选择是创建一个代理池并在来自单个代理服务器的一定数量的请求后迭代/轮换它们。
这减少了 IP 阻塞的机会,并且刮板不受影响。
proxies = {‘http://78.47.16.54:80’, ‘http://203.75.190.21:80’, ‘http://77.72.3.163:80’}
如何在请求模块中使用代理?
- 导入请求模块。
- 创建一个代理池,然后旋转/迭代它们。
- 通过将代理作为参数传递给 URL,使用requests.get()发送GET请求。
- 如果没有连接错误,则返回当前会话的代理服务器地址。
程序:
Python3
import requests
# Initialise proxy and url.
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
# Send a GET request to the url and
# pass the proxy as parameter.
page = requests.get(url,
proxies={"http": proxy, "https": proxy})
# Prints the content of the requested url.
print(page.text)
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://ipecho.net/plain'
# 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)
输出:
114.121.248.251
同样可以应用于多个代理,下面给出了相同的实现。
程序:
蟒蛇3
# 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://ipecho.net/plain'
# 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)
输出: