Scrapyでシンプルなクローラーを書く

クローリングハック あらゆるWebサイトをクロールするための実践テクニック

クローリングハック あらゆるWebサイトをクロールするための実践テクニック

クローリング&スクレイピングフレームワークであるScrapyを試してみた。 Scrapingはクローリングとスクレイピングを両方やってくれる大きめのフレームワークで、スクレイピングに特化したbeautifulsoupとはその点が異なる。

ここでは上記の書籍に沿ってやってみた。

ᐅ python -V    
Python 3.6.5

ᐅ scrapy version
Scrapy 1.5.1

スクリプト 最もシンプルなスパイダーの実装。 書籍のままだと動かなかった(サイト構成が変わっている)ので少し変えている。

import scrapy


class BlogSpider(scrapy.Spider):
    name = 'blogspider'
    start_urls = ['https://blog.scrapinghub.com']

    def parse(self, response):
        """
        トップページからカテゴリページへのリンクを抜き出してたどる。
        """
        for url in response.css('ul li a::attr("href")').re('.*/tag/.*'):
            yield scrapy.Request(response.urljoin(url), self.parse_titles)

    def parse_titles(self, response):
        """
        カテゴリページからそのカテゴリの投稿のタイトルをすべて抜き出す。
        """
        for post_title in response.css('div.post-header > h2 > a::text').extract():
            yield {'title': post_title}

実行

ᐅ scrapy runspider myspider.py -o items.jl
2018-11-05 22:49:33 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: scrapybot)
2018-11-05 22:49:33 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.1, w3lib 1.19.0, Twisted 18.9.0, Python 3.6.5 (default, Apr 25 2018, 14:23:58) - [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.1)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0i  14 Aug 2018), cryptography 2.3.1, Platform Darwin-18.0.0-x86_64-i386-64bit

(中略)

2018-11-05 22:49:37 [scrapy.core.engine] INFO: Spider closed (finished)

結果であるitems.jlの中身を見る jlはjson lineの略。こういうデータ形式があるらしい。行単位で1レコードがjsonになっているデータ形式

ᐅ cat items.jl 
{"title": "<a href=\"https://blog.scrapinghub.com/2016/10/27/an-introduction-to-xpath-with-examples\">An Introduction to XPath: How to Get Started</a>"}
{"title": "<a href=\"https://blog.scrapinghub.com/2016/08/25/how-to-crawl-the-web-politely-with-scrapy\">How to Crawl the Web Politely with 

(以下略)