general_crawler
汎用クローラのプロトタイプ
RSSとかサイトマップとかから、いい感じに記事を取ってくるだけのクローラ。スクレイピングはしない。
構成
分野 |
実装 |
クローラ |
Scrapy |
スケジューラ |
scrapy-do |
DB |
MySQL |
API |
Rails(GraphQL) |
画面 |
Nuxt.js |
その他 |
S3(minio) |
ポートとかの詳細はdocker-compose.yml
参照
初期設定
事前インストール
手順
-
docker-compose build
-
rake server:start
-
rake mysql:migrate
-
rake scrapy:push
-
http://localhost:9001 でminioブラウザにアクセスしてcrawl-data
バケットを作成
-
Insomniaからクロール設定登録(次項参照)
API(GraphQL)
クロール設定(サイトマップ)
```graphql
mutation {
createSitemapCrawlRequest(
input: {
jobType: "sitemap",
sitemapUrl: "https://example.com/sitemap.xml",
sitemapPatterns: ["sitemap-pt-post-2020-01"],
exceptArticlePatterns: ["https://example.com/99999"],
scheduleType: "now",
}) {
crawlRequest {
id
rules
}
result
}
}
```
クロール設定(RSS)
```graphql
mutation {
createRssCrawlRequest(
input: {
jobType: "rss",
rssUrls: ["https://news.example.com/rss/foobar.xml"],
tagName: "item",
linkNodeName: "link",
scheduleType: "now",
}) {
crawlRequest {
id
rules
}
result
}
}
```
クロール設定(サイトトップ)
```graphql
mutation {
createRegularCrawlRequest(
input: {
jobType: "regular",
startUrls: ["https://corp.example.com/blog/articles"],
indexPatterns: ["https://corp.example.com/blog/articles/page/[2|3]"],
articlePatterns: ["https://corp.example.com/blog/\\d+"],
exceptArticlePatterns:[],
scheduleType: "intervals",
intervalHours: 3
}) {
crawlRequest {
id
rules
}
result
}
}
```
ジョブ登録
```graphql
mutation {
scheduleJob(
input: {
requestId: 4,
isDryrun: true
}) {
result
isDryrun
}
}
```
ジョブ停止
```graphql
mutation {
cancelJob(
input: {
requestId: 15
}) {
result
}
}
```
補助コマンド
Rakeで補助コマンドを提供する
コンテナ操作
# コンテナ起動
rake server:start
# コンテナ停止
rake server:stop
scrapy操作
# プロジェクトをpush(再push含む)
rake scrapy:push
# 起動中のジョブリストを表示
rake scrapy:joblist
# scrapydのログを表示
rake scrapy:log
rails操作
# railsコンテナでマイグレーション
rake mysql:migrate
# railsコンソール
rake rails:console
scrapyジョブ操作
# ジョブの停止
rake scrapy:job:stop[#{job_id}]
# ジョブのログを表示
rake scrapy:job:log[#{job_id}]