Python: Scrapy start_urls 列表能够处理 .format()?

Python: Scrapy start_urls list able to handle .format()?

我想解析一个股票列表,所以我试图格式化我的 start_urls 列表的末尾,这样我就可以只添加符号而不是整个 url.

Spider class 在 stock_list 方法中使用 start_urls

class MySpider(BaseSpider):
    symbols = ["SCMP"]
    name =  "dozen"
    allowed_domains = ["yahoo.com"]     

def stock_list(stock):
    start_urls = []
    for symb in symbols:
        start_urls.append("http://finance.yahoo.com/q/is?s={}&annual".format(symb))
    return start_urls

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    revenue = hxs.select('//td[@align="right"]')
    items = []
    for rev in revenue:
        item = DozenItem()
        item["Revenue"] = rev.xpath("./strong/text()").extract()
        items.append(item)
    return items[0:3]

如果我去掉 stock_list 并像往常一样简单地执行 start_urls,那么所有 运行 都是正确的,但目前它不会导出超过一个空文件.

另外,我是否应该尝试 sys.arv 设置,这样当我 运行 $ scrapy crawl dozen -o items.csv 时,我只需在命令行中输入股票代码作为参数???

通常 shell 在 LOG/DEBUG 打印输出中打印出 2015-04-25 14:50:57-0400 [dozen] DEBUG: Crawled (200) <GET http://finance.yahoo.com/q/is?s=SCMP+Income+Statement&annual>,但目前不包括它,这意味着它没有正确格式化 start_urls

我会使用 for 循环,如下所示:

class MySpider(BaseSpider):
    stock = ["SCMP", "APPL", "GOOG"]
    name =  "dozen"
    allowed_domains = ["yahoo.com"]
    def stock_list(stock):
        start_urls = []
        for i in stock:            
            start_urls.append("http://finance.yahoo.com/q/is?s={}".format(i))
        return start_urls
    start_urls = stock_list(stock)

然后按照我在底部的方式分配函数调用。


更新

使用 Scrapy 0.24

# -*- coding: utf-8 -*-
import scrapy
from scrapy.selector import Selector

class MySpider(scrapy.Spider):

    symbols = ["SCMP"]
    name =  "yahoo"
    allowed_domains = ["yahoo.com"]

    def stock_list(symbols):
        start_urls = []
        for symb in symbols:
            start_urls.append("http://finance.yahoo.com/q/is?s={}&annual".format(symb))
        return start_urls
    start_urls = stock_list(symbols)

    def parse(self, response):
        revenue = Selector(response=response).xpath('//td[@align="right"]').extract()
        print(revenue)

您可能想要调整 xpath 以获得您想要的;它似乎正在撤回相当多的东西。但我已经对此进行了测试,并且抓取工作按预期进行。

实现动态启动 URL 的正确方法是使用 start_request()
当您有一个起始 URL 的静态列表时,使用 start_urls 是首选做法。

start_requests() This method must return an iterable with the first Requests to crawl for this spider.

示例:

class MySpider(BaseSpider):
    name =  "dozen"
    allowed_domains = ["yahoo.com"]
    stock = ["SCMP", "APPL", "GOOG"]

    def start_requests(self):
        BASE_URL = "http://finance.yahoo.com/q/is?s={}"
        yield scrapy.Request(url=BASE_URL.format(s)) for s in self.stock

    def parse(self, response):
        # parse the responses here
        pass

通过这种方式,您还可以使用生成器而不是预生成的列表,在大型 stock.

的情况下可以更好地扩展