如何绕过 Scrapy 失败的响应(状态代码 416、999,...)
How to get around Scrapy failed responses (status code 416, 999, ...)
我正在使用 Scrapy 编写脚本,但我遇到了失败的 HTTP 响应问题。具体来说,我试图从“https://www.crunchbase.com/”抓取,但我不断收到 HTTP 状态代码 416。网站可以阻止蜘蛛抓取他们的内容吗?
发生的事情是网站正在查看附加到您的请求的 headers 并确定您不是浏览器并因此阻止您的请求。
但是,如果您决定发送与浏览器相同的 header,网站无法区分 Scrapy 和 Firefox/Chrome/IE/Safari。在 Chrome 中,打开网络工具控制台,您将准确地看到它发送的 headers。将这些 header 复制到您的 Scrapy 请求中,一切都会正常。
您可能希望首先发送与浏览器相同的 User-Agent
header。
如何使用您的 Scrapy 请求发送这些 headers documented here。
你是对的 http://crunchbase.com 阻止机器人。它仍然提供一个 HTML 页面 "Pardon our Interruption",这解释了为什么他们认为你是机器人,并提供了一个请求解锁的表单(即使状态代码为 416)。
根据 Distil Networks 营销副总裁的说法,Crunchbase 使用 distil networks antibot。
https://www.quora.com/How-does-distil-networks-bot-and-scraper-detection-work
经过多次尝试,连我的浏览器访问都被成功阻止了。我提交了解锁请求并再次启用。不确定其他受 distil 保护的站点,但您可以尝试很好地询问 crunchbase 管理。
如果您使用 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),转到 "Network" 选项卡,重新加载页面,单击红点停止录制,单击一个文件,然后在右侧您将看到选项卡 "Requests header"
编辑:
如果您想使用真正的 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 替换页面中的一些文本,使用这种方法您可以获得新文本
我正在使用 Scrapy 编写脚本,但我遇到了失败的 HTTP 响应问题。具体来说,我试图从“https://www.crunchbase.com/”抓取,但我不断收到 HTTP 状态代码 416。网站可以阻止蜘蛛抓取他们的内容吗?
发生的事情是网站正在查看附加到您的请求的 headers 并确定您不是浏览器并因此阻止您的请求。
但是,如果您决定发送与浏览器相同的 header,网站无法区分 Scrapy 和 Firefox/Chrome/IE/Safari。在 Chrome 中,打开网络工具控制台,您将准确地看到它发送的 headers。将这些 header 复制到您的 Scrapy 请求中,一切都会正常。
您可能希望首先发送与浏览器相同的 User-Agent
header。
如何使用您的 Scrapy 请求发送这些 headers documented here。
你是对的 http://crunchbase.com 阻止机器人。它仍然提供一个 HTML 页面 "Pardon our Interruption",这解释了为什么他们认为你是机器人,并提供了一个请求解锁的表单(即使状态代码为 416)。
根据 Distil Networks 营销副总裁的说法,Crunchbase 使用 distil networks antibot。
https://www.quora.com/How-does-distil-networks-bot-and-scraper-detection-work
经过多次尝试,连我的浏览器访问都被成功阻止了。我提交了解锁请求并再次启用。不确定其他受 distil 保护的站点,但您可以尝试很好地询问 crunchbase 管理。
如果您使用 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),转到 "Network" 选项卡,重新加载页面,单击红点停止录制,单击一个文件,然后在右侧您将看到选项卡 "Requests header"
编辑: 如果您想使用真正的 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 替换页面中的一些文本,使用这种方法您可以获得新文本