pythonでwebスクレイピング

pythonでwebスクレイピングする。
最終目標はMGSの新着動画ページ(https://www.mgstage.com/search/cSearch.php?search_word=&sort=new&list_cnt=30&range=latest&type=top)をスクレイピングしようと思う。

まずスクレイピングの基礎から。

python3でwebスクレイピング(Beautiful Soup)(https://qiita.com/mtskhs/items/edf7dbba9b0b0246ef8f)
を参考にこのサイトをスクレイピングしてみる。

 
import requests
from bs4 import BeautifulSoup

url ="http://hytool.org/"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'lxml')

print(soup)

これで、このサイトの「doctype html」から「/html」までの全てのソースコートが取得できる。

find~を指定すると取得する値をタグ等で指定できる。

 
# タグで取得
print (soup.find_all("h1"))
print (soup.find_all("a"))
print (soup.find_all("img"))

クッションページを回避してスクレイピング

MGSは年齢認証のクッションページがあるため、上記のコードではクッションページのスクレイピングをしてしまう。

Pythonで年齢認証などのクッションページを回避してスクレイピングしたい(https://qiita.com/aizakku_nidaa/items/71829aa111be68843b8b)
を参考にやってみる。
どうやらクッキーを渡せば良いらしい。

クッキーは【Chrome】Cookieを確認する方法(https://coeure.co.jp/blog/pc_support/chrome_cookie_180208)で調べる。
クッキー消したりして年齢認証のクッキーを特定↓

参考サイトと同じクッキーだった。
書いた人もMGSのスクレイピングしてたのだろうか。

 
import requests
from bs4 import BeautifulSoup

url = 'https://www.mgstage.com/search/cSearch.php?search_word=&sort=new&list_cnt=30&range=latest&type=top'

cookie = {'adc': '1'}  # 名前:コンテンツ

soup = BeautifulSoup(requests.get(url, cookies=cookie).content, 'lxml')

print(soup)

xmlに書き込む

取得できたのでxmlにする。
①BeautifulSoupで値を取得
②ループ処理
③XMLファイルへの書き込み
するあと細々とした調整。
課題?
・タイムスタンプがタイムゾーン含んだ形式にしたい
・XML用エスケープをreplaceで処理したけど、他のやり方がありそうな気がする。
・XMLの作成が強引な気がする。JSONのデコード方法はググって出たけど、XMLはないのか?

 
import requests
from bs4 import BeautifulSoup
import datetime
dt_now = datetime.datetime.now()
print(dt_now)

url = 'https://www.mgstage.com/search/cSearch.php?search_word=&sort=new&list_cnt=30&range=latest&type=top'

cookie = {'adc':'1'} #名前:コンテンツ

soup = BeautifulSoup(requests.get(url, cookies=cookie).content, 'lxml')

rank_list = soup.find('div', class_="rank_list") #soupからrank_listのみ指定
rank_list_li = rank_list.find_all('li') #rank_listから全てのliを指定
item_xml = '' #not definedエラー避け

for oisii_soup in rank_list_li: #for 変数名 in 繰り返し条件:→「rank_list_li」の数だけ繰り返し処理

	title = oisii_soup.find('p', class_="title lineclamp") #タイトル取得
	title = title.get_text() #テキストのみ
	title = title.replace('&', '&')#XML用エスケープ
	print(title)
	
	img = oisii_soup.h5.img['src'] #画像URL取得
	print(img)

	href = oisii_soup.h5.a['href'] #リンクURL取得
	link = "https://www.mgstage.com/"+href #パス追加
	print(link)

	item_xml_temp = "		<item>\n		<title>"+title+"</title>\n		<link>"+link+"</link>\n		<pubDate>2020-11-22T12:07:00+09:00</pubDate>\n		<description><![CDATA[<a href='"+link+"'><img src='"+img+"'></a>]]></description>\n		</item>\n\n"
	item_xml = item_xml + item_xml_temp
	
before_xml = "<?xml version='1.0' encoding='UTF-8' ?>\n<rss version='2.0'>\n<channel>\n	<title>MGS新着動画のRSSフィード</title>\n	<link>https://www.mgstage.com</link>\n	<description>MGS新着動画のRSSフィード</description>\n	<lastBuildDate>2020-11-22T12:36:02+09:00</lastBuildDate>\n	<language>ja</language>\n"
after_xml = '</channel>\n</rss>'
merge_xml = before_xml+item_xml+after_xml

f = open('test.xml','w') #出力(w=上書き/a=追記)
f.write(merge_xml)
f.close()

レンタルサーバーで動かす

……挫折。
スターサーバーで動かそうとしたけど、上手く行かなかった。

 
#!/usr/bin/python3.6
print ('Content-Type: text/html\n\n')
print ("Hello world!")

.pyのままだとコードがそのまま表示されて、
拡張子を.cgiに変えると、500エラー。

そもそもレンサバ上にPythonの実行環境があるのかないのかよくわからん。Python3.6.xが入ってて、コマンドパスが「/usr/bin/python3.6」らしい。できそうな気はするのだけど……なぜ動かない?
「putty」でSSL接続したらローカルのコマンドプロンプトみたいな感じで動くっぽい?みたいな情報で試してみたけど、タイムアウトで接続できなかった。

PHPみたいにCRONで定期作動させようと思ってたけど、よくわからん。というかスクレイピングしたあとの情報を再度ネットに返す使い方は一般的ではないのか?イマイチ情報が少ない気がする。
やはりWEBサイトに出力するならPHPの方が使いやすいか。

→続き:PHPでwebスクレイピング

コメントを残す

メールアドレスが公開されることはありません。