按顺序抓取 URL

新手上路,请多包涵

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

 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,以防出现问题,但这并没有改变任何东西。

原文由 Jeff 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 515
2 个回答

start_urls 定义在 start_requests 方法中使用的 url。您的 parse 方法在下载页面时被调用,并为每个起始 url 提供响应。但是您无法控制加载时间 - 第一个启动 url 可能最后到 parse

一个解决方案——覆盖 start_requests 方法并向生成的请求添加一个 metapriority 键。在 parse 提取这个 priority 值并将其添加到 item 。在管道中根据这个值做一些事情。 (我不知道为什么以及在哪里需要按此顺序处理这些 url)。

或者使它同步——将这些起始 URL 存储在某处。放入 start_urls 第一个。在 parse 处理第一个响应并产生项目,然后从您的存储中获取下一个 url 并通过回调对其发出请求 parse

原文由 warvariuc 发布,翻译遵循 CC BY-SA 3.0 许可协议

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 的那个。

原文由 Sandeep Balagopal 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏