Python中的网络爬虫 - 防止IP被封禁

20

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

我想要爬取的网站使用了许多安全检查,并且有一些机制来防止爬取。

使用Requestslxml,我能够在被封禁之前爬取大约100-150页。有时我甚至在第一个请求(新的IP,之前没有使用过,不同的C块)上就被封禁了。我已经尝试过伪造标题、随机化请求之间的时间,但结果都相同。

我尝试过用Selenium,获得了更好的结果。使用Selenium,我能够在被封禁之前爬取大约600-650页。在这里,我也尝试了随机请求(3-5秒之间),并在每300个请求上使用time.sleep(300)进行调用。尽管如此,我仍然被封禁了。

从这里我可以得出结论:如果在一个打开的浏览器会话中请求的页面超过X页,则该网站会禁用IP。

根据您的经验,还应该尝试什么? 关闭并重新启动Selenium中的浏览器是否有帮助(例如,在每100个请求之后关闭并重新启动浏览器)?我正在考虑尝试使用代理,但是网站有大约一百万个页面,这将非常昂贵。

3个回答

17
如果您转向Scrapy网络爬虫框架,您将能够重复使用一些旨在防止和解决封禁问题的工具:

这是一个用于根据Scrapy服务器和您正在爬取的网站的负载自动限制爬取速度的扩展。

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


我不是Scrapy的粉丝,但我可能会尝试一下,尽管我不确定它是否会对我有所帮助。我已经使用了你推荐的所有东西,但还是没有能够通过限制。 - RhymeGuy
@RhymeGuy 这只是一个通用答案,以便帮助访问该主题的其他人。对于您的情况,我会说通过代理切换IP是正确的方法。谢谢。 - alecxe

12

我也遇到了这个问题。我在Python3中使用urllibtor

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

打开终端并输入:

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())

如果您看到

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

这也适用于Python,并且这意味着您正在使用Tor进行网络爬取。


3
只是想更新一下,Tor浏览器现在监听的端口号是9150而不是9050。 - Hanzhou Tang
1
无法连接到本地主机。 - Harsh Vardhan
所有这些操作之后,我的IP地址仍然被禁止。 - muinh

6

您可以使用代理。

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

您可以迭代使用单个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)

1
你能推荐一下我可以使用的代理服务吗? - RhymeGuy
谢谢,服务看起来还可以,但不是很便宜。我甚至不确定我为代理支付的钱是否能够覆盖我将收集到的信息的价值。我需要再考虑一下。 - RhymeGuy
如果你要查找的页面被谷歌缓存了,你可以在谷歌中搜索它们,并访问由谷歌爬虫缓存的静态版本。 - Parsa
很不幸,该网站使用登录表单,大多数页面无法在未登录的情况下访问。因此,谷歌无法缓存它们。看来在这种情况下使用代理服务是唯一合理的选择。 - RhymeGuy
如何使用Chrome WebDriver、Selenium和Python更改IP - Mobin Al Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接