web-dev-qa-db-ja.com

無限スクロールのウェブサイトからすべてのコンテンツを取得するにはどうすればよいですか?かすれた

私はscrapyを使用しています。

私が使用しているウェブサイトには無限のスクロールがあります。

ウェブサイトにはたくさんの投稿がありますが、私は13をこすりました。

残りの投稿を削る方法は?

これが私のコードです:

class exampleSpider(scrapy.Spider):
name = "example"
#from_date = datetime.date.today() - datetime.timedelta(6*365/12)
allowed_domains = ["example.com"]
start_urls = [
    "http://www.example.com/somethinghere/"
]

def parse(self, response):
  for href in response.xpath("//*[@id='page-wrap']/div/div/div/section[2]/div/div/div/div[3]/ul/li/div/h1/a/@href"):
    url = response.urljoin(href.extract())
    yield scrapy.Request(url, callback=self.parse_dir_contents)


def parse_dir_contents(self, response):
    #scrape contents code here
8
Michimcchicken

ウェブサイトのコードを確認してください。

無限スクロールが自動的にjsアクションをトリガーする場合は、Aliothプロポーザルを使用して次のように進めることができます。 spynner

スピナー docs に続いて、jqueryイベントをトリガーできることがわかります。

ライブラリコードを調べて、発生できるイベントの種類を確認します。

scroll to bottomイベントを生成するか、Webサイトのスクロール可能なコンテンツ内の任意のdivでcssプロパティの変更を作成してみてください。次のスピナー docs 、次のようなもの:

browser = spynner.Browser(debug_level=spynner.DEBUG, debug_stream=debug_stream)
# load here your website as spynner allows
browser.load_jquery(True)
ret = run_debug(browser.runjs,'window.scrollTo(0, document.body.scrollHeight);console.log(''scrolling...);')
# continue parsing ret 

無限スクロールがアンカーリンクによってトリガーされる可能性はほとんどありませんが、リンクにアタッチされている必要はなく、jqueryアクションによってトリガーされる可能性があります。この場合、次のようなコードを使用します。

br.load('http://pypi.python.org/pypi')

anchors = br.webframe.findAllElements('#menu ul.level-two a')
# chooses an anchor with Browse Word as key
anchor = [a for a in anchors if 'Browse' in a.toPlainText()][0]
br.wk_click_element_link(anchor, timeout=10)
output = br.show()
# save output in file: output.html or 
# plug this actions into your scrapy method and parse output var as you do 
# with response body

次に、output.htmlファイルでscrapyを実行するか、実装している場合は、jsアクションの後に変更されたhtmlを保存するために選択したローカルメモリ変数を使用します。

別の解決策として、訪問者のブラウザjsがアクティブ化されていない場合に備えて、解析しようとしているWebサイトに代替レンダリングバージョンがある可能性があります。

JavaScriptが無効になっているブラウザを使用してウェブサイトをレンダリングしてみてください。そうすれば、ウェブサイトはコンテンツセクションの最後にアンカーリンクを利用できるようになります。

また、ScrapyとSeleniumのアプローチを使用したクローラーjsナビゲーションのsuccessful実装があります。詳細は this なので答えてください。

4
Evhz

私はSeleniumではなくscrapyを使用しますが、同等のことができる必要があり、ファイルのロード時にJavaScriptを実行します。

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

そして、それがもうスクロールしなくなるまで、私はそれを続けます。かわいくなく、本番環境では使用できませんでしたが、特定の仕事には効果的です。

3
HenryM

私はあなたが探しているのはあなたの通常のロジックと並んでページネーションロジックだと思います

ほとんどの場合..無限スクロール==ページング、そのようなページでページの3/4まで、またはページの最後までスクロールすると、ページが起動しますAJAX呼び出して次のページのコンテンツをダウンロードし、応答を現在のページにロードします

Firefoxでnetwork monitorツールを使用することをお勧めします。下にスクロールすると、そのようなページリクエストに気付くでしょう。

-cluescrapy.FormRequest または scrapy.FormRequest.from_response を使用しますこのソリューションの実装

2
MrPandav
1
WannaBeCoder

明らかに、そのターゲットサイトはそのコンテンツを動的にアップロードします。したがって、そこには2つの適切な解決策があります。

  1. JQueryの相互作用を微妙に解読し、サーバーとのデータ交換をシミュレートしてみてください 手動で

  2. この特定のジョブには別のツールを使用してください。たとえば spynner は私には注意を払う正しい選択のようです。

1
Alioth

場合によっては、無限スクロールであっても、「次の」ページ付けを実行するために呼び出される要素がソースコードに含まれていることがあります。したがって、この要素をクリックするだけで、残りの投稿が表示されます。スクレイプ/セレン付き:

next = self.driver.find_element_by_xpath('//a[@class="nextResults"]')
next.click()
time.sleep(2) 
0
driperdk