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
.
的情况下可以更好地扩展
我想解析一个股票列表,所以我试图格式化我的 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
.