2017-01-17 33 views
0

私のHTMLコードは、以下の...主に類似した構造を持つdiv要素の数が含まれていますので、ここで2つのなどのdivScrapy条件クロール

<!-- 1st Div start --> 

<div class="outer-container"> 
<div class="inner-container"> 
<a href="www.xxxxxx.com"></a> 
<div class="abc xyz" title="verified"></div> 
<div class="mody"> 
     <div class="row"> 
      <div class="col-md-5 col-xs-12"> 
       <h2><a class="mheading primary h4" href="/c/my-llc"><strong>Top Dude, LLC</strong></a></h2> 
       <div class="mvsdfm casmhrn" itemprop="address"> 
        <span itemprop="Address">1223 Industrial Blvd</span><br> 
        <span itemprop="Locality">Paris</span>, <span itemprop="Region">BA</span> <span itemprop="postalCode">123345</span> 
       </div> 
       <div class="hidden-device-xs" itemprop="phone" rel="mainPhone"> 
        (800) 845-0000 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 
</div> 

<!-- 2nd Div start --> 

<div class="outer-container"> 
<div class="inner-container"> 
<a href="www.yyyyyy.com"></a> 
<div class="mody"> 
     <div class="row"> 
      <div class="col-md-5 col-xs-12"> 
       <h2><a class="mheading primary h4" href="/c/my-llc"><strong>Fat Dude, LLC</strong></a></h2> 
       <div class="mvsdfm casmhrn" itemprop="address"> 
        <span itemprop="Address">7890 Business St</span><br> 
        <span itemprop="Locality">Tokyo</span>, <span itemprop="Region">MA</span> <span itemprop="postalCode">987655</span> 
       </div> 
       <div class="hidden-device-xs" itemprop="phone" rel="mainPhone"> 
        (800) 845-0000 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 
</div> 

を含むコードの抜粋は、私はScrapyがをやりたいです..です。

クラス=「アウターコンテナ」を持つdivがタイトル=と別のdivが含まれている場合は上記第一のdivのようを「検証」、それは上記のURLにアクセスしてください必要があります(つまり、ワットww.xxxxxx.com)、そのページで他のフェイルドを取得します。

場合タイトルを含む一切のdivが存在しない=上記第二のdivのように、を「検証」、それは=「MODY」のdivクラスの下にすべてのデータをフェッチする必要があります。

したがって、この条件/ロジックをScrapyクローラーに適用するにはどうすればよいですか。私はBeautifulSoupを使用して考えていたが、確かではない....私がこれまで試した持って何

....

class MySpider(CrawlSpider): 
    name = 'dknfetch' 
    start_urls = ['http://www.xxxxxx.com/scrapy/all-listing'] 
    allowed_domains = ['www.xxxxx.com'] 
    def parse(self, response): 
      hxs = Selector(response) 
      soup = BeautifulSoup(response.body, 'lxml') 
      nf = NewsFields() 
      cName = soup.find_all("a", class_="mheading primary h4") 
      addrs = soup.find_all("span", itemprop_="Address") 
      loclity = soup.find_all("span", itemprop_="Locality") 
      region = soup.find_all("span", itemprop_="Region") 
      post = soup.find_all("span", itemprop_="postalCode") 

      nf['companyName'] = cName[0]['content'] 
      nf['address'] = addrs[0]['content'] 
      nf['locality'] = loclity[0]['content'] 
      nf['state'] = region[0]['content'] 
      nf['zipcode'] = post[0]['content'] 
      yield nf 
      for url in hxs.xpath('//div[@class="inner-container"]/a/@href').extract(): 
      yield Request(url, callback=self.parse) 

勿論、上記のコードリターンとは、下にあるすべてのURLのクロールdiv class = "inner-container"このコードで条件付きクロールが指定されていないため、どこに設定するかわからないので、このコードで条件付きクロールはありません。

これまで誰かが似たようなことをしていたら、分かち合ってください。ありがとう

答えて

0

BeautifulSoupを使用する必要はありませんが、Scrapyには独自のセレクタ機能(別途、parselとしてリリース)が付属しています。のは、例を作るためにあなたのHTMLを使用してみましょう:

html = u""" 
<!-- 1st Div start --> 
<div class="outer-container"> 
<div class="inner-container"> 
<a href="www.xxxxxx.com"></a> 
<div class="abc xyz" title="verified"></div> 
<div class="mody"> 
     <div class="row"> 
      <div class="col-md-5 col-xs-12"> 
       <h2><a class="mheading primary h4" href="/c/my-llc"><strong>Top Dude, LLC</strong></a></h2> 
       <div class="mvsdfm casmhrn" itemprop="address"> 
        <span itemprop="Address">1223 Industrial Blvd</span><br> 
        <span itemprop="Locality">Paris</span>, <span itemprop="Region">BA</span> <span itemprop="postalCode">123345</span> 
       </div> 
       <div class="hidden-device-xs" itemprop="phone" rel="mainPhone"> 
        (800) 845-0000 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 
</div> 
<!-- 2nd Div start --> 
<div class="outer-container"> 
<div class="inner-container"> 
<a href="www.yyyyyy.com"></a> 
<div class="mody"> 
     <div class="row"> 
      <div class="col-md-5 col-xs-12"> 
       <h2><a class="mheading primary h4" href="/c/my-llc"><strong>Fat Dude, LLC</strong></a></h2> 
       <div class="mvsdfm casmhrn" itemprop="address"> 
        <span itemprop="Address">7890 Business St</span><br> 
        <span itemprop="Locality">Tokyo</span>, <span itemprop="Region">MA</span> <span itemprop="postalCode">987655</span> 
       </div> 
       <div class="hidden-device-xs" itemprop="phone" rel="mainPhone"> 
        (800) 845-0000 
       </div> 
      </div> 
     </div> 
    </div> 
</div> 
</div> 
""" 

from parsel import Selector 
sel = Selector(text=html) 
for div in sel.css('.outer-container'): 
    if div.css('div[title="verified"]'): 
     url = div.css('a::attr(href)').extract_first() 
     print 'verified, follow this URL:', url 
    else: 
     nf = {} 
     nf['companyName'] = div.xpath('string(.//h2)').extract_first() 
     nf['address'] = div.css('span[itemprop="Address"]::text').extract_first() 
     nf['locality'] = div.css('span[itemprop="Locality"]::text').extract_first() 
     nf['state'] = div.css('span[itemprop="Region"]::text').extract_first() 
     nf['zipcode'] = div.css('span[itemprop="postalCode"]::text').extract_first() 
     print 'not verified, extracted item is:', nf 

前のスニペットのための結果は次のとおりです。

verified, follow this URL: www.xxxxxx.com 
not verified, extracted item is: {'zipcode': u'987655', 'state': u'MA', 'address': u'7890 Business St', 'locality': u'Tokyo', 'companyName': u'Fat Dude, LLC'} 

しかしScrapyであなたもSelectorクラスをインスタンス化する必要はありません、ショートカットがありますコールバックに渡されたオブジェクトresponseで利用可能です。また、CrawlSpiderをサブクラス化しないでください。普通のSpiderクラスで十分です。一緒にすべてを置く:

from scrapy import Spider, Request 
from myproject.items import NewsFields 

class MySpider(Spider): 
    name = 'dknfetch' 
    start_urls = ['http://www.xxxxxx.com/scrapy/all-listing'] 
    allowed_domains = ['www.xxxxx.com'] 

    def parse(self, response): 
     for div in response.selector.css('.outer-container'): 
      if div.css('div[title="verified"]'): 
       url = div.css('a::attr(href)').extract_first() 
       yield Request(url) 
      else: 
       nf = NewsFields() 
       nf['companyName'] = div.xpath('string(.//h2)').extract_first() 
       nf['address'] = div.css('span[itemprop="Address"]::text').extract_first() 
       nf['locality'] = div.css('span[itemprop="Locality"]::text').extract_first() 
       nf['state'] = div.css('span[itemprop="Region"]::text').extract_first() 
       nf['zipcode'] = div.css('span[itemprop="postalCode"]::text').extract_first() 
       yield nf 

を私はParselのAPIと慣れ得るために、あなたをお勧めします:https://parsel.readthedocs.io/en/latest/usage.html

ハッピースクレイピングを!

関連する問題