2017-03-06 7 views
0

私がしようとしているのは、会社情報(thisisavailable.eu.pn/company.html)をスクラップして、それぞれのデータを別々のページから取得します。Scrapyで複数のリンクされたページから1つのデータセットをクロールしてスクラップする方法

だから、理想的に、私はサンプルのページから戻ったデータは、次のようになります。

{ 
    "company": "Mycompany Ltd", 
    "code": "3241234", 
    "phone": "2323232", 
    "email": "[email protected]", 
    "board": { 
     "1": { 
      "name": "Margaret Sawfish", 
      "code": "9999999999" 
     }, 
     "2": { 
      "name": "Ralph Pike", 
      "code": "222222222" 
     } 
    } 
} 

私は検索しましたGoogleとSO(のようなherehereScrapy docsなど)が、ために解決策を見つけることができませんでしたこのような問題。ラファエルは、最初の問題に気づいたよう :

items.py:

import scrapy 
class company_item(scrapy.Item): 
    name = scrapy.Field() 
    code = scrapy.Field() 
    board = scrapy.Field() 
    phone = scrapy.Field() 
    email = scrapy.Field() 
    pass 

class person_item(scrapy.Item): 
    name = scrapy.Field() 
    code = scrapy.Field()  
    pass 

スパイダー/ example.py:

import scrapy 
from try.items import company_item,person_item 

class ExampleSpider(scrapy.Spider): 
    name = "example" 
    #allowed_domains = ["http://thisisavailable.eu.pn"] 
    start_urls = ['http://thisisavailable.eu.pn/company.html'] 

    def parse(self, response): 
     if response.xpath("//table[@id='company']"): 
      yield self.parse_company(response) 
      pass 
     elif response.xpath("//table[@id='person']"): 
      yield self.parse_person(response) 
      pass   
     pass 

    def parse_company(self, response): 
     Company = company_item() 
     Company['name'] = response.xpath("//table[@id='company']/tbody/tr[1]/td[2]/text()").extract_first() 
     Company['code'] = response.xpath("//table[@id='company']/tbody/tr[2]/td[2]/text()").extract_first() 
     board = [] 

     for person_row in response.xpath("//table[@id='board']/tbody/tr/td[1]"): 
      Person = person_item() 
      Person['name'] = person_row.xpath("a/text()").extract() 
      print (person_row.xpath("a/@href").extract_first()) 
      request = scrapy.Request('http://thisisavailable.eu.pn/'+person_row.xpath("a/@href").extract_first(), callback=self.parse_person) 
      request.meta['Person'] = Person 
      return request   
      board.append(Person) 

     Company['board'] = board 
     return Company  

    def parse_person(self, response):  
     print('PERSON!!!!!!!!!!!') 
     print (response.meta) 
     Person = response.meta['Person'] 
     Person['name'] = response.xpath("//table[@id='person']/tbody/tr[1]/td[2]/text()").extract_first() 
     Person['code'] = response.xpath("//table[@id='person']/tbody/tr[2]/td[2]/text()").extract_first() 
     yield Person 

はUPDATEを、私は一緒に考え出すことができた何

許可されたドメインが間違っていた - 私はそれを今すぐコメントした、そして今私がそれを実行すると、(私はURLに低担当者のためにURLを追加する):

scrapyクロール例えば2017年3月7日午前9時41分12秒[scrapy.utils.log] INFO:Scrapy 1.3.2開始(BOT:proov)2017年3月7日午前9時41分12秒 [scrapy.utils.log] INFO:オーバーライドされた設定:{'NEWSPIDER_MODULE': 'proov.spiders'、 'SPIDER_MODULES':['proov.spiders']、 'ROBOTSTXT_OBEY':True、 'BOT_NAME': 'proov' } 2017-03-07 09:41:12 [scrapy.middleware]情報:有効な拡張子: ['scrapy.extensions.logstats.LogStats'、 'scrapy.extensions.telnet.TelnetConsole'、 'scrapy.extensions .corestats.CoreStats '] 2017-03-07 09:41:13 [scrapy.middleware] INFO:有効なダウンローダm iddlewares: [ 'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware'、 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware'、 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware'、 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware'、 「scrapy .downloadermiddlewares.useragent.UserAgentMiddleware ' 'scrapy.downloadermiddlewares.retry.RetryMiddleware'、 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware'、 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware'、 ' scrapy.downloadermiddlewares.redirect.RedirectMiddleware '、 ' scrapy.downloadermiddlewares.cookies.CookiesMiddleware '、 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware'、 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2017-03-07 09:41:13 [scrapy.middleware] INFO:Enabledスパイダーミドルウェア: ['scrapy.spidermiddlewares .httperror.HttpErrorMiddleware」 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware' 'scrapy.spidermiddlewares.referer.RefererMiddleware' 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware' 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2017-03-07 09:41:13 [scrapy.middleware] INFO:有効なアイテムのパイプライン:[] 2017-03-07 09:41:13 [scrapy.core.engine] INFO:Spider 2017-03- 07 09:41:13 [scrapy.extensions。(scrap.extensions.telnet)DEBUG:Telnet console listening on:0個のアイテムを0個のアイテムで分けた2017-03-07 09:41:13 [scrap.extensions.telnet] 127.0.0.1:6023 2017-03-07 09:41:14 [scrapy.core.engine] DEBUG:クロール済み(404)http://*thisisavailable.eu.pn/robots.txt>(リファラー:なし) 2017-03-07 09:41:14 [scrapy.core.engine] DEBUG:クロール済み(200)http://*thisisavailable.eu.pn/scrapy/company.html>(リファラー:なし) person.html person2 .html 2017-03-07 09:41:15 [scrapy.core.engine] DEBUG:クロール済み(200)http://thisisavailable.eu.pn/person2.html> (referer:http:// * thisisavailable .eu.pn/company.html)PERSON !!!!!!!!!!! 2017-03-07 09:41:15 [scrapy.core.scraper] DEBUG:Scraped from http://*thisisavailable.eu.pn/person2.html> {'code':u'222222222 '、 '名前':u'Kaspar K \ xe4nnuotsa '} 2017-03-07 09:41:15 [scrapy.core.engine] INFO:クローズスパイダー(仕上げ)2017-03-07 09:41:15 [ [downloader/request_bytes]:936、 'downloader/request_count':3、 'downloader/request_method_count/GET':3、 'downloader/response_bytes':1476、 'downloader/request_count':3、 /response_count ':3、 ' downloader/response_status_count/200 ':2、 ' downloader/response_status_count/404 ':1、' finish_reason ': ' finished '、' finish_tim 'item_scraped_count':1、 'log_count/DEBUG':5、 'log_count/INFO':7、 'request_depth_max':datetime.datetime(2017,3,7,7,41,15,015,166,571000) 1、 'スケジューラー/デキュー':2、 'スケジューラー/デキュー/メモリ':2、 'スケジューラー/エンキュー':2、 'スケジューラー/エンキュー/メモリー':2、 'start_time' :datetime.datetimeの(2017、 3、7、7、41、13、404000)} 2017年3月7日午前9時41分15秒[scrapy.core.engine] INFO:スパイダー(完成)

を閉じ

"-o file.json"で実行する場合、ファイルの内容は次のとおりです。

[{ "コード": "222222222"、 "名": "ラルフ・パイク"}]


ので少しさらに、私は途方に暮れてまだ午前それを動作させるための方法。

誰かが私にこの仕事を手伝うことができますか?

答えて

1

あなたの問題は、今後の予定であっても、複数のアイテムを持つこととは関係ありません。

あなたの問題は出力に説明されて

[scrapy.spidermiddlewares.offsite] DEBUG: 'kidplay-wingsuit.c9users.io' にフィルタリングされ、オフサイトリクエスト:http://thisisavailable.eu.pn/scrapy/person2.html> 2017年3月6日10時44分:33

これは、allowed_domainsリストの外にあるドメインに行くことを意味します。

許可されたドメインが間違っています。 - 更新する代わりにPersonに異なるアイテムを使用しての

+0

おかげで、ラファエルをこするながらちょうどCompanyにフィールドとしてそれを使用し、それにdictまたはlistを割り当てる:それは

allowed_domains = ["thisisavailable.eu.pn"] 

注意する必要があります質問。 – Esu

関連する問題