我正在Scrapy 0.16.5
使用Python 2.7
Mac OSX Lion 10.7.5
我对Scrapy
. 我看过一些教程视频,虽然这在某些方面很有帮助,但他们无法明确回答我的一些与我当前项目有关的问题——我无法找到获得我需要的数据的解决方案。
我的项目:
所以我正在制作一个抓取工具,它可以访问 BoxOfficeMojo.com 并为每部电影获取 4 种不同的信息:电影名称、电影 URL、电影发行日期和电影票房收入。然后我想把这些信息放到 MySQL 数据库中。最初,我只是想获得一页电影,特别是在这里找到。如您所见,这只是电影 A-Ac。最终,我需要获得所有的 A,然后是所有的 B,等等。但是,就目前而言,这对于构建初始刮板很有用。
路径:
所以我不能在这里发布完整的路径,因为它最终只是发布了电影信息。导致我感兴趣的数据的 xpath 是:
//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]
//div[@id="body"]/div/table/tr/td/table/tr/td/table[2]
如果您转到我上面链接到的那个页面并查看源代码,请按照 xpath,您将看到我正在查看的内容。该长字符串的第一部分是链接电影字母 AZ,然后是当前页面上的电影及其信息。
我的代码:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from BoxOfficeMojo.items import BoxofficemojoItem
class MojoSpider(BaseSpider):
name = 'MojoSpider'
allowed_domains = ['boxofficemojo.com']
start_urls = ['http://www.boxofficemojo.com/movies/alphabetical.htm?letter=A&p=.htm']
def parse(self, response):
hxs = HtmlXPathSelector(response)
print ('hxs:', hxs)
titles = hxs.select('//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]') #was previously
print ('rows:', rows)
for title in titles:
print ('title:', title)
movie = title.select('/tr')
print ('movie', movie)
#print ('title:', titles)
items = [] #previously = []
#for title in titles:
#item = BoxofficemojoItem()
#item['title'] = title.select('/td/font/b/text()').extract() #Was:td/font/a/b/text()
#item['link'] = title.select('/td/font/b/a/@href').extract() #Was:td/font/a/@href
#item['gross'] = title.select('/td/font/text()').extract() #Was:td[3]/font/text()
#item['release'] = title.select('/td/a/text()').extract() #Was: td[7]/font/a/text()
#items.append(item)
#return items
注意:我已经注释掉了一些事情并添加了打印语句,以期弄清楚发生了什么。注释掉部分的想法是标题部分中的每个项目都是一部电影。
实际打印的内容:
所以这是代码运行时实际打印出来的内容
('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="center" bgcolor="#dcdcdc"'>)
('cells:', [])
('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#ffffff"><'>)
('cells:', [])
('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#f4f4ff"><'>)
('cells:', [])
('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#ffffff"><'>)
('cells:', [])
('row:', <HtmlXPathSelector xpath='//div[@id="body"]/div/table/tr/td/table/tr[2]/td/table[2]/tr' data=u'<tr><td align="left" bgcolor="#f4f4ff"><'>)
('cells:', [])
同样,这只是一个次要的选择。此外,row
当我最初这样做时,我没有标题 - 只是想让它更具可读性。
当我使用注释掉的部分时,我总是得到一堆空的字典条目。