2015-04-25 25 views
2

我想解析一個股票列表,所以我想格式化我的start_urls列表的末尾,所以我可以只添加符號而不是整個url。Python:Scrapy start_urls列表能夠處理.format()?

start_urls蜘蛛類內部stock_list方法:

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時只需在命令行輸入股票符號作爲參數?

通常情況下,殼打印出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

回答

1

我會用一個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) 

然後分配函數調用,因爲我有底部。


UPDATE

使用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來得到你想要的東西;它似乎在拉回相當數量的東西。但我已經測試過這個,並且正在按預期工作。

+0

這是完美的,完全合理,但導出一個空的csv。我認爲'.format()'不起作用,並且'{}'只是作爲url被包含在內......「 –

+0

@CharlesWatson謝謝,很高興它有幫助。你有沒有定義你的解析方法,並告訴它提取任何東西?我沒有看到你提到過有關上面的實際情況。 – benjamin

+0

我已將我的解析方法添加到帖子中。 –

4

實現動態啓動URL的正確方法是使用start_request()
使用start_urls是首選的做法,當你有一個靜態的起始URL列表。

start_requests()此方法必須返回一個可迭代與第一 請求抓取此蜘蛛。

例子:

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箱子。

+2

這是處理問題的首選「pythonic」和「scrapic」方式! – alecxe

+0

@alecxe「scrapic」 - 這是一個新的。我打賭我會再次使用它。 =) – elias

+0

@elias所以我會!這個詞有很多東西可以應用於:) – alecxe