2016-05-12 10 views
0

ちょうどScrapyを使い始めると、私は正しい方向への動きを望んでいます。実行中の結果

私はここからデータをこすりしたい:、

import scrapy 
import re 

class BlogSpider(scrapy.Spider): 
    name = 'sportstats' 
    start_urls = ['https://www.sportstats.ca/display-results.xhtml?raceid=29360'] 

    def parse(self, response): 
     headings = [] 
     results = [] 
     tables = response.xpath('//table') 
     headings = list(tables[0].xpath('thead/tr/th/span/span/text()').extract()) 
     rows = tables[0].xpath('tbody/tr[contains(@class, "ui-widget-content ui-datatable")]') 
     for row in rows: 
      result = [] 
      tds = row.xpath('td') 
      for td in enumerate(tds): 
       if headings[td[0]].lower() == 'comp.': 
        content = None 
       elif headings[td[0]].lower() == 'view': 
        content = None 
       elif headings[td[0]].lower() == 'name': 
        content = td[1].xpath('span/a/text()').extract()[0] 
       else: 
        try: 
         content = td[1].xpath('span/text()').extract()[0] 
        except: 
         content = None 
       result.append(content) 
      results.append(result) 
     for result in results: 
      print(result) 

は今、私は次のページに移動する必要があり、私は次のことができます。これは私がこれまでにしたものである

https://www.sportstats.ca/display-results.xhtml?raceid=29360

下の "右矢印"をクリックしてブラウザで行います。これは次のようなものです:

<li><a id="mainForm:j_idt369" href="#" class="ui-commandlink ui-widget fa fa-angle-right" onclick="PrimeFaces.ab({s:&quot;mainForm:j_idt369&quot;,p:&quot;mainForm&quot;,u:&quot;mainForm:result_table mainForm:pageNav mainForm:eventAthleteDetailsDialog&quot;,onco:function(xhr,status,args){hideDetails('athlete-popup');showDetails('event-popup');scrollToTopOfElement('mainForm\\:result_table');;}});return false;"></a> 

どのようにそれに従うために傷病を得ることができますか?

+2

現在の進捗状況をメインポストに追加しました。 – user3449833

+0

これはJavaScriptのレンダリングの問題です。firefoxを使用してリクエストを確認したり、[Splash](https://github.com/scrapinghub/splash)のようなjavascriptレンダリングサービスを使用して終了した場合は、またはセレン。 – eLRuLL

答えて

0

JavaScriptを使わずにブラウザでURLを開くと、次のページに移動することはできません。 liタグの内部にあるように、次のページを取得するためにいくつかのjavascriptがあります。

これを回避するには、最初のオプションは通常、javascriptによって生成されたリクエストを識別することです。あなたの場合、それは簡単にする必要があります:ちょうどJavaスクリプトのコードを分析し、スパイダーでPythonでそれを複製します。もしあなたがそれを行うことができれば、あなたは治療から同じ要求を送ることができます。あなたがそれを行うことができない場合、次のオプションは、通常、javascript/browserエミュレーションまたはそのようなsometingでいくつかのパッケージを使用することです。 ScrapyJSやScrapy + Seleniumのようなもの。

0

コールバックを実行する必要があります。 '次のページ'ボタンからxpathからURLを生成します。だからurl = response.xpath(xpath to next_page_button)としたら、そのページを掻き終えたら、yield scrapy.Request(url, callback=self.parse_next_page)を実行します。最後に、def parse_next_page(self, response):という新しい関数を作成します。 JavaScriptであることを起こる場合
最後の、最後のノートは(あなたが正しいXPathを使用していることを確認している場合でも、あなたはそれをこすりすることはできません)scrapyでスプラッシュを使用して、私のレポをチェックアウトですhttps://github.com/Liamhanninen/Scrape

関連する問題