Webスクレイピングやってみた
巷で噂のスクレイピング
大量の情報がストックされているインターネットとかいう場所からガバァッと情報をさらっていける技術「スクレイピング」。いろんな場所で活躍すること間違いなしなのですが、特に機械学習と仲が良さそうなので、これは勉強しない手はないと思い、使ってみました。
はまったところ
正規表現でハマっています。
for div in soup.find_all("div", class_="video-list-title"):
print(str(div))
s_pattern = re.compile(r'<a href=".*">')
s_search = s_pattern.search(str(div))
print(s_search)
出力
<div class="video-list-title"><p><a href="/recipes/5dd98b76-6358-47ce-8c1b-f59918b5a1df">意外と美味!きゅうりとベーコンのガーリック炒め</a></p></div>
<_sre.SRE_Match object; span=(33, 89), match='<a href="/recipes/5dd98b76-6358-47ce-8c1b-f59918b>
上記3行目の正規表現でurl部分をマッチさせたいのですが、最後の方が切れてしまっています。 上記3行目の正規表現部分を r’f=”.*”>’ に変えたらできたので、.* には文字制限があるのでしょうか?
→今の挙動的にはsearchには文字制限がありそう searchの代わりにfindallを使うことでうまくいった
コード
# coding: utf-8
# In[1]:
from bs4 import BeautifulSoup
import requests
import re
import json
# In[2]:
categories_url = "https://www.kurashiru.com/categories/"
recipes_url = "https://www.kurashiru.com"
# In[3]:
c_html = requests.get(categories_url + "1")
soup = BeautifulSoup(c_html.content, "html.parser")
# In[5]:
dish_list = []
for div in soup.find_all("div", class_="video-list-title"):
search = re.findall(r'href=".*</a>', str(div))
url = search[0].split('"')[1]
title = search[0].split('"')[2][1:-4]
dish_list.append({"title": title, "url": url})
print(dish_list)
# In[ ]:
for dish in dish_list:
r_html = requests.get(recipe_url + dish["url"])
soup = BeautifulSoup(r_html.content, "html.parser")
dish["url"]