【Scrapy初心者】HTML収集のコツ
単体ページ無いでピンポイントでCSSセレクタを活用して収集ができたと思うが、使えるようにするには、グループで取得する必要がある。
今回は、こちらのペジを参考にします。
どう実装したらよいか考えてみよう
こちらのサイト、最新記事がメインエリアに時系列でならんでいる一般的なブログ形式ですね。まずは、htmlを覗いてみましょう。
クロームでhtmlを開いてタグを選択すると該当するエリアが青なるので、これを活用して探すと便利です。どうやらくくっているのはここのようです。
<div class="post-listing">
<div class="post-item">
<div class="hs-featured-image-wrapper">
<a href = >
cmdでScrapyコマンドで確認してみましょう。
Scrapy shell "https://blog.scrapinghub.com/"
これでCMDで動き始めます。
response.css('div.post-header a::attr(href)').extract()
こちらで、URLが収集できると思います。
記事詳細のURL上記のコマンドで、収集はできたが、同じものをとってきてますねw
['https://blog.scrapinghub.com/a-practical-guide-to-web-data-qa-part-v-broad-crawls',
'https://blog.scrapinghub.com/a-practical-guide-to-web-data-qa-part-v-broad-crawls',
'https://blog.scrapinghub.com/author/ivan-ivanov',
'https://blog.scrapinghub.com/a-practical-guide-to-web-data-qa-part-v-broad-crawls#comments-listing',
'https://blog.scrapinghub.com/web-data-extraction-summit-2020',
'https://blog.scrapinghub.com/web-data-extraction-summit-2020',
TOPページの記事も10記事ですが、無駄なURLをとってきてしまったようですね。
for post in response.css('.post-listing .post-item'):
# items に定義した Post のオブジェクトを生成して次の処理へ渡す
yield Post(
url=post.css('div.post-header a::attr(href)').extract_first().strip(),
title=post.css('div.post-header a::text').extract_first().strip(),
date=post.css('div.post-header span.date a::text').extract_first().strip(),
)
参考ページのソースをみてみましょう。
より上の段の<div>から取得して、詳細のdivを取得しています。この理由は('.post-listing .post-item')で指定することで。
記事一覧を一気に取得して、繰り返し行う for in をつかい繰り返しやるようにして、extract_first()で最初のデータしかとってこないようにしている。合わせ技のようです。※配列で格納してくれるところが素敵。
<div>内にいくつもの、URLがある場合はextract_first()で収集数を絞る。
必然的に、指定は最初のURLにピンポイントで指定するということになります。
次回は、次ページの収集方法
連番でとることが今回メインで解説しようと思いましたが、w
post()に関してはDBの話になるので別の機会に分析します。