Published Date : 2020年9月3日9:23

【python, Web Scraping】scrapyでウェブスクレイピング: パート1 ~ scrapy shell編 ~
【python, Web Scraping】Web scraping with scrapy: Part 1 ~ scrapy shell ~


This blog has an English translation


YouTubeにアップした動画、「【python, Web Scraping】scrapyでウェブスクレイピング: パート1 ~ scrapy shell編 ~」の補足説明の記事です。

Here's a little more about the 「【python, Web Scraping】Web scraping with scrapy: Part 1 ~ scrapy shell ~」 video I uploaded to YouTube.


目次

Table of Contents




① 動画の説明
① Video Description



scrapyを使ってウェブスクレイピングをします。

This time, we'll use the third party python module, scrapy, to do web scraping.

scrapyをpipでインストールしておいてください。

Install scrapy with pip.

pip install scrapy

今回はローカルサーバーを起動して、

In this case,

自分で作ったブログサイトをScrapyを使ってスクレイピングしていきます。

I will start a local server and scrape my blog site using Scrapy.

皆さんも、ウェブスクレイピングをする際は、

If you're doing web scraping,

相手のサーバーに負担をかけないようにすること。

don't put too much strain on the other server.

スクレイピングしたコンテンツを丸々ウェブに載せないこと。

Don't post scraped content entirely on your website.

解析や収集の目的の為にウェブスクレイピングを行ってください。

And you should perform web scraping for analysis and collection purposes.

インタラクティブシェルで動作を確認します。

First, We'll verify the behavior in the interactive shell.

[scrapy shell]の後にスクレイピングしたいURLを入力する。

After [scrapy shell], enter the URL of the site you want to scrape.

C:\Users\user>scrapy shell "http://127.0.0.1:8000/" --nolog
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x000000>
[s]   item       {}
[s]   request    <GET http://127.0.0.1:8000/>
[s]   response   <200 http://127.0.0.1:8000/>
[s]   settings   <scrapy.settings.Settings object at 0x000000>
[s]   spider     <DefaultSpider 'default' at 0x0000000000>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
In [1]:

ログを表示したくない場合は引数にnologを指定する。

If you don't want to display the log, specify nolog as the argument.

条件分岐や例外処理に利用できそうなレスポンスの属性値を取得する。

Try to retrieve and display the response attribute values that might be available for conditional branching and exception handling.

In [1]: response.url
Out[1]: 'http://127.0.0.1:8000/'

In [2]: response.status
Out[2]: 200

In [3]: response.headers
Out[3]: 
{b'Date': b'Tue, 01 Sep 2020 04:13:20 GMT',
    b'Server': b'WSGIServer/0.2 CPython/3.8.2',
    b'Content-Type': b'text/html; charset=utf-8',
    b'X-Frame-Options': b'SAMEORIGIN'}

In [4]: response.meta
Out[4]: 
{'handle_httpstatus_list': <scrapy.utils.datatypes.SequenceExclude at 0x000000000>,
    'download_timeout': 180.0,
    'download_slot': '127.0.0.1',
    'download_latency': 0.08299803733825684,
    'depth': 0}

xpathを使ったコンテンツの取得方法です。

How to retrieve content using xpath.

xpathが間違っているので何も返ってこない。

This case, Xpath is wrong, so nothing is returned.

xpathの省略記法を使えば、ある程度推測でコンテンツを取得できる。

Using the shorthand for xpath, content can be retrieved with some guesswork.

text()はタグの文字列を取得する。

text() gets the tag string.

In [5]: response.xpath('/html/body/title/text()').get()

In [6]: 


In [6]: response.xpath('//title/text()').get()
Out[6]: '独学初心者プログラマーの日英ブログ'


In [7]: response.xpath('//h3/text()').get()
Out[7]: '最新の投稿'

タグのみを指定すると該当したタグがリストになって返ってくる。

If only the tag is specified, the corresponding tag is returned as a list.

試しにブログの最新ページにアクセスしてみます。

Try going to the latest page in the blog.

リンク先のURLは属性値を表す[@]で取得できます。

The URL to link to can be obtained by [@] representing the attribute value.

ベースとなるURLを取得します。

Gets the base URL.

このベースとなるURLに先ほどのページのURLをくっつけます。

Add the URL of the previous page to the end of the base URL.

fetchメソッドを使って次のURLへアクセスします。

Use the fetch method to access the following URL.

In [8]: response.xpath('//h4')
Out[8]: 
[<Selector xpath='//h4' data='<h4><a href="/posts/166/">【Unity,ML-A...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/165/">【Python】PyO...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/164/">Processingと...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/163/">【Processing...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/162/">Processingで...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/161/">【Processing...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/160/">【Processing...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/159/">【Processing...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/158/">ぬる~く説明するPyt...'>,
    <Selector xpath='//h4' data='<h4><a href="/posts/157/">【Unity, C#,...'>]

In [9]: title_list = response.xpath('//h4')
In [10]: h4 = title_list[0]

In [11]: h4.xpath('a/@href').get()
Out[11]: '/posts/166/'


In [12]: base_url = response.url[:-1]
In [13]: base_url
Out[13]: 'http://127.0.0.1:8000'


In [14]: next_url = base_url + h4.xpath('a/@href').get()
In [15]: next_url
Out[15]: 'http://127.0.0.1:8000/posts/166/'

ちゃんとアクセスできているか確かめます。

Make sure you are accessing the page properly.

classが[headerText]のdivタグのh1タグのspanタグのbタグの文字列を全て取得する。

Get all the strings of the b tag of the span tag of the h1 tag of the div tag of class [headerText].

これを一つのタイトルとしてまとめたいのならjoin()メソッドを使ってもいい。

If you want to combine them into a single title, you can use the join() method.

二つの要素のリストを[スペース]で繋げて、一つの文字列にする。

Combines two lists of elements with [Space] to form a string.

In [16]: fetch(next_url)


In [17]: response.url
Out[17]: 'http://127.0.0.1:8000/posts/166/'
In [18]: response.status
Out[18]: 200


In [19]: response.xpath('//div[@class="headerText"]/h1/span/b/text()').getall()
Out[19]: 
['【Unity,ML-Agents】簡単な設定方法と学習方法',
    '【Unity,ML-Agents】Simple configuration and learning methods']


In [20]: blog_title = response.xpath('//div[@class="headerText"]/h1/span/b/text()').getall()

In [21]: ' '.join(blog_title)
Out[21]: '【Unity,ML-Agents】簡単な設定方法と学習方法 【Unity,ML-Agents】Simple configuration and learning methods'

このようなブログの全記事を効率よく取得して、タイトルと記事に分けて保存したい場合、scrapyを使えば楽に高速にできます。

If you want to capture all of these blog posts efficiently and store them in separate titles and posts, you can use scrapy to make it easier and faster.

では次回はScrapyでプロジェクトを作成してから実行してみましょう。

Next time, let's create a project in Scrapy and run it.



以上です。お疲れ様です。

That's all. Thank you for your hard work.