私は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
ウェブサイトのコードを確認してください。
無限スクロールが自動的に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 なので答えてください。
私はSelenium
ではなくscrapy
を使用しますが、同等のことができる必要があり、ファイルのロード時にJavaScriptを実行します。
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
そして、それがもうスクロールしなくなるまで、私はそれを続けます。かわいくなく、本番環境では使用できませんでしたが、特定の仕事には効果的です。
私はあなたが探しているのはあなたの通常のロジックと並んでページネーションロジックだと思います
ほとんどの場合..無限スクロール==ページング、そのようなページでページの3/4まで、またはページの最後までスクロールすると、ページが起動しますAJAX呼び出して次のページのコンテンツをダウンロードし、応答を現在のページにロードします
Firefoxでnetwork monitor
ツールを使用することをお勧めします。下にスクロールすると、そのようなページリクエストに気付くでしょう。
-clue: scrapy.FormRequest または scrapy.FormRequest.from_response を使用しますこのソリューションの実装
場合によっては、無限スクロールであっても、「次の」ページ付けを実行するために呼び出される要素がソースコードに含まれていることがあります。したがって、この要素をクリックするだけで、残りの投稿が表示されます。スクレイプ/セレン付き:
next = self.driver.find_element_by_xpath('//a[@class="nextResults"]')
next.click()
time.sleep(2)