如何绕过Scrapy失败的回复(状态代码416,999,...)

时间:2015-04-27 02:19:29

标签: python web-scraping scrapy

我正在使用Scrapy编写脚本,但我遇到了失败的HTTP响应问题。具体来说,我正试图从“https://www.crunchbase.com/”中抓取,但我一直在获取HTTP状态码416.网站是否可以阻止蜘蛛抓取其内容?

3 个答案:

答案 0 :(得分:6)

发生的事情是网站正在查看您的请求附带的标头,并确定您不是浏览器,从而阻止了您的请求。

但是,如果您决定发送与浏览器相同的标题,那么网站无法区分Scrapy和Firefox / Chrome / IE / Safari。在Chrome中,打开网络工具控制台,您将看到它正在发送的标头。将这些标题复制到您的Scrapy请求中,一切都会正常工作。

您可能希望首先向浏览器发送相同的User-Agent标题。

如何使用您的Scrapy请求发送这些标头是documented here

答案 1 :(得分:1)

你是对的http://crunchbase.com阻止机器人。它仍然提供HTML页面"请原谅我们的中断",这解释了为什么他们认为你是机器人,并提供一个表单来请求解锁(即使状态代码为416)。

根据Distil Networks营销副总裁的说法,Crunchbase使用蒸馏网络抗菌药。

https://www.quora.com/How-does-distil-networks-bot-and-scraper-detection-work

经过多次尝试,甚至我的浏览器访问也成功阻止了。我提交了一个解锁请求,并再次启用。不确定其他蒸馏保护站点,但你可以尝试很好地询问crunchbase管理。

答案 2 :(得分:1)

你需要拥有" br"和" sdch"如果您使用Chrome作为用户代理,则为已接受的编码。

以下是一个示例:

html_headers = {
    'Accept':'*/*',
    'Accept-Encoding':'gzip, deflate, br, sdch',
    'Connection':'keep-alive',
    'Host':'www.crunchbase.com',
    'Referer':'https://www.crunchbase.com/',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'
}
res = requests.get('https://www.crunchbase.com/', headers=html_headers)

如前所述,在Chrome中,打开开发人员控制台(右上角的三个点 - >更多工具 - >开发人员控制台,或按Ctrl + Shift + I),转到& #34;网络"选项卡,重新加载页面,单击红点以停止录制,单击文件,然后在右侧您将看到选项卡"请求标题"

修改 如果你想使用真正的网络引擎,比如WebKit,你可能根本不需要任何技巧。 实施例

from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl
from PyQt5.QtWebKitWidgets import QWebPage

class Client(QWebPage):

    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebPage.__init__(self)
        self.loadFinished.connect(self.on_page_load)
        self.mainFrame().load(QUrl(url))
        self.app.exec_()

    def on_page_load(self):
        self.app.quit()

cont = Client(url).mainFrame().toHtml()
soup = bs.BeautifulSoup(cont,'lxml')

这种方法的另一个优点是它可以处理JavaScript,因此可以实现动态加载。例如。如果页面加载上调用的Javascript替换页面中的某些文本,使用此方法可以获得新文本