使用Scrapy从Python的HTML路径提取数据
我的项目概述:
我正在尝试用 Python 2.6 创建一个简单的脚本,从 Bing 地图获取交通时间数据。我使用 Scrapy 这个库(scrapy.org/)来爬取每个网站并提取 Bing 地图上的数据。
上面的图片展示了我想要的内容。(目前我只需要高亮的那部分数据,但最终也需要下面的时间信息。)
我首先做了一个测试,看看起始网址是否能正常访问,然后使用输出日志打印出网址的输出,以确认是否成功访问。一旦这部分工作正常,我的下一步就是尝试从网页中提取我需要的数据。
我一直在使用 Firebug、XPather 和 XPath Firefox 插件来找到我想提取的数据的 HTML 路径。这个链接对我正确编写路径的代码帮助很大(doc.scrapy.org/topics/selectors.html)。通过查看 Firebug,我发现我想提取的是...
<span class="time">22 min</span>
而 XPather 显示这是这个特定项目的路径...
/div[@id='TaskHost_DrivingDirectionsSummaryContainer']/div[1]/span[3]
当我在命令行中运行程序并使用上面给出的路径时,提取的数据输出为 [ ],而当我在 span 的末尾加上 /class='time' 时,输出的数据为 [u'False']。仔细查看 Firebug 的 DOM 窗口后,我注意到 class="time" 对于 get isID 是 false,而 childNode 中包含了我需要的数据。我该如何从 childNode 中提取数据呢?
以下是我目前的代码:
from scrapy import log # This module is useful for printing out debug information
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector, XPathSelectorList, XmlXPathSelector
import html5lib
class BingSpider(BaseSpider):
name = 'bing.com/maps'
allowed_domains = ["bing.com/maps"]
start_urls = [
"http://www.bing.com/maps/?FORM=Z9LH4#Y3A9NDAuNjM2MDAxNTg1OTk5OTh+LTc0LjkxMTAwMzExMiZsdmw9OCZzdHk9ciZydHA9cG9zLjQwLjcxNDU0OF8tNzQuMDA3MTI1X05ldyUyMFlvcmslMkMlMjBOWV9fX2VffnBvcy40MC43MzE5N18tNzQuMTc0MTg1MDAwMDAwMDRfTmV3YXJrJTJDJTIwTkpfX19lXyZtb2RlPUQmcnRvcD0wfjB+MH4="
]
def parse(self, response):
self.log('A response from %s just arrived!' % response.url)
x = HtmlXPathSelector(response)
time=x.select("//div[@id='TaskHost_DrivingDirectionsSummaryContainer']/div[1]/span[3]").extract()
print time
命令行输出:
2011-09-05 17:43:01-0400 [scrapy] DEBUG: Enabled item pipelines:
2011-09-05 17:43:01-0400 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:602
3
2011-09-05 17:43:01-0400 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2011-09-05 17:43:01-0400 [bing.com] INFO: Spider opened
2011-09-05 17:43:02-0400 [bing.com] DEBUG: Crawled (200) <GET http://www.bing.co
m/maps/#Y3A9NDAuNzIzMjYwOTYzMTUwMDl+LTc0LjA5MDY1NSZsdmw9MTImc3R5PXImcnRwPXBvcy40
MC43MzE5N18tNzQuMTc0MTg1X05ld2FyayUyQyUyME5KX19fZV9+cG9zLjQwLjcxNDU0OF8tNzQuMDA3
MTI0OTk5OTk5OTdfTmV3JTIwWW9yayUyQyUyME5ZX19fZV8mbW9kZT1EJnJ0b3A9MH4wfjB+> (refer
er: None)
2011-09-05 17:43:02-0400 [bing.com] DEBUG: A response from http://www.bing.com/m
aps/ just arrived!
[]
2011-09-05 17:43:02-0400 [bing.com] INFO: Closing spider (finished)
2011-09-05 17:43:02-0400 [bing.com] INFO: Spider closed (finished)
2 个回答
如果你想进行网页数据抓取,推荐使用BeautifulSoup这个工具。
soup.find('span', class="time")
当一个网站大量使用JavaScript时,你不能完全相信在运行时得到的XPath,因为那是JavaScript代码执行后的XPath,而Scrapy并不会运行JavaScript代码。
你应该:
打开你浏览器的开发者工具中的网络(Network)选项卡。
在网站上执行获取所需数据的步骤,同时观察网络选项卡中显示的网站请求。
尝试用Scrapy重现这些步骤(请求)。
另请参见 调试爬虫。