【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を作って動かして見る

f:id:yukking3:20201102150058p:plain

yieldに変更する理由は、辞書型にすることで別ファイルへエクスポートすることが可能となる。

f:id:yukking3:20201102155708p:plain

 

・Nextボタン以降の情報の取得方法

f:id:yukking3:20201102150756p:plain

次に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/を合体させた。

from urllib.parse import urljoin

url = "https://ja.wikipedia.org/wiki/宇奈月温泉"
res2 = urljoin(url, "/wiki/ファイル:Pcs34560_IMG4098.JPG")

print(url)
print(res2)

 

 

最後に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

f:id:yukking3:20201102155602p:plain