import requests from bs4 import BeautifulSoup from pandas import DataFrame headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55'} start_num = [i for i in range(0, 226, 25)] list_url_mv = [] # 所有电影的URL for start in start_num: url = 'https://movie.douban.com/top250?start={}&filter='.format(start) print('正在处理url:', url) response = requests.get(url=url, headers=headers) soup = BeautifulSoup(response.text, 'html.parser') url_mv_list = soup.select('#content > div > div.article > ol > li > div > div.info > div.hd > a') for index_url in range(len(url_mv_list)): url_mv = url_mv_list[index_url]['href'] list_url_mv.append(url_mv) # 对每部电影进行处理 def loading_mv(url, number): list_mv = [] print('-----正在处理第{}部电影-----'.format(number + 1)) list_mv.append(number + 1) # 排名 # 解析网页 response_mv = requests.get(url=url, headers=headers) soup_mv = BeautifulSoup(response_mv.text, 'html.parser') # 爬取电影名 mv_name = soup_mv.find_all('span', attrs={'property': 'v:itemreviewed'}) # 电影名 mv_name = mv_name[0].get_text() list_mv.append(mv_name) # print(mv_name) # 爬取电影的上映时间 mv_year = soup_mv.select('span.year') # 电影上映时间 mv_year = mv_year[0].get_text()[1:5] list_mv.append(mv_year) # print(mv_year) # 爬取导演信息 list_mv_director = [] # 导演 mv_director = soup_mv.find_all('a', attrs={'rel': "v:directedBy"}) for director in mv_director: list_mv_director.append(director.get_text()) string_director = '/'.join(list_mv_director) # 重新定义格式 list_mv.append(string_director) # print(list_mv_director) # 爬取主演信息 list_mv_star = [] # 主演 mv_star = soup_mv.find_all('span', attrs={'class': 'actor'}) if mv_star == []: # 在第210部时没有主演 list_mv.append(None) else: mv_star = mv_star[0].get_text().strip().split('/') mv_first_star = mv_star[0].split(':') list_mv_star.append(mv_first_star[-1].strip()) del mv_star[0] # 去除'主演'字段 for star in mv_star: list_mv_star.append(star.strip()) string = '/'.join(list_mv_star) # 重新定义格式 list_mv.append(string) # 爬取电影类型 list_mv_type = [] # 电影类型 mv_type = soup_mv.find_all('span', attrs={'property': 'v:genre'}) for type in mv_type: list_mv_type.append(type.get_text()) string_type = '/'.join(list_mv_type) list_mv.append(string_type) # print(list_mv_type) # 爬取电影评分 mv_score = soup_mv.select('strong.ll.rating_num') # 评分 mv_score = mv_score[0].get_text() list_mv.append(mv_score) # 爬取评价人数 mv_evaluation_num = soup_mv.select('a.rating_people') # 评价人数 mv_evaluation_num = mv_evaluation_num[0].get_text().strip() list_mv.append(mv_evaluation_num) # 爬取剧情简介 mv_plot = soup_mv.find_all('span', attrs={"class": "all hidden"}) # 剧情简介 if mv_plot == []: list_mv.append(None) else: string_plot = mv_plot[0].get_text().strip().split() new_string_plot = ' '.join(string_plot) list_mv.append(new_string_plot) # 加入电影网址 list_mv.append(url) return list_mv list_all_mv = [] dict_mv_info = {} for number in range(len(list_url_mv)): mv_info = loading_mv(list_url_mv[number], number) list_all_mv.append(mv_info) print('-----运行结束-----') pd = DataFrame(list_all_mv, columns=['电影排名', '电影名', '上映时间', '导演', '主演', '电影类型', '电影评分', '评价人数', '电影简介', '电影链接']) pd.to_excel(r'D:\school\大三下\数据标注\豆瓣电影Top.xlsx') # 数据处理 # 读取 Excel 文件 df = pd.read_excel('D:\school\大三下\数据标注\豆瓣电影Top.xlsx') # 对列进行操作 column_to_split = '电影类型' # 将字符串分割,并提取最后的值 df['Last_Value'] = df[column_to_split].str.split('/').str[-1] # 保存修改后的数据回原文件 df.to_excel('D:\school\大三下\数据标注\豆瓣电影Top.xlsx', index=False)
记得将我的文件路径换成你们自己的文件路径