Scrapyでクロール中にリンク先のページから抽出した要素を追加する
2018年07月22日
pyhtonのスクレイピングのフレームワーク「Scrapy」で、以下のことを実装しようと思い、方法で行き詰まってしまいました。
スクレイピング中に、リンク先のページから特定の要素を取得し、元の処理に加える
要するに、以下のようなイメージです。
def parse(self, response): for url in response.xpath('〜〜').extract(): 前処理 scrapy.Request(url, 処理2) 後処理 def 処理2(self, response): 〜〜〜〜〜〜〜
上記のような処理は、Scrapyでよく遭遇します。
parseの処理中に、リンク先のページから要素を取得し、yieldで返します。
ただし、上記の記述は、処理2で返した辞書型の要素を、そのままRequest型で返すため、単にリンク先のページで特定の値だけ取得してその後の処理でその値を使いたい場合には、上手く処理することができません。
どう解決したらいいかを考えてみたのですが、結論としては、Scrapy.Requestを使用しないということで解決しました。
URLは確定していて、リンク先のページの特定の要素を取得したいだけであれば、他のライブラリのBeautiful Soupなどを使うことでも解決できます。
例えば以下のような処理を使用することでリンク先ページのタイトルタグを取得できます。
無理にScrapyのRequestオブジェクトを使って取得する必要はなく、処理の中で別のライブラリを使用することで上手く解決できました。
import urllib.request from bs4 import BeautifulSoup html = urllib.request.urlopen(url) soup = BeautifulSoup(html, 'html.parser') for title in soup.find_all('title'): title = title.text