Scrapy返回xpath的空列表

时间:2016-11-06 00:58:42

标签: javascript python html web-scraping scrapy

我正在使用Scrapy从openreview网址获取摘要。例如,我想从http://openreview.net/forum?id=Bk0FWVcgx获取摘要,并在执行

$ scrapy shell "http://openreview.net/forum?id=Bk0FWVcgx" $ response.xpath('//span[@class="note_content_value"]').extract()

我回来了[]。此外,当我view(response)时,我会找到一个空白网站file:///var/folders/1j/_gkykr316td7f26fv1775c3w0000gn/T/tmpBehKh8.html

此外,检查openreview网页显示我有脚本元素,这是我以前从未见过的。当我打电话

response.xpath(//script).extract()我的回复就像u'<script src="static/libs/search.js"></script>'一样。

我已经阅读了一些与javascript有关的内容,但我是Scrapy的初学者并且不确定如何绕过这个并得到我想要的东西。

1 个答案:

答案 0 :(得分:1)

我发现该页面使用JavaScript / AJAX从地址加载所有信息 http://openreview.net/notes?forum=Bk0FWVcgx&trash=true

但它需要两个cookie才能访问这些信息。第一台服务器发送cookie GCLB。后一页加载http://openreview.net/token并获取第二个Cookie openreview:sid。该页面可以加载JSON数据。

这是requests

的工作示例
import requests

s = requests.Session()

# to get `GCLB` cookie
r = s.get('http://openreview.net/forum?id=Bk0FWVcgx')
print(r.cookies)

# to get `openreview:sid` cookie
r = s.get('http://openreview.net/token')
print(r.cookies)

# to get JSON data
r = s.get('http://openreview.net/notes?forum=Bk0FWVcgx&trash=true')
data = r.json()
print(data['notes'][0]['content']['title'])

其他解决方案:使用Selenium或其他工具运行JavaScript代码,然后您可以获取包含所有信息的完整HTML。 Scrapy可能会使用SeleniuPhantomJS来运行JavaScript。但我最近尝试使用Scrapy