2017-04-03 9 views
1

私はscrapyを使用してスパイダーを作成しました。ダウンロードリンクを(python)リストに保存しようとしていますので、後でdownloadlist[1]を使用してリストエントリを呼び出すことができます。URLをリストに解析する

しかし、治療は、リストではなくアイテムとしてURLを保存します。各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

私はそれが治療のドキュメントによると、リクエストオブジェクトである可能性があると思います。 'downloadlist [3]'を印刷しようとすると、TypeError、 'subtitles'オブジェクトはインデックス作成をサポートしていません。 – LuukS

+0

なぜ 'downloadlist'を引数として渡して、必要な場所に要素を追加しませんか? –

答えて

4

クラスの仕組みを誤解していますが、ここではクラスを関数ではなく呼び出しています。

このように考えると、class MySpider(Spider)で定義したスパイダーは、スクリーピングエンジンで使用されるテンプレートです。 scrapy crawl myspiderを開始すると、スクラップはエンジンを起動し、テンプレートを読み取り、さまざまな応答を処理するために使用されるオブジェクトを作成します。あなたはJSON形式でダウンロードリンクをすべて取得しますscrapy crawl myspider -o items.jsonでこれを呼び出した場合

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

だからここにあなたの考えは単純に変換することができます。
あなたが書いたこのスパイダーテンプレート(クラス)はもはやなくなり、基本的に目的を持たないので、ダウンロードをリストに保存する理由はありません。

+0

ありがとう、はいこれは私がそれをターミナルから形成する方法です。しかし、私はそれが作成するリストから1つのランダムなURLにアクセスしたいと思います。だから私はこの私のsubtitles.pyスクリプトを実装する方が良いと思った。または、jsonファイルからランダムなURLを選択する2番目のスクリプトを作成する方が良いでしょうか? – LuukS

+0

@LuukSはい - これらのロジックを分割し、あなたがpiderから得たjsonの値を使って何をしたいのかスクリプトを書く方がよりスマートになります。この方法では、一度クロールしてから何回でもあなたのリストを望み通りに何度でもやることができます。 – Granitosaurus

+0

ありがとう、それは私がそれをやる方法です! – LuukS