【问题标题】:How to get around Scrapy failed responses (status code 416, 999, ...)如何绕过 Scrapy 失败的响应(状态码 416、999,...)
【发布时间】:2015-04-27 02:19:28
【问题描述】:

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

【问题讨论】:

    标签: python web-scraping scrapy


    【解决方案1】:

    网站正在查看附加到您的请求的标头,并确定您不是浏览器,因此阻止了您的请求。

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

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

    如何将这些标头与您的 Scrapy 请求一起发送是 documented here

    【讨论】:

    • 只是为了补充答案,您可以使用中间件为 Scrapy 发出的每个请求设置用户代理设置。我构建了一个简单的中间件,它使用fake-useragent 分配随机用户代理,请参阅scrapy-fake-useragent
    • 我使用 fake-useragent 更改了 User-Agent。它现在可以让我抓取一些以前无法抓取的网站,但我仍然无法访问 crunchbase。有什么想法..?
    • 我已经能够通过添加所有标题成功连接到该站点。不确定需要哪些确切的内容,但您可以通过使用 Chrome 技巧通过反复试验找到这一点。
    • manta.com/mb_33_C0_000/agriculture 我也面临同样的问题。并尝试使用设置标题和用户代理。不幸的是,它不起作用,您应用的解决方案是什么?
    • alecxe 提供的解决方案对我有用。只需通过 pip 安装 fake-useragent 和 scrapy-fake-useragent,我就可以请求一个网站。谢谢!
    【解决方案2】:

    你是对的http://crunchbase.com 阻止机器人。它仍然提供一个 HTML 页面“Pardon our Interruption”,它解释了为什么他们认为您是 bot,并提供了一个请求解除阻止的表单(即使状态代码为 416)。

    据 Distil Networks 营销副总裁称,Crunchbase 使用 distil networks 反机器人。

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

    经过几次尝试,我的浏览器访问也被成功阻止了。我提交了取消阻止请求并再次启用。不确定其他受 distil 保护的站点,但您可以尝试很好地询问 crunchbase 管理。

    【讨论】:

      【解决方案3】:

      如果您使用 Chrome 作为用户代理,则需要将“br”和“sdch”作为可接受的编码。

      这是一个示例:

      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),进入“网络”选项卡,重新加载页面,单击红点停止录制,单击一个文件,在右侧您将看到选项卡“请求标题”

      编辑: 如果你想使用真正的 Web 引擎,比如 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 替换了页面中的某些文本,使用这种方法您可以获得新文本

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-23
        • 2017-10-31
        • 2013-10-06
        相关资源
        最近更新 更多