2017-12-31 222 views
0

URLのリストを取得してクロールするパッケージ "Scrapy"でスパイダーを作成しようとしています。私は答えのためにstackoverflowを検索しましたが、問題を解決する何かを見つけることができませんでした。でPython - Scrapy - URLのリストを取得してクロールするクローラを作成する

  • :私は、印刷self.start_urlsながら、印刷された以下の情報を取得

    Spider = Try(urls = [r"https://www.example.com"]) 
    process = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
    }) 
    
    process.crawl(Spider) 
    process.start() 
    

    class Try(scrapy.Spider): 
        name = "Try" 
    
        def __init__(self, *args, **kwargs): 
         super(Try, self).__init__(*args, **kwargs) 
         self.start_urls = kwargs.get("urls") 
         print(self.start_urls) 
    
        def start_requests(self): 
         print(self.start_urls) 
         for url in self.start_urls: 
          yield Request(url , self.parse) 
    
        def parse(self, response): 
         d = response.xpath("//body").extract() 
    

    私はクモをクロールすると、次のよう

    私のスクリプトがあります__init__機能が画面に表示されます: [r "https://www.example.com "](スパイダーに渡される)。画面上に印刷されたstart_requests機能で

  • がある:なし

は、なぜ私はNoneを取得していないのですか?この問題にアプローチする別の方法はありますか?または私のクモのクラスに間違いがありますか?

ありがとうございました!

+0

リストの先頭にURLを保持するための別の名前を使用する - 'self.start_urls'は' scrapy'によって使用されるので、それらを削除できます。私はあなたが '__init__'の' self.start_urls'にURLを入れたらそれを使うのだろうかと思っています。おそらくそれを使い、 'start_requests'を使う必要はありませんか? – furas

+0

'process_closed'は、' from_crawler'を呼び出すときにパラメータなしで新しいTryオブジェクトを作成します。 Scrapy Source CodeのCrawlerクラスを参照してください。 https://github.com/scrapy/scrapy/blob/master/scrapy/crawler.py#L101-L102 – matiskay

答えて

0

私は

process.crawl(Try, urls=[r"https://www.example.com"]) 

を実行すると、私は期待どおり、それはTryurlsを送ります。さらに私はstart_requestsは必要ありません。

import scrapy 

class Try(scrapy.Spider): 

    name = "Try" 

    def __init__(self, *args, **kwargs): 
     super(Try, self).__init__(*args, **kwargs) 
     self.start_urls = kwargs.get("urls") 

    def parse(self, response): 
     print('>>> url:', response.url) 
     d = response.xpath("//body").extract() 

from scrapy.crawler import CrawlerProcess 

process = CrawlerProcess({ 
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 
process.crawl(Try, urls=[r"https://www.example.com"]) 
process.start() 

しかし、私は

spider = Try(urls = ["https://www.example.com"]) 

process.crawl(spider) 

を使用している場合、それはurlsなしTry新を実行して、リストが空であるように、それが見えます。

1

私は、process.crawlでスパイダークラスを使用し、そこにurlsパラメータを渡すことをお勧めします。

import scrapy 
from scrapy.crawler import CrawlerProcess 
from scrapy import Request 


class Try(scrapy.Spider): 
    name = 'Try' 

    def __init__(self, *args, **kwargs): 
     super(Try, self).__init__(*args, **kwargs) 
     self.start_urls = kwargs.get("urls") 

    def start_requests(self): 
     for url in self.start_urls: 
      yield Request(url , self.parse) 

    def parse(self, response): 
     d = response.xpath("//body").extract() 

process = CrawlerProcess({ 
    'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)' 
}) 

process.crawl(Try, urls=[r'https://www.example.com']) 
process.start() 
0

だから、誰かがself.start_urlsの値が代入した後、どこに行くか知っていますか?

process.crawl(Try)を使用する場合 - スクラップは新しいTryスパイダーオブジェクトを作成しますか?

関連する問題