2017-03-14 5 views
0

私はpythonとscrapyを初めて使いました。 シードURLをクロールしようとしていますhttps://www.health.com/patients/status/.ThisシードURLには多くのURLが含まれています。私が欲しい.Finally ... https://www.health.com/provi/details/64 https://www.health.com/provi/details/65があるウェブスクラップを使用したデータのクロールと抽出

https://www.health.com/patients/status/ ->https://www.health.com/Faci/Details/2                           
            -> https://www.health.com/Faci/Details/3 
            -> https://www.health.com/Faci/Details/4 



https://www.health.com/Faci/Details/2 -> https://www.health.com/provi/details/64 
           -> https://www.health.com/provi/details/65 


https://www.health.com/Faci/Details/3 -> https://www.health.com/provi/details/70 
           -> https://www.health.com/provi/details/71 

https://www.health.com/Faci/Details/2ページ内:しかし、私は【選択のURLは以下のようになりますシードURLからFACI /詳細/#のsomenumberが含まれているURLのみを取得したいです https://www.health.com/provi/details/#somenumber URLからデータを取得するにはどうすればよいですか?

は、今のところ私はsettings.pyはそれが働いていないfile.Butに.Iは、深さの上限を設定しようとしましたhttps://www.health.com/provi/details/#somenumberに行かないhttps://www.health.com/Faci/Details/#somenumber .Itsが含まれているURLのみをクロールするscrapyチュートリアルとことから、以下のコードを試してみました。

import scrapy 
from scrapy.spiders import CrawlSpider, Rule 
from scrapy.linkextractors import LinkExtractor 
from news.items import NewsItem 


class MySpider(CrawlSpider): 
name = 'provdetails.com' 
allowed_domains = ['health.com'] 
start_urls = ['https://www.health.com/patients/status/'] 

rules = (

    Rule(LinkExtractor(allow=('/Faci/Details/\d+',)), follow=True), 

    Rule(LinkExtractor(allow=('/provi/details/\d+',)),callback='parse_item'),     
) 

def parse_item(self, response): 
    self.logger.info('Hi, this is an item page! %s', response.url) 
    item = NewsItem() 
    item['id'] = response.xpath("//title/text()").extract() 
    item['name'] = response.xpath("//title/text()").extract() 
    item['description'] = response.css('p.introduction::text').extract() 
    filename='details.txt' 
    with open(filename, 'wb') as f: 
     f.write(item) 
    self.log('Saved file %s' % filename) 
    return item 

さらに進めるために私を助けてください?

答えて

1

正直なところ、正規表現ベースの力強いRule/LinkExtractorは、私にしばしば苦労しました。単純なプロジェクトでは、ページ上のすべてのリンクを抽出し、次にhref属性を調べるアプローチかもしれません。 hrefがニーズに合っている場合、yield新しいResponseオブジェクトがあります。例えば:

from scrapy.http import Request 
from scrapy.selector import Selector 
... 
    # follow links 
    for href in sel.xpath('//div[@class="contentLeft"]//div[@class="pageNavigation nobr"]//a').extract(): 
      linktext = Selector(text=href).xpath('//a/text()').extract_first() 
      if linktext and linktext[0] == "Weiter": 
        link = Selector(text=href).xpath('//a/@href').extract()[0] 
        url = response.urljoin(link) 
        print url 
        yield Request(url, callback=self.parse) 

あなたのコードにいくつかの発言:

response.xpath(...).extract() 

これは、リストを返します、多分あなたは、最初の項目(またはNone)を提供extract_first()の表情を持っていると思います。

with open(filename, 'wb') as f: 

これはファイルを何度も上書きします。保存された最後のアイテムのみを取得します。また、バイナリモード('b')でファイルを開きます。ファイル名から、テキストとして読みたいと思いますか?追加するには'a'を使用しますか? open() docs -o flagを使用してスクラップ機能を使用して項目をJSONまたはCSVに保存する方法もあります。

return item 

返品する代わりにyieldアイテムには良いスタイルです。少なくとも1つのページから複数のアイテムを作成する必要がある場合は、yieldにする必要があります。

もう1つの良いアプローチは次のとおりです。1種類/種類のページに1つのparse()関数を使用します。

たとえば、start_urlsのすべてのページは、parse()になります。それからあなたは、/Faci/Details/NページごとにyieldRequestをコールバックparse_faci_details()で抽出することができます。 parse_faci_details()の場合は、興味のあるリンクを再度抽出し、Requestを作成し、callback=を介してそれらに渡します。 parse_provi_details()。 この機能では、必要な項目を作成します。

関連する問題