同じクラス名があり必要でない情報まで抜き出してしまう

相変わらず、スクレイピングを楽しんでいる者です。

 

今回は欲しい情報を取得する際に

「おい、欲しい情報これだけなのにclass名が同じで必要ない情報までついてきてる。。だる」

ってことが起きました。

 

多分様々な手段があると思うんですが、私はそこにhrefがついていたのでreで指定して

「邪魔な所は消してしまえ!」っとなりました。

parser_html = beautifulsoup(xxx, 'html.parser')

for tag in parser_html.find_all(href=re.compile("yyyyyyyy")):

      tag.decompose()

 

はい、魔法のコードdecomposeメソッド

これで見たくない物は消せます👏

その後に実際取り出したい

ddd = []

for a in parser_html.find_all(class_='iiiiiiiiiiiiiii')

     ddd.append(a)

print(ddd)

完成!!

windows10環境によるスクレイピングheadless ~python~

今回はどうしても、headlessモード(非表示)でwebdriverを動かし情報をサイトから抜き出したいと考えコードを書いたので、復習で記事書きます。

 

今回は相当苦労しました。

様々な記事を参考にさせてもらいましたが、全然できない。

自分自身が出ているエラーに関する記事がほとんどない。

どうすればいいんだろうと悩み二日かかりました。

 

これまでの記事通りseleniumとbeautifulsoupを使用しサイトから欲しい情報を抜き出していました。

今回のheadlessはそのコードにoptionを追加することで可能にできます。

 

from selenium.webdriver.chrome.options import Options  #追加

 

options = webdriver.ChromeOptions()

options.add_argument('--headless')

options.add_argument('--proxy-server=http://...............')

browser = webdriver.Chrome(chrome_options=options)

browser.get("URL...")

 

これでchromeを非表示で実行できます。

 

selenium beautifulsoup エクセルへの保存

エクセルへの保存におけるエラー対応。

 

encoding="cp932"と設定しているが、時々エラーが発生してしまう。

今回私がでたエラーは”¥/n2013”が悪さをしていたみたいです。

 

んーどうしようかな。文字コード変えてもエラーなるしな・・と考えたあげく

with open ("xxx", 'a', newline='', encoding、errors='replace')を追加してないことにしようとなりました。

 

これで正常にスクレイピングしたデータをエクセルに保存できました。

様々なサイトのスクレイピングで苦労した所まとめ!

今回は自分自身が様々なサイトのスクレイピングを行うにあたって、何時間も作業にかかったり大変だった所をまとめてアウトプット&備忘録にしたいと思い書きます。

 

①まず、取得したデータをdataframe化させること

(項目;内容)この形でまとめたかった。

beautifulsoupでtitle_listsとcontents_listsを作っておく。「作業内容は割愛」

import pandas as pd  #モジュールを入れておく

df = pd.DataFrame({'項目':title_lists, '内容':contents_lists})

これでDataFrame化は簡単にできる。

それをcsvファイルに保存する方法も簡単である。

df.to_csv('output.csv', mode='a', encoding='cp932')

ー以上でデータフレームのcsvへの保存は完了ー

beautifulsoupで取得した文字列が全て1文字づつ区切られていた

本来:「あいさつ」→誤:「’あ’、’い’、’さ’、’つ’」

join関数を使用する。

i = ['あ','い','さ','つ']

ii = "".join(i)

print(ii)→[あいさつ]

 

テキストエディタの読み込み

f = open('xxx.txt')  #ファイルを開く

lines1 = f.readlines() #1行毎にファイル終端まで全て読む(改行も文字も含まれる)

f.close()   #ファイルを閉じる

 

④例外処理:try-except(文法的に正しいコードを書いても、実行時にエラーが発生することがあります。その時のための対処)

エラーが起きそうな所を

try:

例外が発生するかもしれないが、実行したい処理

except:

  

例外発生時に行う処理

 

⑤エクセルへの入力表記が異なる。

原因:改行が入っているデータとそうであるかないか。

i = [あいさ

    つ]

 

ii = i.replace('\n', '')

 

⑥リストにある数のみfor文で検索を繰り返し行いたい場合

③より行全てのデータを読み取ったのち¥

f = open(XXX.txt)

lines1 = f.readlines()

f.close()

kw = []

for r in lines1:

  kw.append(r)

for a in range(len(kw)):

  xxxxxxxxxxxxx

  xxxxxxxxxxxxx

以上で、リストの中に6個入っていたら六回作業を繰り返してくれるようできる。

 

⑦スケジュール機能を追加する場合、決まったタイミングで自動でコードを動かします。

def job()

    xxxxxxxxxxxx

    xxxxxxxxxxxx

    xxxxxxxxxxxx

schedule.every(10).minutes.do(job)  #10分毎に動かします

schedule.every(1).hour.do(job)  #1時間毎に動かします

schedule.every().day.at("10:30").do(job)  #AM10時30分に動かします

schedule.every().monday.do(job)  #月曜日に動かします

 while True:

    schedule.run_pending()

    time.sleep(1)

 

⑧get_text(' ' , strip=True)

引数に' ' , strip=Trueを設定することで、テキストに含まれる空白や改行を削除してくれます。

 

⑨split()メソッド 任意の文字で文字列を区切ります。

例)split(',')とすると hellow,world→'hellow'  'world'と分けることができます。

 

⑩beautifulsoupで取得したhtmlと自分自身がブラウザに表示されている画面が異なる現象(これが一番苦労した)

結論はいつも現在のurlをbeautifulsoupを使用するために取得していたコマンド

・response = req.urlopen(browser.current_url)

しかし、Webサーバーにはサーバーとブラウザ間で固有の情報を共有するためのセッションという仕組みがあり、同じURLにアクセスした場合でも、ブラウザが異なれば異なるページが表示される場合があるとのことです。そのためrewuest.urlopenを使う方法ではなく

response = browser.page_sourceで現在のURLを取得する方法で今回は解決しました。

 

 

selenium &beautifulsoupデータ収集

今日は時間が取れたので、復習とアウトプットのためデータ収集のためにseleniumとbeautifulsoupをまとめます。

・今回はマイナビから『会社名』と『年収』と『勤務地』『仕事内容』を取得し、csvファイルに保存する方法を書きます。

環境:

windows10

python

①モジュール(

Pythonには多くの「標準ライブラリ」や「外部ライブラリ」が「モジュール」として提供されている。

)を書き込んでいく。

今回必要な物

・from selenium import webdriver(ブラウザを自動で動かすために)

・import time(サイトに負荷をかけすぎないために時間を作るために必要)

・frome bs4 import BeautifulSoup(HTMLなどを解析するため)

・import urllib.request as req(簡単にURLを開くため)

 

前回の記事にも書いた調べたいサイトまでのコード書きます。(今回はマイナビ・説明は割愛します)

マイナビのページを開く作業〜

browser = webdriver.Chrome(executable_path= ☆☆「webdriverが置かれているpathを記入しpathを通します」)

url_login = 'マイナビのURL'

browser.get(url_login)

##以上でマイナビのページを開くことはできました。##

〜ここからはマイマビのページの中を自動で動かす〜

まず検索欄の要素を取得します。そのため、検証(右クリックした下の方にあります)

そこで欲しい要素にあるclassやname/id/xpathなど特徴があるものを見つけます。

要素を指定するため

element =browser.find_element_by_[xpath/id/name/xpath]('xxxxx')

→element = browser.find_element_by_id('srchWord')

print('取得したい企業名を記入してください')

corname = input()

検索欄に検索したい企業名を送る

element.send_key(corname)

次に検索実行ボタンを押したい。これまた要素を検証で探しにいく!

element = browser.find_element_by_id('srchButton').click()

time.sleep(0.5)「一瞬の待ち時間を作ります」

〜検索結果が複数出てきた場合は検索結果が一番上の企業を採用〜

再度クリックを押せる所の要素を検証で調べます。

element = browser.find_element_by_id('corpNameLink[0]').click()

*corpNameの要素は複数でてくる。それがリスト型になっているので[0]で指定する。

〜企業を選択することで新しいタブが開かれた〜

handle_array = browser.window_handles

browser.switch_to.window(handle_array[1])

〜また取得したい要素はブラウザ上になくスクロール下にあるとき〜

browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")

〜採用ページのタブを取得する〜

element = browser.find_element_by_id("headerEmploymentTabLink").click()

##以上で欲しい情報のページまで進むことができました##

〜ここでbeautifulsoupでHTMLの解析・取得を行う〜

response = req.urlopen(browser.current_url)

parser_html = BeautifulSoup(response, 'html.parser')

〜企業名〜

parser_html.find("h1")→<h1>○○株式会社</h1>

*実際エクセルに保存する時はタブは邪魔になってしまう。

タブを削除して中のテキストだけ抜き出すために以下の関数を使用します。

・get_text()関数  「テキストを取り出す」

・strip()関数    「空白を削除する」

parser_html.find("h1").get_text().strip()

→〇〇株式会社

〜仕事内容〜

parser_html.find(id="adveanceInfoWorkText").get_text().strip()

〜給与〜

parser_html.find(id="employTreatmentListDescText3190").get_text().strip()

〜勤務地〜

parser_html.find(id="employTreatmentListDescText3260").get_text().strip()

〜リストの中に保存していく〜

corpname = parser_html.find(id="adveanceInfoWorkText").get_text().strip()

suma = 

parser_html.find(id="employTreatmentListDescText3190").get_text().strip()

 loc =

parser_html.find(id="employTreatmentListDescText3260").get_text().strip()

 conten = 

parser_html.find(id="adveanceInfoWorkText").get_text().strip()

 corpname_list = []

for a in corpname:

    corpname_list.append(a)

##これでリストの中に格納完了。

それぞれ年収も勤務地も同様にリストにまとめた後

all_content = corpname_list, xxx, yyyy, ggg

とまとめます。

〜エクセルに書き込み保存をおこなう〜

with open()でExcelファイルを開く

with open('mainabi.csv', 'a', newline='', encoding=''cp932'')as f:

・()の中の左から二番目のaはファイルを追加で書いていくことを表します。

ここの'a'を'w'にすると毎回上書きしてエクセルに情報を書いてくれます。

・newline = ''は、改行コードの自動変換はされない設定。

・encodingはパソコンで日本語を解釈するために設定する。

(UTF_-8など何種類かある)

with open('mainabi.csv',xxxxxxx)

      writer = csv.writer(f)

     writer.writerow(all_content)

f.close()#ファイルを閉じる作業

 

##以上でマイナビを自動でブラウザ上で動かし好きな企業名を入れると企業名・年収・勤務地・仕事内容を取得しエクセルに保存してくれるpythonコード完了です。

 

#1

はじめまして、初ブログになります。

たぶん、読みづらい記事にはなりますがご了承ください。

 

自分自身のプロフィールとして

3年半勤めていた企業の営業からエンジニアに就職した人です。

私は独学では挫折すると思いスクールに通っていました。

現在は無事就職ができて都内の自社開発企業に勤めています。

自分自身の大学卒業から現在の中身はまた余裕があるときに振り返りたいと思います。

 

今回は今仕事で取り組んでいるpythonについてのアウトプットを行いたく記事を書きました。

私が取り組んでいるのはseleniumWeb ブラウザの操作を自動化するためのフレームワーク)です。

書く内容:ブラウザを自動で出す。

pythonをインストール

webdriver.Chromeをインストール

windowsの場合はwebdriver.Chromeをインストール後pathを通す必要があります。

vscode内>

from selenium import webdriver

 

#chromeのcは大文字でC

browser = webdriver.Chrome  

#今回はgoogleの検索ページを開くためurlを変数でおきます。

url_login = 'https://www.google.com/?hl=ja' 

#get()メソッドを使用する

browser.get(url_login)

以上でgoogleの検索ページを自動で開くことができます。

 

このあとは検証などを使い自分がして欲しい動作を自動化させて行きます。

また、内容が溜まり次第書きます。

今回は短すぎました。すいません。