2017-04-09 17 views
-4

このスパイダーがWebサイトからクロールする理由を調べない理由はわかりませんでした。私は可能な答えについては、stackoverflowを探しているが、私はそれが適切に対処されていないことがわかります。私はウェブサイトから小さな町 - レストランのリストを掻き取ろうとしています。私はウェブサイトのセキュリティ機能の詳細な知識は持っていません。XPathの選択要素に関連した問題ですか?クモは何も傷つけない以外は正常に動作します。あなたはそれがかき消されない理由と問題を解決する方法をお勧めしますか?scrapy/Pythonはクロールしますが、データを削っていません

try: 
    from scrapy.spiders import Spider 
    from urllib.parse import urljoin 
    from scrapy.selector import Selector 
    from scrapy.http import Request 

except ImportError: 
    print ("\nERROR IMPORTING THE NESSASARY LIBRARIES\n") 

#scrapy.optional_features.remove('boto') 


class YelpSpider(Spider): 
    name = 'yelp_spider' 
    allowed_domains=["yelp.com"] 
    headers=['venuename','services','address','phone','location'] 

    def __init__(self): 
     self.start_urls = ['https://www.yelp.com/springfield-il-us'] 

    def start_requests(self): 
     requests = [] 
     for item in self.start_urls: 
      requests.append(Request(url=item, headers={'Referer':'http://www.google.com/'})) 
      return requests 

    def parse(self, response): 
     requests=[] 
     sel=Selector(response) 
     restaurants=sel.xpath('//*[@id="wrap"]/div[4]/div/div[1]/div/div[3]/div[1]/div[1]/h1') 
     items=[] 
     for restaurant in restaurants: 
      item=YelpRestaurantItem() 
      item['venuename']=sel.xpath('//*[@id="wrap"]/div[4]/div/div[1]/div/div[3]/div[1]/div[1]/h1') 
      item['services']=sel.xpath('//*[@id="wrap"]/div[4]/div/div[1]/div/div[3]/div[1]/div[2]/div[2]/span[2]/a[1]') 
      item['address']=sel.xpath('//*[@id="wrap"]/div[4]/div/div[1]/div/div[4]/div[1]/div/div[2]/ul/li[1]/div/strong/address') 
      item['phone']=sel.xpath('//*[@id="wrap"]/div[4]/div/div[1]/div/div[4]/div[1]/div/div[2]/ul/li[3]/span[3]') 
      item['location']=sel.xpath('//*[@id="dropperText_Mast"]') 
      item['url']=response.url 
      items.append(item) 
      yield item 

マイitems.pyは、次のコードがあります:

import scrapy 

class YelpRestaurantItem(scrapy.Item): 
    # define the fields for your item here like: 
    # name = scrapy.Field() 
    url=scrapy.Field() 
    venuename = scrapy.Field() 
    services = scrapy.Field() 
    address = scrapy.Field() 
    phone = scrapy.Field() 
    location=scrapy.Field() 

scrapy-code-does-not-scrape-any-data

+0

私はあなたがインデントの問題を抱えていると仮定します。問題のコードを修正してください。そして、コードをデバッグしようとしましたか?たぶん、レストランのためのすべての反復で何かを印刷する...? – eLRuLL

+0

何を掻き取ろうとしていますか?スパイダーはid属性が "wrap"であるものを探しますが、開始URLを開くとこれに一致するものは見つかりません。 – Casper

+0

@Casper、私は名前、サービス、住所、電話、場所を掻き取ろうとしています。私はまた、これは私の初めてのxpathと治療法を使用して言う必要があります。Chrome /開発者ツールで強調表示されたレストランのxpathをコピーしました。しかし、私は、この小さな町のレストラン事業の名前、サービス、住所、電話番号、場所などを集めたかったのです。 – Kaleab

答えて

0

あなたの輸入はこっちそのうまく動作しませんでしたが、それはあるかもしれないが、クモは、次のコードを持っています私の側で設定の問題。私は以下のスクレーパーは、あなたが探している何を思う:

import scrapy 

class YelpSpider(scrapy.Spider): 
    name = 'yelp_spider' 
    allowed_domains=["yelp.com"] 
    headers=['venuename','services','address','phone','location'] 

    def __init__(self): 
     self.start_urls = ['https://www.yelp.com/search?find_desc=&find_loc=Springfield%2C+IL&ns=1'] 

    def start_requests(self): 
     requests = [] 
     for item in self.start_urls: 
      requests.append(scrapy.Request(url=item, headers={'Referer':'http://www.google.com/'})) 
      return requests 

    def parse(self, response): 
     for restaurant in response.xpath('//div[@class="biz-listing-large"]'): 
      item={} 
      item['venuename']=restaurant.xpath('.//h3[@class="search-result-title"]/span/a/span/text()').extract_first() 
      item['services']=u",".join(line.strip() for line in restaurant.xpath('.//span[@class="category-str-list"]/a/text()').extract()) 
      item['address']=restaurant.xpath('.//address/text()').extract_first() 
      item['phone']=restaurant.xpath('.//span[@class="biz-phone"]/text()').extract_first() 
      item['location']=response.xpath('.//input[@id="dropperText_Mast"]/@value').extract_first() 
      item['url']=response.url 
      yield item 

いくつかの説明:

私は開始URLを変更しました。このURLは実際にはすべてのレストランの概要を提供していますが、他のレストランは(少なくとも私の場所から見たときはそうではありませんでした)。

システムで定義されていないパイプラインを削除しました。コード内に存在しないパイプラインを使って試すことができませんでした。

parse関数は、私が実際の変更を加えたものです。あなたが定義したxpathsはあまり明確ではありませんでした。これでコードはリストされた各レストランにループします。

response.xpath('//div[@class="biz-listing-large"]') 

このコードはすべてのレストランのデータをキャプチャします。私はforループでこれを使用していますので、各レストランでアクションを実行できます。このデータは変数restaurantで利用できます。

レストランからデータを抽出する場合は、この変数を使用します。さらに、xpathを.で開始する必要があります。これは、スクリプトがWebページの先頭から開始するためです(これはresponseを使用する場合と同じです)。

私の答えのxpathsを理解するために、私はこれをあなたに説明することができましたが、利用可能な多くのドキュメントがあり、おそらく私よりも説明が良いでしょう。私はitemのほとんどの値のためにレストランを使用しました

Some documentation

And some more

注意。場所とURLからの値はレストランデータではなく、Webページの他の場所にあります。これは、これらの値がrestaurantの代わりにresponseを使用する理由です。

+0

あなたは専用の答えをありがとう、それは働いたが、それは "電話"と "アドレス"を擦っていないが、構文エラーがありますか? – Kaleab

+0

コードを変更しましたか?ここでクローラを実行すると、itemの定義済みのすべてのプロパティが返されます。 – Casper

+0

あなたの提案通りにコードが使用され、 '電話'と '住所'以外の他のフィールドに入力されます。 – Kaleab

関連する問題