在Python中刮擦 - 防止IP禁令

Rhy*_*Guy 12 python selenium screen-scraping web-scraping

我正在Python用来刮页.到现在为止,我没有任何复杂的问题.

我正在尝试抓取的网站使用了大量的安全检查,并有一些机制来防止抓取.

使用Requestslxml我在被IP禁止之前能够刮掉大约100-150页.有时我甚至会在第一次请求时被禁止(新的IP,之前没有使用,不同的C块).我试过使用欺骗标题,在请求之间随机化时间,仍然是相同的.

我尝试过Selenium,我得到了更好的结果.有了Selenium,在被禁止之前,我能够刮掉大约600-650页.在这里,我也尝试随机化请求(3-5秒之间,并time.sleep(300)在每300个请求上调用).尽管如此,我被禁止了.

从这里我可以得出结论,如果网站在一个打开的浏览器会话中请求超过X个页面或类似的东西,那么它们会禁止IP.

根据您的经验,我还应该尝试什么? 将在Selenium中关闭和打开浏览器帮助(例如在每100个请求关闭并打开浏览器之后).我正在考虑尝试使用代理,但是有大约数百万个页面,而且它将非常广泛.

ale*_*cxe 14

如果您切换到ScrapyWeb抓取框架,您将能够重用许多用于防止和解决禁止的事情:

这是基于Scrapy服务器和您正在抓取的网站的负载自动限制爬网速度的扩展.

使用每个请求由fake-useragent提供的随机User-Agent


Moh*_*eza 11

我也有这个问题。我使用urllibtorin python3

  1. 下载并安装tor浏览器
  2. 测试员

打开终端并输入:

curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>
Run Code Online (Sandbox Code Playgroud)

如果你看到结果,它就起作用了。

  1. 现在我们应该在python中进行测试。现在运行这段代码
curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>
Run Code Online (Sandbox Code Playgroud)

如果你看到

恭喜。此浏览器配置为使用 Tor。

它也适用于python,这意味着您正在使用tor进行网络抓取。

  • 只是想更新一下,tor 浏览器现在正在侦听端口 9150 而不是 9050。 (2认同)

par*_*par 5

你可以使用代理.

您可以以非常便宜的价格购买数百种IP,并像以前一样使用硒.此外,我建议改变您使用的浏览器和其他用户代理参数.

您可以使用单个IP地址迭代以仅加载x个页面并在被禁止之前停止.

def load_proxy(PROXY_HOST,PROXY_PORT):
        fp = webdriver.FirefoxProfile()
        fp.set_preference("network.proxy.type", 1)
        fp.set_preference("network.proxy.http",PROXY_HOST)
        fp.set_preference("network.proxy.http_port",int(PROXY_PORT))
        fp.set_preference("general.useragent.override","whater_useragent")
        fp.update_preferences()
        return webdriver.Firefox(firefox_profile=fp)
Run Code Online (Sandbox Code Playgroud)