Edited at

個人的なスクレイピングの雛形を作成した件 [Python]


はじめに

Pythonを使ってCMSの複数サイトから、URLデータ(約25000x1)と

ページデータ(約25000x5)のデータをスクレイピングしました。

アクセストレード系アフィリエイト向けの少しグレーな作業でしたので詳細は割愛します。

スクレイピング方法として、サイトの各ページのURLを記事一覧からすべて取得して、

その取得したURLから各ページのデータを取ってくるものでした。


URLを集める

単純にすべての記事ページのURLを集める場合どのような方法をとるでしょうか?

各ページのURLのid,カテゴリー,タグ等ですべてのページURLの関連性は見つけられそうにありません



https://qiita.com/XXXXX/items/7932e517b46bd9c1bc

https://qitta.com/XXXXX/2019/askfjaaweiojoe

https://qitta.com/YYYY/u09u5jjas90jsdf0

では、最新記事ページ(例:Qitta-すべての記事)のように

順にすべてのページがまとめてあるページを遷移しながら

すべての記事ページのURLを取得していけばいいのです。

その際のページ遷移にはほとんどの場合規則性があります。



https://qiita.com/items?page=

https://qiita.com/items?page=2

https://qiita.com/items?page=3



では、さっそくURLをスクレイピングする雛形です。


url

#モジュールのインポート

import requests
import numpy
from bs4 import BeautifulSoup
import pandas as pd
from pandas import Series,DataFrame

bace_url = "" #bace_urlの設定

#Dataのカラムを設定する(URLを集めるだけなので"URLだけ")
columns = ["URL"]
df = pd.DataFrame(columns=columns)

#実際にスクレイピングする関数を定義
def get_url(i):
geturl = soup.find_all("","")[i-1]
return geturl

##Daraframeに値を代入する

%%time #jupyter noteの場合実行時間がわかる

for page_num in range(1,#サイトのページ数):
r = requests.get(bace_url + ""+str(page_num))
soup = BeautifulSoup (r.text,"html.parser")

no = soup.find_all("","") #要素の数

try:
for i in range(len(no)):
one_url = pd.Series([get_url(i).get("href")],columns)
df = df.append(one_url,ignore_index=True)
except:
pass
df


url_data2.jpg

このようにすべての記事ページのURL(絶対パス)を取得しCSVに出力しました。

次にこのデータを読み込んで各ページのデータを取ってきて

またそれをCSV出力する雛形を紹介します。


URLの読み込みー>データ収集

今回のスクレイピングデータの例として[ タイトル , iframeタグ , iframeのURL , タグ ]をスクレイピングしたいと思います。


data

#モジュールのインポート

import requests
import numpy
from bs4 import BeautifulSoup
import pandas as pd
from pandas import Series,DataFrame

#カラム(取得するデータの設定)
df = pd.DataFrame(index = [],columns = ["タイトル","タグ","url","iframe"])

#URLファイルの読み込み
datas = pd.read_csv(".csv")
datas.reset_index()
data = datas.loc[:,"URL"]

%%time

for i in range(len(data)):

try:

r = requests.get(data[i])
soup = BeautifulSoup(r.text,"html.parser")

#スクレイピング例
#タイトル
title = soup.find("h1","entry-title").text

#iframe
iframe = soup.find("iframe","src")
A = soup.iframe.parent

#元URL
in_url = soup.iframe.get("src")

b = []

#タグ
tagclass = soup.find("span","category")
for i in tagclass.find_all("a"):
b.append(i.text)

series = pd.Series([title,b,in_url,A],index=df.columns)
df = df.append(series,ignore_index = True)

except:
pass

#CSVに出力
df.to_csv(".csv",index = False ,encoding="utf_8_sig")


datas.png

このようにURLのCSVデータを読み込んで、それからページ遷移して要素を取得できました。

上のコードでは、複数あるタグを1つのリストとして返しているのが特徴でしょう

スクレイピングする要素や方法はお任せします


おわり

あくまでも僕が個人的に使用した雛形です。

役に立つ部分があるとよいのですが

Githubからもダウンロードできます

Scraping-template-python-

スクレイピングについてたびたび書いていますが、今では多くの簡単スクレイピングツールがあることや

スクレイピングの法的な注意点などに関しても知りました

スクレイピングは楽しいですが、少し意識レベルを上げるべきかもしれません

以下の記事を参照ください(参考)

なぜWebスクレイピングを学ぶのか?

Webスクレイピングの注意事項一覧

WebサイトをスクレイピングするWebクローラー20選