在Python中刮擦 - 防止IP禁令

时间:2016-02-01 14:36:57

标签: python selenium web-scraping screen-scraping

我正在使用Python来抓取页面。到目前为止,我没有遇到任何复杂的问题。

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

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

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

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

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

3 个答案:

答案 0 :(得分:13)

如果您切换到Scrapy web-scraping framework,您可以重复使用一些防止和解决禁令的事情:

  

这是根据Scrapy服务器和您正在抓取的网站的负载自动限制抓取速度的扩展程序。

  

使用假冒的每个请求提供的随机用户代理

答案 1 :(得分: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)

答案 2 :(得分:3)

我也有这个问题。我在urllib中使用了torpython3

  1. download并安装浏览器
  2. 测试
  3. 打开终端并输入:

    curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>
    

    如果你看到结果就行了。

    1. 现在我们应该在python中测试。现在运行此代码

      import socks import socket from urllib.request import Request, urlopen from bs4 import BeautifulSoup

      #set socks5 proxy to use tor

      socks.set_default_proxy(socks.SOCKS5, "localhost", 9050) socket.socket = socks.socksocket req = Request('http://check.torproject.org', headers={'User-Agent': 'Mozilla/5.0', }) html = urlopen(req).read() soup = BeautifulSoup(html, 'html.parser') print(soup('title')[0].get_text())

    2. 如果你看到Congratulations. This browser is configured to use Tor.,它也在python中工作,这意味着你正在使用tor进行网页抓取。