advertoolsでのウェブサイトクロールメモ

· ·

webサイトのクロールはscrapyを利用する方が一般的だし細かく制御できるのですが、何となくadvertoolsを利用してみました。

ツール 🔗

advertools

環境構築 🔗

Dockerfile を利用して環境構築をしました。rootの下に Dockerfiledocker-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側もちゃんと整備してから、どちらのツールを利用していくか決めようと思います。

comments powered by Disqus