世界を旅して暮らしたい放浪エンジニアブログ

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要素を見つけていきましょう。

スクリーンショット 2018-08-17 13.33.53 (1)

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をレンダリングするサイトのスクレイピング

今後機会があればこの不足した部分も記事にしていきたいと思います。

前のページ

次のページ

Profile

なかむ🇭🇰Webデベロッパー

なかむ🇭🇰Webデベロッパー

香港在住4年目になるWEBエンジニアのなかむです。 現在は、LaravelやRailsを利用したWEB開発を中心にエンジニアをしています。 顧客は全て日本の企業になります。リモート開発にて各企業様の支援を行なっております

プロフィール詳細はこちら

Latest Posts