【Scrapy】quotes.toscrape.comのスパイダーを作ろう2/3
今回の章
セクション:Building More Advanced Spider with Scrapy
14. Scrapy Advanced Spider - Part 1
15. Scrapy Advanced Spider - Part 2
16. Scrapy Advanced Spider - Part 3
17. Scrapy Advanced Spider - Part 4
18. Scrapy Architecture
今回の目的
https://quotes.toscrape.com/の本文、著者、タグをそれぞれ取得して、Nextページにある記事も取得するSpiderを作成する。
目次
・準備
・Xpathでデータ取集
①本文の抽出方法
②Autherの抽出方法
③タグの取得方法
・pyファイルに書き込んでSpiderを作って動かして見る
・Nextボタン以降の情報の取得方法
・CSVファイルに落とし込む
・アーキテクトについて
・item.pyを設定する。
・pipeline.pyを設定する。
・setting.pyの役割
・pyファイルに書き込んでSpiderを作って動かして見る
yieldに変更する理由は、辞書型にすることで別ファイルへエクスポートすることが可能となる。
・Nextボタン以降の情報の取得方法
次にNextを取得してみる。
注意点としては、hrefの前には@がつく!
①//*
②[@class="next"]
③/a
④/@href
('//*[@class="next"]/a/@href')でページ2をp取得する。
In [5]: response.xpath('//*[@class="next"]/a/@href').extract_first()
Out[5]: '/page/2/'
In [6]: next_page_url = response.xpath('//*[@class="next"]/a/@href').extract_first()
response.xpath('//*[@class="next"]/a/@href').extract_first()
リンクを取得するのはこの流れになると思う。
In [7]: response.urljoin(next_page_url)
Out[7]: 'http://quotes.toscrape.com/page/2/
URLJOINの使い方
今回の場合だと、http://quotes.toscrape.comと/page/2/を合体させた。
最後にyield scrapy.Request(absolute_next_page_url)でつぎのページでの処理が実行される。
When spider finishes crawling last page, it will try to get the content of class named 'next' (response.xpath('//*[@class="next"]/a/@href') that does not exists = null/none.
①もし、NEXTがなければnoneが返される。 ②また、scrapy.dupefiltersがあって、くり返されるものは無視される。
next_page_url = response.xpath('//*[@class="next"]/a/@href').extract_first()
absolute_next_page_url = response.urljoin(next_page_url)
yield scrapy.Request(absolute_next_page_url)
CSVファイルに落とし込む
スクレイピングできるスパイダーがあれば残りは以下の通りにするだけ。
$ scrapy crawl quotes -o item.csv