使用Python爬取豆瓣电影top250

本文为学习记录笔记,原创非常优秀~ 感谢@数挖小飞飞 思密达。
在运行源程序时,发现关于路径的报错。故,本文对@数挖小飞飞 大大的代码做了一小点修改,添加了建立文件夹函数。
原文链接:https://blog.csdn.net/qq_36936730/article/details/104668162

1.修改部分

在运行原程序时,未手动建立文件夹“film_pic”。程序报错如下:
在这里插入图片描述
添加函数如下,将creat_dir()添添加至主函数第一行即可。

# create dir
def create_dir():

	import os		# 引入python 的OS库

	file_path = r'E:/PySource/film_pic'	 # 文件夹路径及名称

	if os.path.exists(file_path):		# 判断是否已存在同名文件夹,存在则删除后重新创建
		os.rmdir(file_path)
		os.mkdir(file_path)
	else:
		os.mkdir(file_path)

2.运行结果

在这里插入图片描述在这里插入图片描述

3.完整学习代码


# 发送请求——获得页面——解析页面——抽取并储存内容

import requests
import re
import json

'''
# Web Capture
url = "https://movie.douban.com/top250?start=0&filter="
headers = {
	"user-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3742.400 QQBrowser/10.5.3866.400"
}
response = requests.get(url,headers=headers)
text = response.text

# information extraction
regix = '<div class="pic">.*?<em class="">(.*?)</em>.*?<img.*?src="(.*?)" class="">.*?' \
        'div class="info.*?class="hd".*?class="title">(.*?)</span>.*?class="other">(.*?)'\
        '</span>.*?<div class="bd">.*?<p class="">(.*?)<br>(.*?)</p>.*?' \
        'class="star.*?<span class="(.*?)"></span>.*?span class="rating_num".*?average">(.*?)</span>.*?<span>(.*?)</span>.*?' \
        'span class="inq"?>(.*?)</span>'
res = re.findall(regix, text, re.S)
print(res)

# image download defination
def down_image(url,name,headers):
	r = requests.get(url,headers = headers)
	filename = re.search('/public/(.*?)$',url,re.S).group(1)
	with open("film_pic/"+name.split('/')[0]+".jpg",'wb') as f:
		f.write(r.content)
'''

headers = {
	"user-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3742.400 QQBrowser/10.5.3866.400"
}

# create dir
def create_dir():

	import os

	file_path = r'E:/PySource/film_pic'

	if os.path.exists(file_path):
		os.rmdir(file_path)
		os.mkdir(file_path)
	else:
		os.mkdir(file_path)

# image download defination
def down_image(url,name,headers):
	r = requests.get(url,headers = headers)
	filename = re.search('/public/(.*?)$',url,re.S).group(1)	
	with open("film_pic/"+name.split('/')[0]+".jpg",'wb') as f:		
		f.write(r.content)

# Web page parsing function
def parse_html(url):	
	response = requests.get(url,headers=headers)	
	text = response.text	

	# 正则表达式头部([1:排名 2:图片] [3:名称 4:别名] [5:导演 6:年份/国家/类型] [7:评星 8:评分 9:评价人数] [10:评价])	
	regix = '<div class="pic">.*?<em class="">(.*?)</em>.*?<img.*?src="(.*?)" class="">.*?' \
        'div class="info.*?class="hd".*?class="title">(.*?)</span>.*?class="other">(.*?)'\
        '</span>.*?<div class="bd">.*?<p class="">(.*?)<br>(.*?)</p>.*?' \
        'class="star.*?<span class="(.*?)"></span>.*?span class="rating_num".*?average">(.*?)</span>.*?<span>(.*?)</span>.*?' \
        'span class="inq"?>(.*?)</span>'

	# match all the results
	res = re.findall(regix, text, re.S)
	for item in res:
		rank = item[0]
		down_image(item[1],item[2],headers = headers)
		name = item[2] + ' ' + re.sub('&nbsp;', ' ',item[3])
		actor = re.sub('&nbsp;', '',item[4].strip())
		year = item[5].split('/')[0].strip('&nbsp;').strip()
		country = item[5].split('/')[1].strip('&nbsp;').strip()
		tp = item[5].split('/')[2].strip('&nbsp;').strip()
		tmp = [i for i in item[6] if i.isnumeric()]
		if len(tmp) == 1:
			score = tmp[0] + '星/' + item[7] + '分'
		else:
			score = tmp[0] + '星半/' + item[7] + '分'
		rev_num = item[8][:-3]
		inq = item[9]

		# create dictionary
		yield{
			'电影名称': name,'导演和演员': actor, '类型': tp, '年份': year, '国家': country, '评分': score,'排名': rank, '评价人数': rev_num, '评价': inq
		}

# define output function
def write_movies_file(str):
	with open('top250_douban_film.txt','a',encoding='utf-8') as f:	# write in top250_douban_film.txt
		f.write(json.dumps(str, ensure_ascii=False) + '\n')

# define main()
def main():
	create_dir()
	for offset in range(0,250,25):
		url = 'https://movie.douban.com/top250?start=' + str(offset) + '&filter='
		for item in parse_html(url):
			print(item)
			write_movies_file(item)

if __name__ == '__main__':
    main()

好的,我可以为您介绍一下爬取豆瓣电影Top250数据的步骤,并介绍一些可视化处理的方法。 首先,我们需要安装一些必要的Python库,比如requests、BeautifulSoup和pandas。使用pip install命令可以轻松安装它们,例如: ```python pip install requests pip install beautifulsoup4 pip install pandas ``` 然后,我们可以编写Python代码来爬取豆瓣电影Top250的数据。以下是一个简单的爬虫示例: ```python import requests from bs4 import BeautifulSoup import pandas as pd 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'} movie_list = [] for i in range(10): start = i * 25 url_new = url + '?start=' + str(start) + '&filter=' response = requests.get(url_new, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') items = soup.find_all('div', class_='item') for item in items: movie = {} movie['title'] = item.find('span', class_='title').text.strip() movie['score'] = item.find('span', class_='rating_num').text.strip() movie['quote'] = item.find('span', class_='inq').text.strip() movie_list.append(movie) df = pd.DataFrame(movie_list) df.to_csv('douban_top250.csv', index=False) ``` 这段代码通过循环遍历Top250的每一页,使用requests库发送HTTP请求并使用BeautifulSoup库解析HTML响应。然后,我们可以从HTML中提取出电影的标题、评分和引言,并将它们存储到一个列表中。最后,我们使用pandas库将列表转换为一个DataFrame对象,并将其保存为CSV文件。 接下来,我们可以使用一些可视化工具来可视化这些数据。例如,使用matplotlib库可以绘制电影评分的直方图: ```python import matplotlib.pyplot as plt df['score'] = df['score'].astype(float) plt.hist(df['score'], bins=10) plt.xlabel('Score') plt.ylabel('Count') plt.title('Distribution of Scores') plt.show() ``` 这段代码将DataFrame中的评分列转换为浮点数,并使用matplotlib库绘制直方图。我们可以看到,大多数电影的评分分布在7.5到9.5之间。 除了直方图,还可以使用其他可视化工具来探索数据。例如,使用seaborn库可以创建一个热力图,显示每个电影的评分和排名之间的关系: ```python import seaborn as sns df['rank'] = df.index + 1 df['score'] = df['score'].astype(float) sns.heatmap(df[['rank', 'score']].corr(), annot=True, cmap='coolwarm') plt.title('Correlation between Rank and Score') plt.show() ``` 这段代码使用seaborn库创建一个热力图,显示排名和评分之间的相关性。我们可以看到,排名和评分之间存在强烈的负相关关系,也就是说,评分越高的电影通常排名越靠前。 以上就是爬取豆瓣电影Top250数据并进行可视化处理的简单示例。当然,如果您需要更详细的数据分析和可视化,也可以使用其他Python库,如numpy、scipy和plotly等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值