参考教材第34节抓取电影排行榜的内容使用Python编写爬虫自动爬取豆瓣电影TOP250排行榜中250部影片并利用BeautifulSoup4库提取相关信息包含基本信息排名海报片名评分导演主演上映时间上映地点类型热门短评与第一页前10名影片的前5条热门短评如果是5条短评请加上序号并用换行分隔如1这是一部好电影等注意:海报列存储的是获取海报图片并保存在本地之后对本地图片文件的超链接片名列存储的是影片
流程图如下:
开始 -> 爬取网页内容 -> 解析网页内容 -> 提取基本信息 -> 提取热门短评 -> 保存数据 -> 结束
函数接口设计如下:
1. 爬取网页内容函数
函数名:get_html()
作用:获取指定URL的网页内容
输入:url(字符串)
输出:html(字符串)
2. 解析网页内容函数
函数名:parse_html()
作用:解析网页内容,提取电影信息和热门短评的链接
输入:html(字符串)
输出:movie_links(列表),comment_links(列表)
3. 提取基本信息函数
函数名:extract_basic_info()
作用:从电影详情页提取电影的基本信息
输入:movie_link(字符串)
输出:basic_info(字典)
4. 提取热门短评函数
函数名:extract_comments()
作用:从热门短评页提取电影的热门短评
输入:comment_link(字符串)
输出:comments(列表)
5. 保存数据函数
函数名:save_data()
作用:将提取的电影信息和热门短评保存为Excel文件
输入:data(字典)
输出:无
6. 主函数
函数名:main()
作用:调用其他函数,实现完整的爬虫程序
输入:无
输出:无
以下是完整的爬虫程序代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_html(url):
response = requests.get(url)
return response.text
def parse_html(html):
soup = BeautifulSoup(html, 'html.parser')
movie_links = []
comment_links = []
items = soup.find_all('div', class_='item')
for item in items:
movie_link = item.find('div', class_='hd').a['href']
movie_links.append(movie_link)
comment_link = item.find('div', class_='bd').p.a['href']
comment_links.append(comment_link)
return movie_links, comment_links
def extract_basic_info(movie_link):
html = get_html(movie_link)
soup = BeautifulSoup(html, 'html.parser')
info = soup.find('div', id='info')
title = soup.find('span', property='v:itemreviewed').get_text()
rating = soup.find('strong', class_='rating_num').get_text()
directors = [director.get_text() for director in info.find_all('a', rel='v:directedBy')]
actors = [actor.get_text() for actor in info.find_all('a', rel='v:starring')]
release_date = info.find(property='v:initialReleaseDate').get_text().strip()
release_place = info.find('span', text='制片国家/地区:').next_sibling.strip()
genres = [genre.get_text() for genre in info.find_all('span', property='v:genre')]
basic_info = {
'片名': title,
'评分': rating,
'导演': '/'.join(directors),
'主演': '/'.join(actors),
'上映时间': release_date,
'上映地点': release_place,
'类型': '/'.join(genres)
}
return basic_info
def extract_comments(comment_link):
html = get_html(comment_link)
soup = BeautifulSoup(html, 'html.parser')
comments = []
items = soup.find_all('div', class_='comment-item')
for i, item in enumerate(items[:5]):
comment = item.find('p', class_='comment-content').get_text().strip()
comments.append(f'{i+1}.{comment}')
return comments
def save_data(data):
df = pd.DataFrame(data)
df.to_excel('豆瓣电影TOP250信息及评论.xlsx', index=False, encoding='utf-8-sig')
def main():
url = 'https://movie.douban.com/top250'
movie_links = []
comment_links = []
for i in range(10):
page_url = f'{url}?start={i*25}'
html = get_html(page_url)
links = parse_html(html)
movie_links.extend(links[0])
comment_links.extend(links[1])
data = []
for i in range(len(movie_links)):
basic_info = extract_basic_info(movie_links[i])
if i < 10:
comments = extract_comments(comment_links[i])
else:
comments = [extract_comments(comment_links[i])[0]]
data.append({
'排名': i + 1,
'海报': '',
'片名': f'=HYPERLINK("{movie_links[i]}", "{basic_info["片名"]}")',
'评分': basic_info['评分'],
'导演': basic_info['导演'],
'主演': basic_info['主演'],
'上映时间': basic_info['上映时间'],
'上映地点': basic_info['上映地点'],
'类型': basic_info['类型'],
'热门短评': '\n'.join(comments)
})
save_data(data)
if __name__ == '__main__':
main()
运行以上代码,即可实现自动爬取豆瓣电影TOP250排行榜的信息,并保存为Excel文件
原文地址: https://www.cveoy.top/t/topic/hLnA 著作权归作者所有。请勿转载和采集!