【问题标题】:How to generate the start_urls dynamically in crawling?如何在爬取中动态生成 start_urls?
【发布时间】:2012-02-17 02:49:01
【问题描述】:

我正在抓取一个可能包含大量start_urls 的网站,例如:

http://www.a.com/list_1_2_3.htm

我想填充start_urls 就像[list_\d+_\d+_\d+\.htm], 并在抓取过程中从 [node_\d+\.htm] 等 URL 中提取项目。

我可以使用CrawlSpider来实现这个功能吗? 以及如何在爬取中动态生成start_urls

【问题讨论】:

标签: web-scraping scrapy web-crawler


【解决方案1】:

动态生成 URL 的最好方法是覆盖蜘蛛的 start_requests 方法:

from scrapy.http.request import Request

def start_requests(self):
      with open('urls.txt', 'rb') as urls:
          for url in urls:
              yield Request(url, self.parse)

【讨论】:

    【解决方案2】:

    有两个问题:

    1)是的,您可以通过使用规则来实现此功能,例如,

    rules =(Rule(SgmlLinkExtractor(allow = ('node_\d+.htm')) ,callback = 'parse'))
    

    suggested reading

    2) 是的,您可以动态生成 start_urls,start_urls 是一个

    列表

    例如>>> start_urls = ['http://www.a.com/%d_%d_%d' %(n,n+1,n+2) for n in range(0, 26)]

    >>> start_urls
    
    ['http://www.a.com/0_1_2', 'http://www.a.com/1_2_3', 'http://www.a.com/2_3_4', 'http://www.a.com/3_4_5', 'http://www.a.com/4_5_6', 'http://www.a.com/5_6_7',  'http://www.a.com/6_7_8', 'http://www.a.com/7_8_9', 'http://www.a.com/8_9_10','http://www.a.com/9_10_11', 'http://www.a.com/10_11_12', 'http://www.a.com/11_12_13', 'http://www.a.com/12_13_14', 'http://www.a.com/13_14_15', 'http://www.a.com/14_15_16', 'http://www.a.com/15_16_17', 'http://www.a.com/16_17_18', 'http://www.a.com/17_18_19', 'http://www.a.com/18_19_20', 'http://www.a.com/19_20_21', 'http://www.a.com/20_21_22', 'http://www.a.com/21_22_23', 'http://www.a.com/22_23_24', 'http://www.a.com/23_24_25', 'http://www.a.com/24_25_26', 'http://www.a.com/25_26_27']
    

    【讨论】:

    • 感谢您的回答。但我想在抓取过程中生成 start_urls:当我遇到像“a.com/%d_%d_%d”这样的 url 时,我将它添加到 start_urls 中。一开始我无法确认 start_urls 的范围...
    • 据我所知,如果在爬取过程中在 start_urls 列表中添加任何不会执行的 url,scrapy 在开始爬取时在调度程序中添加 start_urls 请求。
    • 由于某种原因 (2) 仅在解释器 shell 中有效,在 runspider 中失败。
    • python 怎么知道它的假设是 %d。如果你使用 %h 或 %x 会怎样?为什么是 %d?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多