2017-05-17 7 views
0

私の意図は、次のようにクモを使用して、いくつかのURLをこすりすることです:私は複数のURLを使用する予定作るクモrestarable

import scrapy 
from ..items import ContentsPageSFBItem 

class BasicSpider(scrapy.Spider): 
    name = "contentspage_sfb" 
    #allowed_domains = ["web"] 
    start_urls = [ 
     'https://www.safaribooksonline.com/library/view/shell-programming-in/9780134496696/', 
     'https://www.safaribooksonline.com/library/view/cisa-certified-information/9780134677453/' 
    ] 

    def parse(self, response): 
      item = ContentsPageSFBItem() 

      #from scrapy.shell import inspect_response 
      #inspect_response(response, self) 

      content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract() 

      for content_item in content_items: 

       item['content_item'] = content_item 
       item["full_url"] = response.url 
       item['title'] = response.xpath('//title[1]/text()').extract() 

       yield item 

。私の意図は何かが間違っている再起動可能なスパイダーを作成することです。私の計画は、例外を追加し、残りのURLのリストを含むcsvを作成することです。どこにこの機能を追加できますか?

答えて

1

このような問題が発生した現在のURLを保存しておき、同じparse機能を使用して続行するとscrapy.Requestに渡すことができます。

何かがresponse.body使用して訪問しているウェブサイトで印刷されているかどうかを確認することができますが、その後、通常通り継続されていない場合は、悪い何かが、その後yield新しいscrapy.Request起こったのです。たぶん

:使用方法は再びparse機能は、あなたがキャッチしたい「例外」に大きく依存していること

def parse(self, response): 
    current_url = response.request.url 
    if 'Some or none message in the body' in response.body: 
     yield scrapy.Request(current_url, callback=self.parse) 
    else: 
     item = ContentsPageSFBItem() 
     content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract() 

     for content_item in content_items: 
      item['content_item'] = content_item 
      item['full_url']  = response.url 
      item['title']  = response.xpath('//title[1]/text()').extract() 
      yield item 

注意。まず、第1の格納するための3つのグローバル変数を作成するための

:あなたがしているURLに応じて、異なるファイルにデータを書き込みたい念頭に置い

、その後、私は少しにコードを微調整しました2番目のurl、およびフィールドを配列として返します。 n注これは、これらの2つのURLのために有用であろうが、彼らはそれは難しいだろう成長して起動した場合:

global first_url, second_url, fields 
fields = [] 
first_url = 'https://www.safaribooksonline.com/library/view/shell-programming-in/9780134496696/' 
second_url = 'https://www.safaribooksonline.com/library/view/cisa-certified-information/9780134677453/' 
start_urls = [first_url, second_url] 

次に、あなたのparse関数内では、データを取得し、第二に渡されますfields配列、それを保存します関数parse_and_write_csvは、現在のURLに応じてすべてのファイルを作成して書き込みます。

def parse(self, response): 
    item = ContentsPageSFBItem() 
    content_items = response.xpath('//ol[@class="detail-toc"]//a/text()').extract() 
    url = response.request.url 

    for content_item in content_items: 

     item['content_item'] = content_item 
     item['full_url'] = response.url 
     item['title'] = response.xpath('//title[1]/text()').extract() 

     fields = [item['content_item'].encode('utf-8'), item['full_url'], item['title'][0]] 

     self.parse_and_write_csv(response, fields) 

parse_and_write_csvは、フィールドを取得し、それはURLから作成された配列から5番目の要素を取得し、CSVファイルを作成するか、それが既に存在する場合はそれを開き、URLに応じました。

def parse_and_write_csv(self, response, fields): 
    with open("%s.csv" % response.request.url.split('/')[5], 'a+') as file: 
     file.write("{}\n".format(';'.join(str(field) 
             for field in fields))) 

希望します。 gistが表示されます。

+0

URLごとに別々のcsvを作成する方法を知りたい。また、例外のために反復をスキップしたいと思います。しかし、これを修正するファイルはどれですか? –

+0

私はあなたが達成しようとしているものを再現しようとしました。 –

+0

あなたは 'start_urls'としてどういう意味ですか? –

関連する問題