所以,我的问题相对简单.我有一个蜘蛛爬行多个站点,我需要它按照我在代码中写入的顺序返回数据.它发布在下面.
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from mlbodds.items import MlboddsItem
class MLBoddsSpider(BaseSpider):
name = "sbrforum.com"
allowed_domains = ["sbrforum.com"]
start_urls = [
"http://www.sbrforum.com/mlb-baseball/odds-scores/20110328/",
"http://www.sbrforum.com/mlb-baseball/odds-scores/20110329/",
"http://www.sbrforum.com/mlb-baseball/odds-scores/20110330/"
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//div[@id="col_3"]//div[@id="module3_1"]//div[@id="moduleData4952"]')
items = []
for site in sites:
item = MlboddsItem()
item['header'] = site.select('//div[@class="scoreboard-bar"]//h2//span[position()>1]//text()').extract()# | /*//table[position()<2]//tr//th[@colspan="2"]//text()').extract()
item['game1'] = site.select('/*//table[position()=1]//tr//td[@class="tbl-odds-c2"]//text() | /*//table[position()=1]//tr//td[@class="tbl-odds-c4"]//text() | /*//table[position()=1]//tr//td[@class="tbl-odds-c6"]//text()').extract()
items.append(item)
return items
Run Code Online (Sandbox Code Playgroud)
结果以随机顺序返回,例如它返回第29个,然后是第28个,然后是第30个.我已经尝试将调度程序顺序从DFO更改为BFO,以防万一是问题,但这并没有改变任何东西.
我在Scrapy中苦苦挣扎,而且我不明白回调之间传递项目的确切方式。也许有人可以帮助我。
def parse_page1(self, response):
item = MyItem()
item['main_url'] = response.url
request = scrapy.Request("http://www.example.com/some_page.html",
callback=self.parse_page2)
request.meta['item'] = item
return request
def parse_page2(self, response):
item = response.meta['item']
item['other_url'] = response.url
return item
Run Code Online (Sandbox Code Playgroud)
我正在尝试逐步了解那里的行动流程:
[parse_page1]
item = MyItem() <-对象项已创建item['main_url'] = response.url <-我们正在为对象项的main_url分配值request = scrapy.Request("http://www.example.com/some_page.html", callback=self.parse_page2) <-我们正在请求一个新页面并启动parse_page2进行剪贴。[parse_page2]
item = response.meta['item']<-我在这里不明白。我们正在创建一个新的对象项,或者这是在[parse_page1]中创建的对象项?什么是response.meta ['item']是什么意思?我们仅在3个信息(例如链接和回调)中传递给请求,因此未添加任何其他可引用的参数...item['other_url'] = response.url <-我们正在为对象项的other_url赋值return item <-我们根据请求返回项目对象[parse_page1]
request.meta['item'] = item<-我们正在分配要请求的对象项目吗?但是请求完成后,回调已经在6中返回了项目?return request <-我们正在获取请求的结果,所以从6开始的项目对吗?我浏览了所有有关scrapy和request / response / meta的文档,但是我仍然不明白第4点和第7点的情况。