import requests
import time
from bs4 import BeautifulSoup
import pandas as pd
def get_film(link, headers):
# 定义一个get_film的函数,接受两个参数:link和headers。link是电影信息的URL,headers是一个字典,包含了发送HTTP请求时需要使用的HTTP头信息
res = requests.get(link, headers=headers)
# 使用requests.get()方法发送一个GET请求到给定的链接,并传入之前定义的headers参数。请求的结果被存储在变量res中。
soup = BeautifulSoup(res.text, 'html.parser')
# 使用BeautifulSoup库来解析从上一步获取的HTML内容。它把HTML内容(存储在res.text中)作为第一个参数,并指定使用'html.parser'作为解析器。
# 解析后的HTML页面被存储在变量soup中。
movies = []
# 初始化一个空列表,用于存储从HTML页面中提取的电影信息。
items = soup.select('div.item')
for item in items:
# 这一行开始一个循环,遍历在步骤5中找到的所有元素。
movie_info = {}
# 在循环内部,创建一个空字典,用于存储当前电影的信息。
title_element = item.find('span', class_='title')
if title_element:
full_title = title_element.get_text(strip=True)
titles = full_title.split('/')
movie_info['Chinese_name'] = titles[0].strip()
if len(titles) > 1:
# 检查列表的长度是否大于1,即是否存在多个名称。
movie_info['Foreign_name'] = titles[1].strip()
else:
movie_info['Foreign_name'] = ''
else:
movie_info['Chinese_name'] = ''
movie_info['Foreign_name'] = ''
img_tag = item.find('img')
movie_info['Image_link'] = requests.compat.urljoin(link, img_tag['src']) if img_tag else ""
# 从当前item元素中提取图片的链接,并将其存储在字典movie_info的键“Image_link”下
rating_num = item.find('span', class_='rating_num').get_text(strip=True) if item.find('span',
class_='rating_num') else ""
# 从HTML页面中的特定元素中提取电影的评分数字。如果该元素中没有评分数字,则返回空字符串。
movie_info['Rating'] = rating_num
reviews_count = item.find('div', class_='star').find_all('span')[-1]
movie_info['Reviews'] = reviews_count.get_text(strip=True).replace('人评价', '') if reviews_count else ""
# 从HTML页面中的特定元素中提取电影的评论数量。如果该元素中没有评论数量,则返回空字符串。
summary = item.find('p').get_text(strip=True) if item.find('p') else ""
movie_info['Summary'] = summary
# 从HTML页面中的特定元素中提取电影的摘要,并将摘要存储在字典中。如果该元素中没有摘要,则对应的值将为空字符串。
movies.append(movie_info)
return movies
def save_movies_to_excel(movies, path='test01.xlsx'):
df = pd.DataFrame(movies)
df.to_excel(path, index=False)
# 将一个给定的数据结构(可能是电影信息的列表或字典)转换为pandas DataFrame,并将其保存到一个Excel文件中。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/96.0.4664.45 Safari/537.36 '
}
all_movies = []
# 配置了一个HTTP请求头(模仿了一个特定的浏览器),并创建了一个空的列表
base_url = 'https://movie.douban.com/top250?start={}&filter='
links = [base_url.format(i * 25) for i in range(10)]
# links列表中每个元素都是一个字符串,表示一个完整的url
for link in links:
all_movies.extend(get_film(link, headers))
time.sleep(1)
# 从links列表中的每个URL获取电影数据,并将这些数据添加到all_movies列表中。在每次循环迭代之间,程序会暂停1秒以避免发送过于频繁的请求。
save_movies_to_excel(all_movies)