webサイトのクロールはscrapyを利用する方が一般的だし細かく制御できるのですが、何となくadvertoolsを利用してみました。
ツール 🔗
advertools
環境構築 🔗
Dockerfile
を利用して環境構築をしました。rootの下に Dockerfile
と docker-compose.yml
ファイルを配置。 work
ディレクトリを作成しておく。
1
2
3
|
├── docker-compose.yml
├── Dockerfile
└── work
|
Dockerfile
の中身はこんな感じ。他の用途で利用していたものを少し改変しただけなので微妙かもですが。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
FROM python:3.9.7-buster
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
tzdata \
&& ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
ENV TZ=Asia/Tokyo
RUN python3 -m pip install --upgrade pip \
&& pip install --no-cache-dir \
black \
advertools
|
docker-compose.yml
ファイルを作成。
1
2
3
4
5
6
7
8
9
10
11
|
version: '3'
services:
app:
build: .
ports:
- '7654:7654'
volumes:
- './work:/work'
tty: true
stdin_open: true
|
sampleソースコード 🔗
クロールする際にDDoS攻撃にならないようdelayをかけながらデータを取得する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
import advertools as adv
import pandas as pd
CUSTOM_SETTINGS = {'ROBOTSTXT_OBEY': False,
'USER_AGENT': 'custom-useragent',
'DOWNLOAD_DELAY': 3,
'CONCURRENT_REQUESTS_PER_DOMAIN': 1}
# crawlサイトURL
site = "https://www.example.com"
adv.crawl(site,
'simp.jl',
follow_links=True,
allowed_domains=['www.example.com'],
custom_settings=CUSTOM_SETTINGS,
exclude_url_params=['q', 'search'],
exclude_url_regex='/blog/',
include_url_regex='/column/')
crawl_df = pd.read_json('simp.jl', lines=True)
crawl_df.to_csv("output.csv")
|
sitemapファイルを指定してデータを取得することもできる
1
2
3
4
5
6
7
|
from advertools import sitemap_to_df
import pandas as pd
sitemap = "https://www.example.com/sitemap.xml"
data = sitemap_to_df(sitemap, recursive=True)
data.to_csv("output.csv")
|
scrapyよりも細かい設定が出来ない分、advertoolsではsitemapファイルからデータを取得する方が現実的かもしれない。
個人で使っていたクロールツールは会社の費用で購入していればよかったのですが、個人的な利用もあるし会社のPCだとメモリが足りないなどの原因もあり個人で購入して利用していました。ただツールが円安の影響もあり大幅に値上げされていたので、そこまで沢山の機能がないにしても個人で使えるレベルのプログラムで実装することにしました。
今度scrapy側もちゃんと整備してから、どちらのツールを利用していくか決めようと思います。