Python
Python3

【Scrapy】トップページから各記事のクローリング

ICS MEDIAのトップページからだと各記事の"更新日"がわからない。
エンジニアにとってその情報がメンテされているかどうかの方が、"投稿日"よりも重要だったりするので、"更新日"を一覧で見えるように取得してみた。

▼流れ
- Itemsでデータ構造をつくる
- トップページにアクセスし、話題の記事のURLをスクレイピング
- 各記事をクローリングして、各ページの情報をスクレイピング

Items

https://doc.scrapy.org/en/latest/topics/items.html

まずデータ構造の定義を行うため、items.py に以下を追加する

items.py
class ArticlesItem(scrapy.Item):
    url = scrapy.Field()
    title = scrapy.Field()
    dateModified = scrapy.Field()

Requests and Responses

https://doc.scrapy.org/en/latest/topics/request-response.html

エントリポイントのページからさらに深くクローリングするため、リクエストを投げる

ics_request.py
# -*- coding: utf-8 -*-
import scrapy
from tutorial.items import ArticlesItem

class IcsRequestSpider(scrapy.Spider):
    name = 'ics_request'
    allowed_domains = ['ics.media']

    start_urls = ['https://ics.media/']

    def parse(self, response):
        for href in response.css('.groupFeatures > div a.thumb::attr(href)'):
            yield scrapy.Request(href.extract(), callback=self.parse_item)

    def parse_item(self, response):
        item = ArticlesItem()
        item['url'] = response.url
        item['title'] = response.css('.pageTitle span::text').extract_first()
        item['dateModified'] = response.css('time[itemprop="dateModified"]::attr(datetime)').get()

        yield item

実行

scrapy crawl ics_request -o ics-request.json
ics-request.json
[
    {
        "dateModified": "2018-03-23", 
        "title": "現場で使えるwebpack 4入門 – JS開発のモジュールバンドラ", 
        "url": "https://ics.media/entry/12140"
    }, 
    {
        "dateModified": "2018-03-13", 
        "title": "絶対つまずかないGulp入門(2018年版) – インストールとSassを使うまでの手順", 
        "url": "https://ics.media/entry/3290"
    }, 
    {
        "dateModified": "2017-10-23", 
        "title": "人工知能Adobe Senseiの画像処理が凄すぎてAdobe MAX 2017の会場は狂喜乱舞に", 
        "url": "https://ics.media/entry/16643"
    }, 
    {
        "dateModified": "2018-03-13", 
        "title": "CSS Grid Layout入門。対応ブラウザが出揃った新しいレイアウト仕様", 
        "url": "https://ics.media/entry/15649"
    }
]

参考
PythonとかScrapyとか使ってクローリングやスクレイピングするノウハウを公開してみる!