【问题标题】:Python requests, change IP addressPython请求,更改IP地址
【发布时间】:2018-07-04 23:42:04
【问题描述】:

我正在使用以下 Python 代码为网站编写一个网络爬虫:

import requests

def scrape(url):
    req = requests.get(url)
    with open('out.html', 'w') as f:
        f.write(req.text)

它工作了几次,但网站返回了一个错误的 HTML 页面(当我打开浏览器时,我需要完成一个验证码)。

有没有办法避免这种“禁令”,例如更改 IP 地址?

【问题讨论】:

  • 如果禁令是基于你的 IP 地址,那么更改 IP 地址可能会解决这个问题,但这不是 python 可以控制的。
  • 嗯,要更改 IP 地址,您可以在具有不同 IP 地址的不同系统上运行完全相同的代码...
  • 您是否考虑过,如果您收到banned 并且有验证码,那么网站所有者可能不希望您抓取他们的网站?
  • 你为什么不尝试使用代理?

标签: python http python-requests


【解决方案1】:

正如 cmets 和您自己所说,更改 IP 可能会有所帮助。要轻松做到这一点,请查看 vpngate.py:

https://gist.github.com/Lazza/bbc15561b65c16db8ca8

链接中提供了操作方法。

玩得开心

【讨论】:

  • 这是一个不错的选择,我会尝试修改代码,使其更易于作为函数使用。
【解决方案2】:

您可以将代理与请求库一起使用。您可以在 https://www.sslproxies.org/http://free-proxy.cz/en/proxylist/country/US/https/uptime/level3 等几个不同的网站上找到一些免费代理,但并非所有网站都能正常工作,因此不应信任它们来处理敏感信息。

示例:

proxy = {
    "https": 'https://158.177.252.170:3128',
    "http": 'https://158.177.252.170:3128' 
}
response=requests.get('https://httpbin.org/ip', proxies=proxy)

【讨论】:

  • 这太有用了。我所做的是使用了免费代理网站的export ip:port功能,能够生成一个超过100个的列表。我每次进行API查询时都从该列表中随机选择,完全避免了速率限制!跨度>
【解决方案3】:

我最近在另一个问题 here 上回答了这个问题,但是使用 requests-ip-rotator 库通过 API 网关轮换 IP 通常是最有效的方法。
每个区域的前一百万个请求是免费的,这意味着您不必将数据提供给不可靠的代理站点。

【讨论】:

    【解决方案4】:

    迟到的答案,我发现这是在寻找 IP 欺骗,但对于 OP 的问题 - 正如一些 cmets 指出的那样,您可能会或可能不会真正被禁止。这里有两点需要考虑:

    1. 软禁令:他们不喜欢机器人。过去对我有用的简单解决方案是添加标题,因此他们认为您是浏览器,例如,

      req = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})

    2. 页面上的活动元素、脚本或弹出窗口,它们充当内容门,本身不是禁令 - 例如,国家/语言选择器、cookie 配置、调查等需要用户输入。不那么简单的解决方案:使用像 Selenium + chromedriver 这样的 webdriver 来渲染包含 JS 的页面,然后添加“用户”点击来处理问题。

    【讨论】:

    • 哦,如果你反复访问同一个站点,最好使用会话: import requests sesh = requests.Session() req = sesh.get(url, headers={'User-Agent ': 'Mozilla/5.0'})
    猜你喜欢
    • 2023-03-03
    • 2017-01-05
    • 2021-08-06
    • 2011-07-31
    • 1970-01-01
    • 2018-01-18
    • 2015-02-21
    • 2015-06-21
    • 2019-01-31
    相关资源
    最近更新 更多