Pythonを使ったスクレイピングについて
前々回にインストールしたBeautiful Soupを使って、htmlをparseしてみようと思います。PHPではXpathを使って色々やってたような気がしますが、今回はPythonでできたらいいなと思っています。色々できるようになったら、PHPからPythonに切り替えようかなぁと思ったり。だってウェブに色々分析したりしたページ作ったりできるらしいし。幅が広がることはいいことです。
webページをダウンロードして、リンク一覧を集めてみる
私はイカが好きではないので、ひとまずCookpadのイカのレシピ一覧のところから、リンクされている記事を集めてみようと思います。
それにしても、Cookpadは検索に出てきますけど、こんな自動生成のページなんてスパムと変わらないんだから、Googleもペナルティを与えるべきでは?と思うのですが、GoogleはCookpadに甘いようですね。どうでもいいですけど。
import requests
import bs4
url='https://cookpad.com/category/552';
html_data=requests.get(url)
html_ps=bs4.BeautifulSoup(html_data.content,'html.parser')
print(html_ps.title)
///実行結果
<title>みんなの推薦 イカ レシピ 948品 【クックパッド】 簡単おいしいみんなのレシピが315万品</title>
本当に推薦してんの?というところはさておき、タグ付きででてきました。
ちなみに、最後のprintのところをこう変えると、中身だけになります
print(html_ps.title.text)
///実行結果
みんなの推薦 イカ レシピ 948品 【クックパッド】 簡単おいしいみんなのレシピが315万品
中身が出てきました。直感的に書けていいですね。でもこれ、1つしか取れませんが。
ところで、ソースをみると、レシピへのリンク、全部 recipe_title_番号 みたいな感じになってますね。正規表現で条件をつけて取得しようと思います。任意の条件をつけて取得するには、.find()というものがBeautiful Soupにあるらしいので、早速やってみます。
正規表現でタグを指定して取得する
正規表現のライブラリがあったはずなので、それで取得します。
状況を整理すると、find_allでidを正規表現で指定し、マッチしたデータを取得します。
import requests
import bs4
import re
url='https://cookpad.com/category/552';
#ページデータを取得
html_data=requests.get(url)
#ページをパースして
html_ps=bs4.BeautifulSoup(html_data.content,'html.parser')
#その中から条件にマッチした部分を抜く。複数なのでloopさせる
for link in html_ps.find_all(id=re.compile('^recipe_title')):
print(link['href']+' '+link.text)
##実行結果
/recipe/4307139 冷凍イカとピーマンの棒々鶏ソース炒めもの
/recipe/4029580 若イカとエビのキムチ炒め煮♪
/recipe/4249751 魚介のナポリ風オリーブ煮込み
/recipe/4311237 ◆パリパリ揚げ餅の海鮮うまみあんかけ♪◆
/recipe/4041818 簡単!イカと夏野菜のオイスターソース炒め
/recipe/4504250 いかそうめんの中華風サラダ
/recipe/4503747 ホタルイカの沖漬け
/recipe/3504381 イカとグレープフルーツのカルパッチョ
/recipe/4198375 イカと白菜とニラ もやしのコンソメ醤油煮
/recipe/4386290 いかの叩き寄せフライのセット
ふむ。無事に取れました。どれもイカが入ってますね。好きではない料理ばかりです。
そういえば、PHPではxpathを使っていましたけど、あれってCSSのセレクタみたいなやつで指定してましたね。Pythomでもできるらしいです。.selectでできるらしいです。せっかくなので、CSSのセレクタ的なやつで実施します。
ソースを見ると、div.recipe-textの下のh2の下のaっぽいですね。これでいきましょう
import requests
import bs4
import re
url='https://cookpad.com/category/552';
#ページデータを取得
html_data=requests.get(url)
#ページをパースして
html_ps=bs4.BeautifulSoup(html_data.content,'html.parser')
#その中から条件にマッチした部分を抜く。複数なのでloopさせる
for link in html_ps.select('div.recipe-text > h2 > a'):
print(link['href']+' '+link.text)
##実行結果
/recipe/4307139 冷凍イカとピーマンの棒々鶏ソース炒めもの
/recipe/4029580 若イカとエビのキムチ炒め煮♪
/recipe/4249751 魚介のナポリ風オリーブ煮込み
/recipe/4311237 ◆パリパリ揚げ餅の海鮮うまみあんかけ♪◆
/recipe/4041818 簡単!イカと夏野菜のオイスターソース炒め
/recipe/4504250 いかそうめんの中華風サラダ
/recipe/4503747 ホタルイカの沖漬け
/recipe/3504381 イカとグレープフルーツのカルパッチョ
/recipe/4198375 イカと白菜とニラ もやしのコンソメ醤油煮
/recipe/4386290 いかの叩き寄せフライのセット
うまくいきました。途中エラーが出ました。>の前後はスペースをあけないとエラーになるらしいです。なるほど。
これで基本的にスクレイピングするためのparseはうまくいきそうです。htmlですけど。
同じカテゴリの記事
コメント
http://mascmoto.com/bin/sitemap.xml
discreet gay dating apps
ukrainian dating sites in canada