Scrapyを利用して"Laravel"の副業案件を探す
Python製のWebスクレイピングライブラリ「Scrapy」を利用して"Laravel"の案件を探してみる
[ 目次 ]
はじめに
こんにちは、香港に住んでいるWEBデベロッパーのなかむ(@nakanakamu0828)です。
今回はWebスクレイピングフレームワークのScrapy
を利用してスクレイピングを試してみたいと思います。今まで「Ruby + curb + nokogiri」や「PHP + Goutte」でスクレイピングを行ってきましたが、pythonでスクレイピングするのは初めてになります。「python + Scrapy」の使い方を学んでいきます。
タイトルにもあるようにLaravelの副業案件を見つけたいと思いますので、リモートワークをメインとして求職情報を扱っている「CODEAL」をスクレイピングしてみます。
注)
- スクレイピングを行うときはサービスに迷惑がかからないように配慮しましょう
- CODEAL 社の皆様、勝手に題材として利用させて頂きます。ご了承ください。
Scrapyインストール
既にpythonがインストールされていて、pip
コマンドが利用できる状態になっていることが前提となります。今回はMacOS上で試していきます。
$ pip install scrapy
Scrapyプロジェクトを作成
今回はfindlara
というプロジェクト名で進めていきます。
$ scrapy startproject findlara
以下のようなディレクトリ構成のプロジェクトが生成されます
findlara
├── findlara
│ ├── __init__.py
│ ├── __pycache__
│ ├── items.py
│ ├── middlewares.py
│ ├── pipelines.py
│ ├── settings.py
│ └── spiders
│ ├── __init__.py
│ └── __pycache__
└── scrapy.cfg
Spider作成
SpiderはスクレイピングするサイトのURLやスクレイピングの処理を記述します。
$ vi findlara/spiders/codeal_spider.py
作成したソースはこちら
import scrapy
import re
from urllib import parse
class CodealSpider(scrapy.Spider):
name = "codeal"
def start_requests(self):
urls = [
'https://www.codeal.work/jobs/skill/Laravel'
]
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self, response):
text = response.css('.page-info > span::text')[1].extract()
matched_all_count = re.findall(r"\s([0-9]+)\s件中", text)
matched_limit = re.findall(r"\s([0-9]+)\s件を表示", text)
for title in response.css('section h1 > a'):
yield {
'title': title.css('a::text').extract_first(),
'href': title.css('a::attr(href)').extract_first()
}
if (matched_all_count and matched_limit and matched_all_count[0] > matched_limit[0]):
urlparse = parse.urlparse(response.url)
query_dict = parse.parse_qs(urlparse.query)
page = int(query_dict['p'][0]) if 'p' in query_dict else 1
query_dict.update({
'p': page + 1
})
query_string = parse.urlencode(query_dict, True)
parts = urlparse._replace(query=query_string)
new_url = parse.urlunparse(parts)
yield scrapy.Request(url=new_url, callback=self.parse)
https://www.codeal.work/jobs/skill/Laravel のページからLaravel案件のタイトルと詳細リンクを抽出するプログラムです。
ページング機能があるので最終ページまでスクレイピングしていきます。
スクレイピングをする際は、ブラウザの開発コンソールからHTMLを分析しながら取得したいデータのHTML要素を見つけていきましょう。
CSV出力
スクレイピングの結果をCSVに出力します。
$ scrapy crawl codeal -o job.csv
job.csv
の中身は以下のような形になります。
title,href
無料のモニタープレゼントサービス「MONITARO」のLaravelを使ったサーバサイド開発,/jobs/7466
インフルエンサーマーケティング「FIXA」のLaravelを使ったサーバサイド開発,/jobs/7460
"株式会社DATにおける自社メディアの新規開発(PHP,Laravel)",/jobs/6225
ベルフェイス株式会社における既存サービスのSPA&マイクロサービス化を推進するエンジニア募集(API&フロントエンド),/jobs/7614
インフルエンサーマーケティング「FIXA」のLaravelを使ったサーバサイド開発,/jobs/7462
・・・
最後に
今回の記事はScrapyを利用したスクレイピング処理の基礎です。実際に業務でスクレイピングする際は以下の内容を考慮する必要が出てくるでしょう。
- スクレイピングしたデータを直接DBにインポート
- ログインが必要なサイトへのスクレイピング
- SPAなどjavascriptでHTMLをレンダリングするサイトのスクレイピング
今後機会があればこの不足した部分も記事にしていきたいと思います。