Python:将 'list' 个 url 发送到 scrapy spider 进行抓取时出现问题
Python: Problems sending 'list' of urls to scrapy spider to scrape
尝试发送 'list' of urls 到 scrapy 通过使用长字符串通过某个蜘蛛爬行,然后在爬虫内部拆分字符串。我试过复制 this 答案中给出的格式。
我要发送给抓取工具的列表是 future_urls
>>> print future_urls
set(['https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'http://finance.yahoo.com/q/hp?s=TFW.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'https://ca.finance.yahoo.com/q/hp?s=DLTR&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'https://ca.finance.yahoo.com/q/hp?s=AGNC&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'https://ca.finance.yahoo.com/q/hp?s=HMSY&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'http://finance.yahoo.com/q/hp?s=BATS.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m'])
然后通过:
发送给爬虫
command4 = ("scrapy crawl future -o future_portfolios_{0} -t csv -a future_urls={1}").format(input_file, str(','.join(list(future_urls))))
>>> print command4
scrapy crawl future -o future_portfolios_input_10062008_10062012_ver_1.csv -t csv -a future_urls=https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,http://finance.yahoo.com/q/hp?s=TFW.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,https://ca.finance.yahoo.com/q/hp?s=DLTR&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,https://ca.finance.yahoo.com/q/hp?s=AGNC&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,https://ca.finance.yahoo.com/q/hp?s=HMSY&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,http://finance.yahoo.com/q/hp?s=BATS.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m
>>> type(command4)
<type 'str'>
我的爬虫(部分):
class FutureSpider(scrapy.Spider):
name = "future"
allowed_domains = ["finance.yahoo.com", "ca.finance.yahoo.com"]
start_urls = ['https://ca.finance.yahoo.com/q/hp?s=%5EIXIC']
def __init__(self, *args, **kwargs):
super(FutureSpider, self).__init__(*args,**kwargs)
self.future_urls = kwargs.get('future_urls').split(',')
self.rate_returns_len_min = 12
self.required_amount_of_returns = 12
for x in self.future_urls:
print "Going to scrape:"
print x
def parse(self, response):
if self.future_urls:
for x in self.future_urls:
yield scrapy.Request(x, self.stocks1)
然而,从print 'going to scrape:', x
打印出来的是:
Going to scrape:
https://ca.finance.yahoo.com/q/hp?s=ALXN
只有一个url,而且只是future_urls
中第一个url的一部分,这显然是有问题的。
似乎无法弄清楚为什么抓取工具不会抓取 future_urls
中的所有 url...
我认为它在碰到符号(&
)时停止了,你可以使用urllib.quote
.
来逃避它
例如:
import urllib
escapedurl = urllib.quote('https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m')
然后你让它恢复正常你可以这样做:
>>>>urllib.unquote(escapedurl)
https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m
尝试发送 'list' of urls 到 scrapy 通过使用长字符串通过某个蜘蛛爬行,然后在爬虫内部拆分字符串。我试过复制 this 答案中给出的格式。
我要发送给抓取工具的列表是 future_urls
>>> print future_urls
set(['https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'http://finance.yahoo.com/q/hp?s=TFW.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'https://ca.finance.yahoo.com/q/hp?s=DLTR&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'https://ca.finance.yahoo.com/q/hp?s=AGNC&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'https://ca.finance.yahoo.com/q/hp?s=HMSY&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m', 'http://finance.yahoo.com/q/hp?s=BATS.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m'])
然后通过:
发送给爬虫command4 = ("scrapy crawl future -o future_portfolios_{0} -t csv -a future_urls={1}").format(input_file, str(','.join(list(future_urls))))
>>> print command4
scrapy crawl future -o future_portfolios_input_10062008_10062012_ver_1.csv -t csv -a future_urls=https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,http://finance.yahoo.com/q/hp?s=TFW.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,https://ca.finance.yahoo.com/q/hp?s=DLTR&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,https://ca.finance.yahoo.com/q/hp?s=AGNC&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,https://ca.finance.yahoo.com/q/hp?s=HMSY&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m,http://finance.yahoo.com/q/hp?s=BATS.L&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m
>>> type(command4)
<type 'str'>
我的爬虫(部分):
class FutureSpider(scrapy.Spider):
name = "future"
allowed_domains = ["finance.yahoo.com", "ca.finance.yahoo.com"]
start_urls = ['https://ca.finance.yahoo.com/q/hp?s=%5EIXIC']
def __init__(self, *args, **kwargs):
super(FutureSpider, self).__init__(*args,**kwargs)
self.future_urls = kwargs.get('future_urls').split(',')
self.rate_returns_len_min = 12
self.required_amount_of_returns = 12
for x in self.future_urls:
print "Going to scrape:"
print x
def parse(self, response):
if self.future_urls:
for x in self.future_urls:
yield scrapy.Request(x, self.stocks1)
然而,从print 'going to scrape:', x
打印出来的是:
Going to scrape:
https://ca.finance.yahoo.com/q/hp?s=ALXN
只有一个url,而且只是future_urls
中第一个url的一部分,这显然是有问题的。
似乎无法弄清楚为什么抓取工具不会抓取 future_urls
中的所有 url...
我认为它在碰到符号(&
)时停止了,你可以使用urllib.quote
.
例如:
import urllib
escapedurl = urllib.quote('https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m')
然后你让它恢复正常你可以这样做:
>>>>urllib.unquote(escapedurl)
https://ca.finance.yahoo.com/q/hp?s=ALXN&a=06&b=10&c=2012&d=06&e=10&f=2015&g=m