小编典典

顺序抓取抓取网址

scrapy

所以,我的问题相对简单。我有一只蜘蛛在多个站点上爬行,我需要它按照我在代码中写入的顺序返回数据。它发布在下面。

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

结果以随机顺序返回,例如,返回29,然后28,然后30。我已经尝试将调度程序的顺序从DFO更改为BFO,以防万一这是问题所在,但这并没有改变。


阅读 759

收藏
2020-04-08

共2个答案

小编典典

start_urls定义在start_requests方法中使用的URL 。parse下载页面时,将为你的方法调用每个起始URL的响应。但是你无法控制加载时间-第一个起始URL可能最后一个到达parse

一个解决方案-覆盖start_requests方法并添加到生成的请求中metawith priority键。在parse提取此priority值并将其添加到中item。在管道中,基于此值执行某些操作。(我不知道为什么需要这些URL,在何处按此顺序处理这些URL)。

或使其具有同步性-将这些起始网址存储在某个地方。放在start_urls第一个。在parse过程中的第一个响应并得到项目(S),然后从你的存储下一个URL,并作出请求它回调parse

2020-04-08
小编典典

Scrapy 现在Request有一个priority属性。

如果Request功能中有很多功能,并且想要首先处理特定请求,则可以设置:

def parse(self, response):
    url = 'http://www.example.com/first'
    yield Request(url=url, callback=self.parse_data, priority=1)

    url = 'http://www.example.com/second'
    yield Request(url=url, callback=self.parse_data)

Scrapy将首先处理一个priority=1

2020-04-08