Python は、特に Web スクレイピングやデータ視覚化に関して非常に人気のあるプログラミング言語です。この記事では、Python を使用して Web クローラーを作成し、クロールされたデータをデータベースに保存し、データ視覚化ツールを使用してデータを表示する方法を紹介します。
1. クロールデータ
まず、データをクロールするための Python クローラー プログラムを作成する必要があります。以下は、Douban Movie Top250 をクロールする例です。
Requests ライブラリを使用して HTTP リクエストを送信し、BeautifulSoup ライブラリを使用して HTML ページを解析し、正規表現を使用して必要なデータを抽出します。
import requests
from bs4 import BeautifulSoup
import re
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
movies = soup.find_all('div', class_='info')
data = []
for movie in movies:
name = movie.find('span', class_='title').get_text()
score = re.findall('(\d\.\d)', str(movie.find('span', class_='rating_num')))
if score:
score = float(score[0])
else:
score = None
director = re.findall('导演: (.*?) ', movie.find('p', class_='').get_text().strip())[0]
data.append({'name': name, 'score': score, 'director': director})
2、データベースに保存される
クロールされたデータをデータベースに保存します。ここでは MongoDB を例にします。
PyMongo ライブラリを使用して MongoDB データベースに接続し、指定されたコレクションにデータを挿入します。
from pymongo import MongoClient
client = MongoClient('localhost', 27017)
db = client['douban']
collection = db['movies']
for d in data:
collection.insert_one(d)
3. データの視覚化
Matplotlib ライブラリを使用してヒストグラムを描画し、映画の評価の分布を表示します。
PyMongo ライブラリを使用して MongoDB データベースからデータを読み取り、Matplotlib ライブラリを使用してヒストグラムを描画します。
import matplotlib.pyplot as plt
scores = []
for d in collection.find():
scores.append(d['score'])
bins = [i/10 for i in range(0, 11)]
plt.hist(scores, bins=bins, edgecolor='black')
plt.xlabel('score')
plt.ylabel('count')
plt.title('Movie score distribution')
plt.show()
完全なコードは次のとおりです。
import requests
from bs4 import BeautifulSoup
import re
from pymongo import MongoClient
import matplotlib.pyplot as plt
# 爬取数据
url = 'https://movie.douban.com/top250'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
movies = soup.find_all('div', class_='info')
data = []
for movie in movies:
name = movie.find('span', class_='title').get_text()
score = re.findall('(\d