2017-10-30 4 views
0

私はScrapyを学んでいます。今、私はちょうど項目をscrapyしようと、私はクモを呼び出すとき:シェルでの治療は動作しますが、スパイダーは空のCSVを返します

planefinder]# scrapy crawl planefinder -o /User/spider/planefinder/pf.csv -t csv 

それは技術情報を示していないし、何がコンテンツをかき取り(クロール0ページ....など)、そしてそれは、空のCSVファイルを返します。私はそれが動作scrapyシェルでXPathをテストするとき 問題がある:

>>> from scrapy.selector import Selector 
>>> sel = Selector(response) 
>>> flights = sel.xpath("//div[@class='col-md-12'][1]/div/div/table//tr") 
>>> items = [] 
>>> for flt in flights: 
...  item = flt.xpath("td[1]/a/@href").extract_first() 
...  items.append(item) 
... 
>>> items 

され、次の私のplaneFinder.pyコード:

# -*-:coding:utf-8 -*- 

from scrapy.spiders import CrawlSpider 
from scrapy.selector import Selector, HtmlXPathSelector 
from planefinder.items import arr_flt_Item, dep_flt_Item 


class planefinder(CrawlSpider): 
    name = 'planefinder' 
    host = 'https://planefinder.net' 
    start_url = ['https://planefinder.net/data/airport/PEK/'] 


    def parse(self, response): 
     arr_flights = response.xpath("//div[@class='col-md-12'][1]/div/div/table//tr") 
     dep_flights = response.xpath("//div[@class='col-md-12'][2]/div/div/table//tr") 

     for flight in arr_flights: 
      arr_item = arr_flt_Item() 

      arr_flt_url = flight.xpath('td[1]/a/@href').extract_first() 
      arr_item['arr_flt_No'] = flight.xpath('td[1]/a/text()').extract_first() 
      arr_item['STA'] = flight.xpath('td[2]/text()').extract_first() 
      arr_item['From'] = flight.xpath('td[3]/a/text()').extract_first() 
      arr_item['ETA'] = flight.xpath('td[4]/text()').extract_first() 

      yield arr_item 

答えて

0

くださいCrawlSpiderに行く前に、Spiderのためのドキュメントをチェックし、私が見つけた問題のいくつかはあってください。代わりにstart_url使用のallowed_domains

    • 代わりhost使用のstart_urls
    • それページにいくつかのクッキーが設定されている必要があるか、あるいは何らかの基本的なボット防止対策を使用している可能性があり、最初に別の場所に着陸する必要があります。

    私も少し変更しました(これを試してみてください!

    # -*-:coding:utf-8 -*- 
    
    from scrapy import Field, Item, Request 
    from scrapy.spiders import CrawlSpider, Spider 
    
    class ArrivalFlightItem(Item): 
        arr_flt_no = Field() 
        arr_sta = Field() 
        arr_from = Field() 
        arr_eta = Field() 
    
    
    class PlaneFinder(Spider): 
        name = 'planefinder' 
        allowed_domains = ['planefinder.net'] 
        start_urls = ['https://planefinder.net/data/airports'] 
    
        def parse(self, response): 
         yield Request('https://planefinder.net/data/airport/PEK', callback=self.parse_flight) 
    
    
        def parse_flight(self, response): 
         flights_xpath = ('//*[contains(@class, "departure-board") and ' 
             './preceding-sibling::h2[contains(., "Arrivals")]]' 
             '//tr[not(./th) and not(./td[@class="spacer"])]') 
    
         for flight in response.xpath(flights_xpath): 
          arrival = ArrivalFlightItem() 
          arr_flt_url = flight.xpath('td[1]/a/@href').extract_first() 
          arrival['arr_flt_no'] = flight.xpath('td[1]/a/text()').extract_first() 
          arrival['arr_sta'] = flight.xpath('td[2]/text()').extract_first() 
          arrival['arr_from'] = flight.xpath('td[3]/a/text()').extract_first() 
          arrival['arr_eta'] = flight.xpath('td[4]/text()').extract_first() 
    
          yield arrival 
    
  • +0

    はあなたに@Wilfredoをありがとう、それが機能するようになりました新しいScrapyの学習者として、私は、ページのニーズかどうかを知る方法を知りたいですいくつかのクッキーが設定されているか、何らかの基本的なanti-bot protectionを使用している可能性があります。 –

    +0

    hey @ Kai.Wブラウザの開発者ツールを使用して、ソース/リクエストトラフィックなどを調べることができます。プロキシのようなサービスで、ウェブページごとに受信/送信されたものを正確に見ることができます(ブラウザでの処理、curl、urllibなどの動作がHTML本体を調べている場合)。 – Wilfredo

    0
    ここでの問題は、「スパイダー」は、使用する正しく理解されていません

    Scrapyは異なるカスタムのものを提供しています。

    メイン1、およびCrawlSpiderは、フォーラム、ブログへのより深いと集中的な検索のために使用されているので、あなたが使用する必要があります一つは、シンプルSpiderないCrawlSpiderある、など

    ちょうどの種類を変更しますスパイダー:

    from scrapy import Spider 
    
    class plane finder(Spider): 
        ... 
    
    0

    settings.pyファイルのROBOTSTXT_OBEYの値を確認してください。デフォルトではTrueに設定されています(ただし、シェルを実行しているときはTrueではありません)。 robots.txtファイルに従わないことを拒否する場合はFalseに設定します。

    関連する問題