Scrapyでクローリングをしてみる【Python】

実行環境はWindows7です。
まずはPythonの仮想環境を作って実行(activate)させます。

Scrapyのインストール

1
2
3
4
5
E:\pythonWorkspace>python -m venv Prj
E:\pythonWorkspace>cd Prj
E:\pythonWorkspace\Prj>cd Scripts
E:\pythonWorkspace\Prj\Scripts>activate
(Prj) E:\pythonWorkspace\Prj\Scripts>
Microsoft Visual C++ 14.0はすでにインストール済みとして、Scrapyとpywin32をインストールします。

1
2
3
4
5
6
7
8
9
10
(Prj) E:\pythonWorkspace\Prj\Scripts>pip install scrapy
Collecting scrapy
...中略...
Successfully installed Automat-0.6.0 PyDispatcher-2.0.5 Twisted-17.9.0 asn1crypto-0.24.0 attrs-17.4.0 cffi-1.11.4 constantly-15.1.0 cryptography-2.1.4 cssselect-1.0.3 hyperlink-17.3.1 idna-2.6 incremental-17.5.0 lxml-4.1.1 parsel-1.4.0 pyOpenSSL-17.5.0 pyasn1-0.4.2 pyasn1-modules-0.2.1 pycparser-2.18 queuelib-1.4.2 scrapy-1.5.0 service-identity-17.0.0 six-1.11.0 w3lib-1.19.0 zope.interface-4.4.3
(Prj) E:\pythonWorkspace\Prj\Scripts>pip install pywin32
Collecting pywin32
Using cached pywin32-222-cp36-cp36m-win_amd64.whl
Installing collected packages: pywin32
Successfully installed pywin32-222
(Prj) E:\pythonWorkspace\Prj\Scripts>

Scrapyのプロジェクト作成

仮想環境に、scrapyのプロジェクトを作成します。

1
2
3
4
5
6
7
8
9
10
(Prj) E:\pythonWorkspace\Prj\Scripts>cd ..
(Prj) E:\pythonWorkspace\Prj>scrapy startproject ScProj
New Scrapy project 'ScProj', using template directory 'e:\\pythonworkspace\\Prj\\lib\\site-packages\\scrapy\\templates\\project', created in:
E:\pythonWorkspace\Prj\ScProj

You can start your first spider with:
cd ScProj
scrapy genspider example example.com

(Prj) E:\pythonWorkspace\Prj>

Spiderの作成

次はSpiderを作ります。
Spiderはサイトの巡回やデータの抽出条件を定義する部分です。
QuotesSpiderという名前で、探索するサイトはquotes.toscrape.comを指定します。
Scrapy用の練習サイトのようですね。

1
2
3
4
5
6
(Prj) E:\pythonWorkspace\Prj>cd ScProj
(Prj) E:\pythonWorkspace\Prj\ScProj>scrapy genspider QuotesSpider quotes.toscrape.com
Created spider 'QuotesSpider' using template 'basic' in module:
ScProj.spiders.QuotesSpider

(Prj) E:\pythonWorkspace\Prj\ScProj>

QuotesSpider.pyがScProj/spiders配下に作成されました。

QuotesSpider.py
1
2
3
4
5
6
7
8
import scrapy

class QuotesspiderSpider(scrapy.Spider):
name = 'QuotesSpider'
allowed_domains = ['quotes.toscrape.com']
start_urls = ['http://quotes.toscrape.com/']
def parse(self, response):
pass

クローリング

動くかな?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
(Prj) E:\pythonWorkspace\Prj\ScProj>scrapy crawl QuotesSpider
2018-03-10 14:11:11 [scrapy.utils.log] INFO: Scrapy 1.5.0 started (bot: ScProj)
2018-03-10 14:11:11 [scrapy.utils.log] INFO: Versions: lxml 4.1.1.0, libxml2 2.9.5, cssselect 1.0.3, parsel 1.4.0, w3lib 1.19.0, Twisted 17.9.0, Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 17.5.0 (OpenSSL 1.1.0g 2 Nov 2017), cryptography 2.1.4, Platform Windows-7-6.1.7601-SP1
2018-03-10 14:11:11 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'ScProj', 'DOWNLOAD_DELAY': 3, 'FEED_EXPORT_ENCODING': 'utf-8', 'NEWSPIDER_MODULE': 'ScProj.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['ScProj.spiders']}
2018-03-10 14:11:11 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
'scrapy.extensions.telnet.TelnetConsole',
'scrapy.extensions.logstats.LogStats']
2018-03-10 14:11:11 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'scrapy.downloadermiddlewares.retry.RetryMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2018-03-10 14:11:11 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
2018-03-10 14:11:12 [scrapy.middleware] INFO: Enabled item pipelines:
['ScProj.pipelines.ScprojPipeline']
2018-03-10 14:11:12 [scrapy.core.engine] INFO: Spider opened
2018-03-10 14:11:12 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2018-03-10 14:11:12 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2018-03-10 14:11:12 [scrapy.core.engine] DEBUG: Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
2018-03-10 14:11:16 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://quotes.toscrape.com/> (referer: None)
2018-03-10 14:11:16 [scrapy.core.engine] INFO: Closing spider (finished)
2018-03-10 14:11:16 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 446,
'downloader/request_count': 2,
'downloader/request_method_count/GET': 2,
'downloader/response_bytes': 2701,
'downloader/response_count': 2,
'downloader/response_status_count/200': 1,
'downloader/response_status_count/404': 1,
'finish_reason': 'finished',
'finish_time': datetime.datetime(2018, 3, 10, 5, 11, 16, 392796),
'log_count/DEBUG': 3,
'log_count/INFO': 7,
'response_received_count': 2,
'scheduler/dequeued': 1,
'scheduler/dequeued/memory': 1,
'scheduler/enqueued': 1,
'scheduler/enqueued/memory': 1,
'start_time': datetime.datetime(2018, 3, 10, 5, 11, 12, 216567)}
2018-03-10 14:11:16 [scrapy.core.engine] INFO: Spider closed (finished)
(Prj) E:\pythonWorkspace\Prj\ScProj>

ログがだだーっと出てきます。
データの抽出条件を何も指定していないのでちょっと分かりにくいですが、以下のCrawledログが巡ったページを示しています。

1
2
Crawled (404) <GET http://quotes.toscrape.com/robots.txt> (referer: None)
Crawled (200) <GET http://quotes.toscrape.com/> (referer: None)

まずrobots.txtのページをクロールして404がかえってます。
Scrapyは、デフォルトでrobots.txtにアクセスしてそこのルールに従うという設定がされています。
そのあとにトップページをクロールして200がかえってます。


Pythonでスクレイピング - Scrapy入門最初の2歩目 - Qiita
Scrapy メモ - Qiita
Python - scrapy を用いてデータを収集し、mongoDB に投入する - Qiita


開発環境
WinOS : Windows7(64bit)
Python : 3.6.4(64bit)
Scrapy : 1.5.0

広告