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ですけど。

コメント

discreet gay dating apps
http://mascmoto.com/bin/sitemap.xml
discreet gay dating apps
ukrainian dating sites in canada