2017-04-03 34 views
1

我使用scrapy制作了一个蜘蛛,我试图将下载链接保存到(python)列表中,以便稍后使用downloadlist[1]调用列表条目。解析url链接到列表中

但scrapy将url保存为项目而不是列表。有没有办法将每个网址附加到列表中?

from scrapy.selector import HtmlXPathSelector 
from scrapy.spider import BaseSpider 
from scrapy.http import Request 
import scrapy 
from scrapy.linkextractors import LinkExtractor 


DOMAIN = 'some-domain.com' 
URL = 'http://' +str(DOMAIN) 


linklist = [] 

class subtitles(scrapy.Spider): 
    name = DOMAIN 
    allowed_domains = [DOMAIN] 
    start_urls = [ 
     URL 
    ] 

# First parse returns all the links of the website and feeds them to parse2 

    def parse(self, response): 
     hxs = HtmlXPathSelector(response) 
     for url in hxs.select('//a/@href').extract(): 
      if not (url.startswith('http://') or url.startswith('https://')): 
       url= URL + url 
      yield Request(url, callback=self.parse2) 

# Second parse selects only the links that contains download 

    def parse2(self, response): 
     le = LinkExtractor(allow=("download")) 
     for link in le.extract_links(response): 
      yield Request(url=link.url, callback=self.parse2) 
      print link.url 

# prints list of urls, 'downloadlist' should be a list but isn't. 

downloadlist = subtitles() 
print downloadlist 
+0

如果'downloadlist'不是列表,它是什么? –

+0

根据scrapy文档,我认为它可能是一个请求对象。当我尝试打印'downloadlist [3]'时,我得到:TypeError,'字幕'对象不支持索引。 – LuukS

+0

为什么不通过'downloadlist'作为参数,然后在需要的地方追加元素。 –

回答

4

你误解了班级是如何工作的,你在这里调用的不是函数。

想想这样,你的蜘蛛,你在class MySpider(Spider)中定义的是scrapy引擎使用的模板;当您开始scrapy crawl myspider scrapy启动一个引擎并读取您的模板以创建一个将用于处理各种响应的对象。

所以在这里你的想法可以简单地翻译为:

def parse2(self, response): 
    le = LinkExtractor(allow=("download")) 
    for link in le.extract_links(response): 
      yield {'url': link.urk} 

如果调用此方法scrapy crawl myspider -o items.json,你会得到所有JSON格式的下载链接。
没有理由将下载保存到列表中,因为它不再是您编写的这个蜘蛛模板(类),实际上它没有任何用处。

+0

谢谢,是的,这是我一直在与终端合作的方式。但我想从它创建的列表中访问一个随机URL。所以我认为实现这个我的subtitles.py脚本会更好。或者,编写一个从json文件中选择随机url的第二个脚本会更好吗? – LuukS

+0

@LuukS是的 - 将这些逻辑分开并为你想要做的任何事情写一个脚本来处理你从pider得到的json值会更聪明。这样,您可以抓取一次,然后根据需要随意对列表执行任何操作。 – Granitosaurus

+0

谢谢,那就是我该怎么做的! – LuukS