如何使用代理在Python中轮换IP地址 – 大规模网络抓取

2021年11月16日18:47:30 发表评论 886 次浏览

Python如何使用代理轮换IP地址?本文带你了解如何通过防止网站禁止你的 IP 地址同时使用 Python 中的不同代理方法抓取它们来大规模执行网络抓取。

代理是一个服务器应用程序充当客户端和服务器之间的请求从客户端请求特定服务(中介HTTP,SSL等)。

Python代理轮换IP地址示例:使用代理服务器时,不是直接连接到目标服务器并请求你想要请求的任何内容,而是将请求定向到评估请求并执行它并返回响应的代理服务器,这是一个简单的维基百科演示代理服务器:

如何使用代理在Python中轮换IP地址 - 大规模网络抓取
如何使用代理在Python中轮换IP地址 - 大规模网络抓取

网页抓取专家经常使用多个代理来防止网站禁止其 IP 地址。代理还有其他一些好处,包括绕过过滤器和审查、隐藏你的真实 IP 地址等。

如何使用代理轮换IP地址?在本教程中,你将学习如何使用请求库在 Python 中使用代理,我们还将使用stem库,它是Tor的 Python 控制器库,让我们安装它们:

pip3 install bs4 requests stem

相关: 如何在 Python 中制作子域扫描仪。

使用免费的可用代理

Python如何使用代理轮换IP地址?首先,有一些网站提供免费代理列表使用,我构建了一个功能来自动抓取这个列表:

import requests
import random
from bs4 import BeautifulSoup as bs

def get_free_proxies():
    url = "https://free-proxy-list.net/"
    # get the HTTP response and construct soup object
    soup = bs(requests.get(url).content, "html.parser")
    proxies = []
    for row in soup.find("table", attrs={"id": "proxylisttable"}).find_all("tr")[1:]:
        tds = row.find_all("td")
        try:
            ip = tds[0].text.strip()
            port = tds[1].text.strip()
            host = f"{ip}:{port}"
            proxies.append(host)
        except IndexError:
            continue
    return proxies

但是,当我尝试使用它们时,它们中的大多数都超时了,我过滤了一些可用的:

proxies = [
    '167.172.248.53:3128',
    '194.226.34.132:5555',
    '203.202.245.62:80',
    '141.0.70.211:8080',
    '118.69.50.155:80',
    '201.55.164.177:3128',
    '51.15.166.107:3128',
    '91.205.218.64:80',
    '128.199.237.57:8080',
]

如何使用代理轮换IP地址?这个列表可能不会永远存在,事实上,当你阅读本教程时,其中大部分将停止工作(所以你每次想要使用新的代理服务器时都应该执行上述功能)。

下面的函数接受一个代理列表并创建一个请求会话,该会话随机选择一个传递的代理:

def get_session(proxies):
    # construct an HTTP session
    session = requests.Session()
    # choose one random proxy
    proxy = random.choice(proxies)
    session.proxies = {"http": proxy, "https": proxy}
    return session

让我们通过向返回我们 IP 地址的网站发出请求来测试这一点:

for i in range(5):
    s = get_session(proxies)
    try:
        print("Request page with IP:", s.get("http://icanhazip.com", timeout=1.5).text.strip())
    except Exception as e:
        continue

这是我的输出:

Request page with IP: 45.64.134.198
Request page with IP: 141.0.70.211
Request page with IP: 94.250.248.230
Request page with IP: 46.173.219.2
Request page with IP: 201.55.164.177

如你所见,这些是工作代理服务器的一些 IP 地址,而不是我们的真实 IP 地址(尝试在你的浏览器中访问该网站,你将看到你的真实 IP 地址)。

免费代理往往会很快消亡,大多在几天甚至几小时内消亡,并且通常会在我们的抓取项目结束之前消亡。为了防止这种情况,你需要为大型数据提取项目使用高级代理,有许多提供商为你轮换 IP 地址。众所周知的解决方案之一是Crawlera。我们将在本教程的最后一节详细讨论它。

使用 Tor 作为代理

Python代理轮换IP地址示例:你还可以使用 Tor 网络来轮换 IP 地址:

import requests
from stem.control import Controller
from stem import Signal

def get_tor_session():
    # initialize a requests Session
    session = requests.Session()
    # setting the proxy of both http & https to the localhost:9050 
    # this requires a running Tor service in your machine and listening on port 9050 (by default)
    session.proxies = {"http": "socks5://localhost:9050", "https": "socks5://localhost:9050"}
    return session

def renew_connection():
    with Controller.from_port(port=9051) as c:
        c.authenticate()
        # send NEWNYM signal to establish a new clean connection through the Tor network
        c.signal(Signal.NEWNYM)

if __name__ == "__main__":
    s = get_tor_session()
    ip = s.get("http://icanhazip.com").text
    print("IP:", ip)
    renew_connection()
    s = get_tor_session()
    ip = s.get("http://icanhazip.com").text
    print("IP:", ip)

注意: 只有在你的机器上安装了 Tor(前往此链接 以正确安装它)并且配置良好(ControlPort  9051 已启用,请查看此 stackoverflow 答案 以获取更多详细信息)时,上述代码才应起作用 。

这将创建一个具有 Tor IP 地址的会话并发出 HTTP 请求,然后通过发送 NEWNYM 信号(告诉 Tor 建立新的干净连接)来更新连接以更改 IP 地址并发出另一个请求,这是输出:

IP: 185.220.101.49

IP: 109.70.100.21

伟大的!但是,当你使用 Tor 网络体验网页抓取时,你很快就会意识到它在大多数情况下都非常慢,这就是为什么推荐的方法如下。

使用爬虫

Python如何使用代理轮换IP地址?Scrapinghub 的 Crawlera 允许你快速可靠地抓取,它在内部管理和轮换代理,因此如果你被禁止,它会自动检测并为你轮换 IP 地址。

Crawlera 是一个智能代理网络,专为网页抓取和抓取而设计。它的工作很明确:让你作为网络​​抓取工具的生活更轻松。它可以帮助你使用任何网络抓取工具从任何网站获得成功的请求并大规模提取数据。

如何使用代理在Python中轮换IP地址 - 大规模网络抓取

凭借其简单的 API,你在抓取时发出的请求将通过高质量代理池进行路由。必要时,它会自动在请求之间引入延迟并删除/添加 IP 地址以克服不同的爬行挑战。

Python代理轮换IP地址示例 - 以下是在 Python中将 Crawlera 与请求库一起使用的方法:

import requests

url = "http://icanhazip.com"
proxy_host = "proxy.crawlera.com"
proxy_port = "8010"
proxy_auth = "<APIKEY>:"
proxies = {
       "https": f"https://{proxy_auth}@{proxy_host}:{proxy_port}/",
       "http": f"http://{proxy_auth}@{proxy_host}:{proxy_port}/"
}

r = requests.get(url, proxies=proxies, verify=False)

如何使用代理轮换IP地址?注册计划后,你将获得一个 API 密钥,你将在其中替换proxy_auth.

因此,这就是 Crawlera 为你所做的:

  • 你使用其单一端点 API 发送 HTTP 请求。
  • 它会自动选择、轮换、限制 IP 并将其列入黑名单以检索目标数据。
  • 它处理请求头并维护会话。
  • 你收到一个成功的响应请求。

结论

Python如何使用代理轮换IP地址?有几种代理类型,包括透明代理、匿名代理、精英代理。如果你使用代理的目的是防止网站禁止你的抓取工具,那么精英代理是你的最佳选择,它会让你看起来像一个根本不使用代理的普通互联网用户。

此外,一个额外的反抓取措施是使用旋转用户代理,每次你发送一个不断变化的欺骗标头,说你是一个普通的浏览器。

最后,Crawlera 通过自动为你管理代理来节省你的时间和精力,它还提供 14 天的免费试用,因此你可以毫无风险地试用它。如果你需要代理解决方案,我强烈建议你尝试 Crawlera

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: