我正在使用Python
来抓取页面。到目前为止,我没有遇到任何复杂的问题。
我试图抓取的网站使用了大量安全检查,并有一些机制来防止抓取。
使用Requests
和lxml
在被IP禁止之前,我能够抓取大约100-150页。有时我甚至会在第一次请求时被禁止(新的IP,之前没有使用,不同的C块)。我试过使用欺骗标题,在请求之间随机化时间,仍然是相同的。
我尝试过使用Selenium,我的效果更好。有了Selenium,在被禁止之前,我能够刮掉大约600-650页。在这里,我还尝试随机化请求(3-5秒之间,并在每300个请求上调用time.sleep(300)
)。尽管如此,我被禁止了。
从这里我可以得出结论,如果网站在一个打开的浏览器会话中请求超过X个页面,或者类似的东西,它们会禁止IP。
根据您的经验,我还应该尝试什么? 将在Selenium中关闭和打开浏览器帮助(例如在每100个请求关闭并打开浏览器之后)。我正在考虑尝试使用代理,但是大约有几百万个页面,它会非常广泛。
答案 0 :(得分:13)
如果您切换到Scrapy
web-scraping framework,您可以重复使用一些防止和解决禁令的事情:
这是根据Scrapy服务器和您正在抓取的网站的负载自动限制抓取速度的扩展程序。
scrapy-fake-useragent
中间件旋转用户代理:使用假冒的每个请求提供的随机用户代理
转动IP地址:
您也可以通过本地代理&运行 TOR :
答案 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
中使用了tor
和python3
。
打开终端并输入:
curl --socks5-hostname localhost:9050 <http://site-that-blocked-you.com>
如果你看到结果就行了。
现在我们应该在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())
如果你看到Congratulations. This browser is configured to use Tor.
,它也在python中工作,这意味着你正在使用tor进行网页抓取。