darkproxyscrape ロゴ

Web Scraping For Job Postings – An Ultimate 2024 Guide

パイソン, スクレイピング, 01月04日-2023年5分で読める
求人情報のウェブスクレイピングは、求職者が現在の求人情報のデータベースを作成するための代替の近道です。ランスタッドによると、平均的な求職活動は、応募からポジションが決まるまで5~6ヶ月かかるという。すべての求人ポータルサイトに目を通し、自分に合ったものを選ぶという負担を軽減できるソリューションがあるとしたらどうだろう。 

この記事では、求人情報のウェブスクレイピングの方法を説明する旅にご案内します。あなたは今求人市場にいて、最高の仕事を見つけようとしている。しかし、あなたはより賢く、よりハードにプレイしたい。あなたのために求人情報を収集し、解析するウェブスクレイパーを作ってみてはどうだろう。一度設定すれば、豊富なデータを整然としたフォーマットで提供してくれるので、何度も手作業でチェックする必要はない。さあ、始めよう。

求人広告のウェブスクレイピングとは?

求人情報のウェブスクレイピングは、自動的に複数の求人ポータルサイトからデータを収集し、各ウェブサイトからデータを取得する時間を短縮するソリューションです。求人情報の完全なデータベースを提供してくれるこのようなツールがあれば、あなたの仕事は何倍も簡単になります。あなたがしなければならないことは、あなたに合うものをフィルタリングし、応募プロセスに進むことだけです。 

だから、あなたは就職市場にいて、最高の仕事を見つけようとしている。でも、もっと賢く、もっとハードにやりたい。そんなあなたのために、求人情報を収集・解析するウェブスクレーパーを作ってみませんか?一度セットすれば、豊富なデータを整然としたフォーマットで提供してくれるので、何度も手作業でチェックする必要はありません。さあ、始めましょう。

[免責事項多くのウェブサイトは、そのページからのデータのスクレイピングを制限することができます。ユーザーは、情報を抽出しようとする場所や方法によっては、法的な問題にさらされる可能性がある。そのため、データを保存しているサイトを見る場合は、細心の注意が必要だ。例えば、Facebook、Linked In、Craiglistは、そのページからデータがスクレイピングされた場合、時々注意を喚起する。だから、スクレイピングしたいのであれば、自己責任でスクレイピングすること]。

この記事では、indeed.comから「データサイエンス」に関連する求人に関する有益な情報を抽出することで、ウェブスクレイピングの基本を見ていきます。求人情報を手動で複数回更新する素晴らしいプログラムを書く予定です。このスクレイパーを作成する際に非常に便利なライブラリは、"requests "と "BeautifulSoup "です。

URLとページ構造を理解する

まず、これから抽出するサンプルページを見てみよう 

URLの構造は重要だ:

  • "q="は、ページ上の "what "フィールドの文字列を開始し、検索語句を "+"で区切ります(例:"data+scientist "の求人を検索する場合)。
  • 給与を指定する場合、給与の数字をカンマで区切って解析するため、給与の始めは%24で始まり、最初のカンマの前に数字が入り、次に%2Cで区切られて残りの数字が続きます(例:%2420%2C000 = $20,000)。
  • 注 "&l="は、都市が複数の単語で構成されている場合、検索語を "+"で区切って、目的の都市を表す文字列を開始する(例:"New+York")。
  • 注記 "&start="は、検索結果のどこから始めたいかを示す(つまり、10番目の検索結果から始める)。

このURL構造は、スクレーパーの構築を続け、複数のページからデータを収集する際に大いに役立つだろう。 

Chromeは、ページを右クリックしてinspect elementオプションを使うことで、ページのHTML構造を調べることができる。右側にメニューが表示され、ネストされた要素タグも表示され、それらの要素にカーソルを置くと、その部分がハイライトされます。  

この記事を書くにあたって、タグやdivなどHTMLの基本的なことは知っていると思うが、幸いなことにすべてを知る必要はない。ページ構造とさまざまなコンポーネントの階層構造を理解していればいいのだ。

スクレーパーを使い始める

これでページの構造を分析した。これで、その情報に従ってコードを構築し、好みのデータを引き出すことができるようになる。まず、ライブラリをインポートすることから始めよう。ここで「time」もインポートしていることに注目してほしい。これは、情報をスクレイピングする際にサイトのサーバーに負担をかけないようにするためだ。

インポートリクエスト
インポートbs4
frombs4importBeautifulSoup
importpandasaspd
インポート時間

まず、欲しい情報を引き出すために、1つのページをターゲットにする、

URL ="https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#上記のURLのリクエストを実行する:
page = requests.get(URL)
#これにより、pythonはページを1つの長い文字列として扱うのではなく、ページの様々な要素を読み取ることができます。
スープ = BeautifulSoup(page.text,"html.parser")
#読みやすくするため、より構造化されたツリー形式でスープを印刷します。
print(soup.prettify())

prettifyを使うことで、ページのHTMLコーディングの概要を簡単に把握することができ、次のような出力が得られます、

 これで、目的のページの情報はすべて変数 "soup "に入った。必要な情報を取得するために、様々なタグやサブタグを反復するために、コードをもっと掘り下げなければならない。

データの基本要素の取得

すべての求人広告で重要なのは5つのポイントだ、

  1. 役職名
  2. 会社名
  3. 場所は?
  4. 給与
  5. 仕事の概要

ページを見てみると、15件の求人情報がある。したがって、私たちのコードも15種類の項目を生成する必要があります。しかし、もしコードがこれより少ない数を提供するのであれば、ページを参照し、何がキャプチャされていないかを確認することができる。

役職名の取得

As can be seen, the entirety of each job posting is under <div> tags, with an attribute “class” = “row result.”

Further, we could also see that job titles are under <a> tags, with the attribute “title = (title)”. One can see the value of the tag’s attribute with tag[“attribute”], so I can use it to find each posting’s job title.

要約すれば、これから見る機能には次の3つのステップがある、

  1. Pulling out all the <div> tags with class including “row”.
  2. Identifying <a> tags with attribute “data-tn-element”:”jobTitle”
  3. For each of these <a> tags, find attribute values “title”
def extract_job_title_from_result(soup): 
  jobs = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
      jobs.append(a["title"])
  return(jobs)
extract_job_title_from_result(soup)

このコードは次のような出力になる、

会社名の取得

Getting company names can be a bit tricky because most of them are appearing in <span> tags, with “class”:” company”.  They are also housed in <span> tags with “class”:” result-link-source”.

if/else文を使って、それぞれの場所から会社情報を抽出します。出力時に会社名の周りの空白を削除するために、最後にinputting.strip()を使用します。

def extract_company_from_result(soup): 
 companies = []
 for div in soup.find_all(name="div", attrs={"class":"row"}):
   company = div.find_all(name="span", attrs={"class":"company"})
   if len(company) &gt; 0:
    for b in company:
     companies.append(b.text.strip())
   else:
    sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
    for span in sec_try:
      companies.append(span.text.strip())
 return(companies)
 
extract_company_from_result(soup)

ロケーション

Locations are located under the <span> tags. Span tags are sometimes nested within each other, such that the location text may sometimes be within “class”:”location” attributes, or nested in “itemprop”:”addressLocality”. However a simple for loop can examine all span tags for text and retrieve the necessary information.

def extract_location_from_result(soup): 
  locations = []
  spans = soup.findAll('span', attrs={'class': 'location'})
  for span in spans:
    locations.append(span.text)
  return(locations)
extract_location_from_result(soup)

給与

給与は求人情報から抽出するのが最も難しい部分です。ほとんどの求人情報は給与情報を全く掲載していませんが、掲載している求人情報もあります。そのため、複数の場所から複数の給与をピックアップできるコードを書く必要があります。もし給与が見つからない場合は、給与を含まない求人のプレースホルダ「Nothing Found」値を作成する必要があります。 

Some salaries are under <nobr> tags, while others are under <div> tags, “class”:”sjcl” and are under separate div tags with no attributes. Try/except statement can be helpful while extracting this information. 

def extract_salary_from_result(soup): 
  salaries = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    try:
      salaries.append(div.find('nobr').text)
    except:
      try:
        div_two = div.find(name="div", attrs={"class":"sjcl"})
        div_three = div_two.find("div")
        salaries.append(div_three.text.strip())
      except:
        salaries.append("Nothing_found")
  return(salaries)
extract_salary_from_result(soup)

職務概要の取得

最後の仕事は、求人概要を取得することです。しかし、IndeedページのHTMLには含まれていないため、各ポジションの求人概要を取得することはできません。提供されているものから各求人についての情報を得ることはできます。この目的のためにSeleniumを使うことができます。

But let’s first try this using python. Summaries are located under <span> tags. Span tags are nested within each other such that the location text is within “class”:” location” tags or nested in “itemprop”:” adressLocality”. However, using a simple for loop can examine all span tags for text to retrieve the necessary information.

よくある質問

1. Why is it necessary to scrape job details?
あなたのプロフィールにマッチした求人を通知してくれる求人ポータルは十分にある。しかし、求人情報のスクレイピングソリューションを利用すれば、求人情報の完全なリストとその説明を便利なデータベースとして手に入れることができます。そうすることで、すべての求人情報を一元的に把握することができます。
2. How can a proxy help in scraping job details?
ウェブスクレイピングには通常、IPブロック、地域ブロック、速度制限などの課題がある。求人ポータルからの求人情報のスクレイピングにもそのような課題があります。これらの問題を回避するために、プロキシアドレスが必要な場所のIPアドレスを提供し、匿名性を確保します。
3. What are the python libraries required to scrape job details?
Requests, BeautifulSoup, and Pandas are quite common python libraries to scrape job-related data from websites. Request library is the most common python library used to send web requests, while BeautifulSoup is responsible for parsing data, and Pandas library will help with the data structure operations.
関連記事

まとめ

この記事では、Indeedのウェブページから求人データをスクレイピングすることを例に、ウェブスクレイピングとは何か、そしてそれが日常生活でどのように役立つかを見てきました。Indeedは動的なページであるため、情報は時間とともに変化し続け、得られる結果はこれらとは異なる可能性があることに注意してください。 

ウェブスクレイピングは、正しく、要件に従って行えば、素晴らしいテクニックです。私たちはさらに、すべての求人情報の重要な5つの側面と、それらを抽出する方法を見てきました。このコードを自分で試してみると、求人情報のデータがスクレイピングされ、手作業で求人情報を検索する必要がなくなります。同じテクニックは他のウェブページにも適用できるが、その構造は異なるかもしれない。そのため、それに応じてコードを最適化する必要がある。しかし、基本的なことはすべてこの記事でカバーされているので、他のページをスクレイピングするのに苦労することはないだろう。

プロキシ・サービスをお探しなら、以下をお忘れなく。 ProxyScrape住宅用と プレミアムプロキシ