首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中的抓取-防止IP禁令

Python中的抓取-防止IP禁令
EN

Stack Overflow用户
提问于 2016-02-01 14:36:57
回答 3查看 35.2K关注 0票数 19

我正在使用Python来刮页。直到现在我还没有什么复杂的问题。

我试图刮掉的站点使用了大量的安全检查,并且有一些机制来防止刮伤。

使用Requestslxml,我能够在被IP禁止之前刮掉大约100到150页。有时我甚至被禁止第一次请求(新的IP,以前没有使用,不同的C块)。我尝试过欺骗头,在请求之间随机化时间,仍然一样。

我试过硒,结果好多了。使用Selenium,我能够在被禁止之前刮掉大约600-650页。在这里,我还尝试将请求随机化(在3-5秒之间,并对每300次请求进行time.sleep(300)调用)。尽管如此,我还是被禁止了。

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

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

EN

回答 3

Stack Overflow用户

发布于 2016-02-01 15:12:39

如果您要切换到web抓取框架,您将能够重用许多防止和处理禁止的东西:

  • 内置AutoThrottle扩展

这是一个自动节流爬行速度的扩展,基于抓取服务器和您正在爬行的网站的负载。

使用每个请求都由假用户代理提供的随机用户代理。

  • 旋转IP地址
代码语言:javascript
复制
- [Setting Scrapy proxy middleware to rotate on each request](https://stackoverflow.com/questions/20792152/setting-scrapy-proxy-middleware-to-rotate-on-each-request)
- [`scrapy-proxies`](https://github.com/aivarsk/scrapy-proxies)

  • 您还可以通过本地代理& TOR运行它。
代码语言:javascript
复制
- [Scrapy: Run Using TOR and Multiple Agents](http://pkmishra.github.io/blog/2013/03/18/how-to-run-scrapy-with-TOR-and-multiple-browser-agents-part-1-mac/)

票数 17
EN

Stack Overflow用户

发布于 2018-03-02 08:02:53

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

  1. 下载 和安装tor browser
  2. 测试器

开放终端和类型:

代码语言:javascript
复制
curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>

如果你看到结果,它就成功了。

  1. 现在我们应该在python中进行测试。现在运行以下代码
代码语言:javascript
复制
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())

如果你看到

祝贺你。此浏览器配置为使用Tor。

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

票数 12
EN

Stack Overflow用户

发布于 2016-02-01 14:48:12

你可以用代理。

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

您可以使用一个IP地址进行迭代,只加载x个页面,并在被禁止之前停止。

代码语言:javascript
复制
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)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35133200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档