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

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

 

①まず、取得したデータを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を取得する方法で今回は解決しました。