2017-06-02 2 views
2

私は、いくつかのGoogleの飛行機の価格を引き出すためにpython scrapyプロジェクトを作成しました。Python scrapy working(時間の半分のみ)

私は、通常のブラウザの代わりにPhantomJSを使用するようにミドルウェアを設定しました。私は追加settings.pyで

class JSMiddleware(object): 
    def process_request(self, request, spider): 
     driver = webdriver.PhantomJS() 
     try: 
      driver.get(request.url) 
      time.sleep(1.5) 
     except e: 
      raise ValueError("request url failed - \n url: {},\n error: 
        {}").format(request.url, e) 
     body = driver.page_source 
     #encoding='utf-8' - add to html response if necessary 
     return HtmlResponse(driver.current_url, body=body,encoding='utf-8', 
       request=request) 

DOWNLOADER_MIDDLEWARES = { 
# key path intermediate class, order value of middleware 
'scraper_module.middlewares.middleware.JSMiddleware' : 543 , 
# prohibit the built-in middleware 
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware' : None , } ` 

私はまた、次のクモのクラスを作成しました:

import scrapy 
from scrapy import Selector 

class Gspider(scrapy.Spider): 
    name = "google_spider" 

    def __init__(self): 
     self.start_urls = ["https://www.google.pt/flights/#search;f=LIS;t=POR;d=2017-06-18;r=2017-06-22"] 
     self.prices = [] 
     self.links = [] 

    def clean_price(self, part): 
     #part received as a list 
     #the encoding is utf-8 
     part = part[0] 
     part = part.encode('utf-8') 
     part = filter(str.isdigit, part) 
     return part 

    def clean_link(self, part): 
     part = part[0] 
     part = part.encode('utf-8') 
     return part 

    def get_part(self, var_holder, response, marker, inner_marker, amount = 1): 
     selector = Selector(response) 
     divs = selector.css(marker) 
     for n, div in enumerate(divs): 
      if n < amount: 
       part = div.css(inner_marker).extract() 
       if inner_marker == '::text': 
        part = self.clean_price(part) 
       else: 
        part = self.clean_link(part) 
       var_holder.append(part) 
      else: 
       break 
     return var_holder 

    def parse(self, response): 
     prices, links = [], [] 
     prices = self.get_part(prices, response, 'div.OMOBOQD-d-Ab', '::text') 
     print prices 
     links = self.get_part(links, response, 'a.OMOBOQD-d-X', 'a::attr(href)') 
     print links 

問題は、私はシェルでコードを実行して、で、私が成功した価格とリンクの数は半分くらいですが、もう半分の時間、つまり抽出されたデータを含む最終的なベクトルは空です。

実行中にエラーは発生しません。

これはなぜ起こっているのですか? は、ここでは、コマンドラインからのログです: successful extraction

unsuccessful extraction

+0

あなたのリクエストは、いつでもブロックされている可能性があります。または、Googleはあなたの要求をレート制限しています。とにかく、役に立つかもしれない[this API](https://developers.google.com/qpx-express/)が見つかりました。スクリーンスクレイピングではなく –

答えて

0

Googleがクロールの点で非常に厳格なポリシーを持っています。 (彼らがすべてのウェブを常時クロールしていることを知っていると、かなり偽善的です...)

コメントの前に述べたように、あるいはプロキシを使用する必要があります。簡単な方法はCrawleraです。何千ものプロキシを管理しているので、気にする必要はありません。私は個人的にGoogleをクロールするためにそれを使用し、それは完全に動作します。欠点は、それが無料ではないということです。

関連する問題