Scrapy 找不到 Nokogiri 找到的 Xpath
Scrapy failed to find Xpath that Nokogiri found
我刚开始为一个网站工作,该网站需要从多个 stores/sites...
中抓取产品
我对python和scrapy有点陌生,原来的代码都是在scrapy里面写的,所以在测试爬虫和Xpaths的时候,我用的是Scrapy,也打开了另外一个console,用nokogiri测试(Ruby gem)
在特定站点中,我无法使用 scrapy 提取某些内容,但我发现我可以使用相同的 xpathurl 从相同的 url 中获取此内容
这是两种情况下使用的代码片段:
Scrapy
yield Request(product_url,headers={'User-Agent':'curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3'}, callback=self.parse_item)
def parse_item(self, response):
script = response.xpath('//script[contains(text(),"var ProductViewJSON")]')
yield {
'url': response.url,
'script length': len(script),
'script': script,
}
它产生以下结果:
{"url": "http://www.pullandbear.com/eg/en/man/accessories/pack-of-3-assorted-bracelets-c29537p100036212.html", "script length": 0, "script": []},
诺科吉里
require 'nokogiri'
require 'open-uri'
html_data = open('http://www.pullandbear.com/eg/en/man/accessories/pack-of-3-assorted-bracelets-c29537p100036212.html', 'User-Agent' => 'curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3').read
nokogiri_object = Nokogiri::HTML(html_data)
script = nokogiri_object.xpath('//script[contains(text(),"var ProductViewJSON")]')
script.length # produces 1
谁能帮我解释一下,请注意这个 scrapy 代码是 运行,我刚刚被报告说它已经停止了,主要问题是需要添加 headers
希望我说得足够清楚,感谢您的关注:)
编辑
我尝试从 scrapy shell 中解析 url,使用与蜘蛛请求和 nokogiri 请求相同的用户代理,它对我有用,它找到了与 xpath 匹配的元素, 但在蜘蛛中仍然没有 运行...
原因是您使用的User-Agent。
我用一个简单的 scrapy shell(默认 User-Agent)尝试了这个网站,我得到了以下响应:
>>> response.body
'<HTML><HEAD>\n<TITLE>Access Denied</TITLE>\n</HEAD><BODY>\n<H1>Access Denied</H1>\n \nYou don\'t have permission to access "http://www.pullandbear.com/eg/en/man/accessories/pack-of-3-assorted-bracelets-c29537p100036212.html" on this server.<P>\nReference #18.3f496768.1453197808.1ef09a53\n</BODY>\n</HTML>\n'
所以在你的Request
中改变你的User-Agent(或者通过scrapy的设置设置一次)你应该准备好收集你的信息了。
如您所见,服务器 returns 拒绝访问 User-Agent 不是浏览器的站点 -- 就像您的 cURL 代理一样。
如果我使用以下 User-Agent 启动 shell:
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36'
并执行你的 XPath 我得到以下结果:
>>> response.xpath('//script[contains(text(),"var ProductViewJSON")]')
[<Selector xpath='//script[contains(text(),"var ProductViewJSON")]' data=u'<script type="text/javascript">\r\n\tvar Pr'>]
我刚开始为一个网站工作,该网站需要从多个 stores/sites...
中抓取产品我对python和scrapy有点陌生,原来的代码都是在scrapy里面写的,所以在测试爬虫和Xpaths的时候,我用的是Scrapy,也打开了另外一个console,用nokogiri测试(Ruby gem)
在特定站点中,我无法使用 scrapy 提取某些内容,但我发现我可以使用相同的 xpathurl 从相同的 url 中获取此内容
这是两种情况下使用的代码片段:
Scrapy
yield Request(product_url,headers={'User-Agent':'curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3'}, callback=self.parse_item) def parse_item(self, response): script = response.xpath('//script[contains(text(),"var ProductViewJSON")]') yield { 'url': response.url, 'script length': len(script), 'script': script, }
它产生以下结果:
{"url": "http://www.pullandbear.com/eg/en/man/accessories/pack-of-3-assorted-bracelets-c29537p100036212.html", "script length": 0, "script": []},
诺科吉里
require 'nokogiri' require 'open-uri' html_data = open('http://www.pullandbear.com/eg/en/man/accessories/pack-of-3-assorted-bracelets-c29537p100036212.html', 'User-Agent' => 'curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3').read nokogiri_object = Nokogiri::HTML(html_data) script = nokogiri_object.xpath('//script[contains(text(),"var ProductViewJSON")]') script.length # produces 1
谁能帮我解释一下,请注意这个 scrapy 代码是 运行,我刚刚被报告说它已经停止了,主要问题是需要添加 headers
希望我说得足够清楚,感谢您的关注:)
编辑
我尝试从 scrapy shell 中解析 url,使用与蜘蛛请求和 nokogiri 请求相同的用户代理,它对我有用,它找到了与 xpath 匹配的元素, 但在蜘蛛中仍然没有 运行...
原因是您使用的User-Agent。
我用一个简单的 scrapy shell(默认 User-Agent)尝试了这个网站,我得到了以下响应:
>>> response.body
'<HTML><HEAD>\n<TITLE>Access Denied</TITLE>\n</HEAD><BODY>\n<H1>Access Denied</H1>\n \nYou don\'t have permission to access "http://www.pullandbear.com/eg/en/man/accessories/pack-of-3-assorted-bracelets-c29537p100036212.html" on this server.<P>\nReference #18.3f496768.1453197808.1ef09a53\n</BODY>\n</HTML>\n'
所以在你的Request
中改变你的User-Agent(或者通过scrapy的设置设置一次)你应该准备好收集你的信息了。
如您所见,服务器 returns 拒绝访问 User-Agent 不是浏览器的站点 -- 就像您的 cURL 代理一样。
如果我使用以下 User-Agent 启动 shell:
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.111 Safari/537.36'
并执行你的 XPath 我得到以下结果:
>>> response.xpath('//script[contains(text(),"var ProductViewJSON")]')
[<Selector xpath='//script[contains(text(),"var ProductViewJSON")]' data=u'<script type="text/javascript">\r\n\tvar Pr'>]