找回密码
 会员注册
查看: 13|回复: 0

利用python的三种不同方式爬取豆瓣电影TOP250排行榜的所有电影信息

[复制链接]

2万

主题

0

回帖

6万

积分

超级版主

积分
67465
发表于 2024-9-10 23:47:41 | 显示全部楼层 |阅读模式
一、利用《BeautifulSoup》方法,爬取《豆瓣电影》排行榜    以下代码是一个用于从豆瓣电影Top250页面抓取数据的Python脚本,使用了csv模块来写入CSV文件以及BeautifulSoup进行HTML解析。下面是带有注释的代码,解释了每个部分的功能。#导入必要的模块importcsvfrombs4importBeautifulSoupimportCh#自定义模块,提供网络请求和缓存目录获取功能#主函数,接受一个URL作为参数defmain(url):#使用Ch模块的get_web_request方法获取网页的HTML内容html=Ch.get_web_request(url)#创建BeautifulSoup对象,用于解析HTMLsoup=BeautifulSoup(html,'html.parser')#获取页面上的每个.item元素(代表每部电影)forelementinsoup.select('.item'):#获取排行榜的序号num=element.select_one('em').text#获取电影名称zw_name=element.select_one('span.title').text#获取电影详情链接urls=element.select_one('div.hda')['href']#获取评分star_rating=element.select('div.starspan')[1].text#获取评价人数,去除“人评价”文本star_num=element.select('div.starspan')[3].text.replace('人评价','')#获取剧情评语,如果不存在则为空字符串content=element.select_one('pspan.inq').textifelement.select_one('pspan.inq')isnotNoneelse''#将抓取的数据打包成元组tuples=(num,zw_name,urls,star_rating,star_num,content)#将元组写入CSV文件csv_writer.writerow(tuples)#打印当前处理的元组信息print(tuples)#如果直接运行此脚本,则执行以下代码if__name__=='__main__':#打开CSV文件,写模式,UTF-8编码,去除空行withopen(Ch.get_dir_cache_to('test.csv'),mode='w',encoding='utf-8',newline='')asf:#创建CSV写入器csv_writer=csv.writer(f)#写入表头csv_writer.writerow(['序号','电影名称','电影详情链接','评分','评价人数','剧情概况'])#循环抓取前10页的数据foriinrange(10):#调用main函数,传入当前页的URLmain(f'https://movie.douban.com/top250?start={i*25}&filter=')#打印完成提示print(f'第{i+1}页爬取完毕.')二、利用《XPath》方法,爬取《豆瓣电影》排行榜    这段代码使用了lxml库的etree模块来解析HTML文档,通过XPath选择器提取所需数据。同时,使用正则表达式来匹配和提取某些特定格式的信息。最后,将抓取到的信息保存到CSV文件中。#导入必要的模块importcsvimportrefromlxmlimportetreeimportCh#自定义的模块,提供网络请求和一些辅助功能#主函数,负责爬取豆瓣Top250电影的详细信息defmain(url):#发送GET请求并获取HTML页面内容html=Ch.get_web_get(url).text#解析HTML文档tree=etree.HTML(html)#获取电影详情页的链接列表href_list=tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')#获取电影名称列表name_list=tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')#遍历电影详情页链接和名称列表forhref_,name_inzip(href_list,name_list):#设置请求头中的Host字段Ch.params_headers['host']='movie.douban.com'#请求电影详情页html_=Ch.get_web_get(href_).text#解析详情页HTML文档tree_=etree.HTML(html_)#获取导演信息dir_=tree_.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]#使用正则表达式提取电影类型type_=re.findall(r'property="v:genre">(.*?)',html_)#将类型列表转换为字符串,各类型之间用斜杠分隔type_='/'.join(type_)#使用正则表达式提取制片国家country_=re.findall(r'地区.*?) '),str(item))[0]#提取电影封面图片链接info_02=re.findall(re.compile(r'(.*)'),str(item))#根据数量,设置中文名和外文名iflen(title)==2:info_03=title[0]#中文名info_04=title[1].replace('/','')#英文名,去除斜杠else:info_03=title[0]#中文名info_04=''#如果只有一个,英文名留空#提取评分info_05=re.findall(re.compile(r'(.*)'),str(item))[0]#提取评价人数info_06=re.findall(re.compile(r'(\d*)人评价'),str(item))[0]#提取剧情概况,可能不存在inq=re.findall(re.compile(r'(.*)'),str(item))iflen(inq)==0:info_07=''#如果没有概况,留空else:info_07=inq[0].replace('。','')#去除句点#提取更多信息,如导演、演员等,可能存在换行和斜杠bd=re.findall(re.compile(r' (.*?)',re.S),str(item))[0]#清理换行符和多余空格bd=re.sub(' (\s+)?','',bd)bd=re.sub('/','',bd)info_08=bd.strip()#去除首尾空格#将提取的信息打包成元组tuples=(info_01,info_02,info_03,info_04,info_05,info_06,info_07,info_08)#将元组写入CSV文件csv_writer.writerow(tuples)#打印当前处理的元组信息print(tuples)#如果直接运行这个脚本if__name__=='__main__':#打开CSV文件,写模式,UTF-8编码,无空行withopen(Ch.get_dir_cache_to('test.csv'),mode='w',encoding='utf-8',newline='')asf:#创建CSV写入器csv_writer=csv.writer(f)#写入表头csv_writer.writerow(['电影详情链接','图片链接','影片中文名','影片外国名','评分','评价人数','剧情概况','相关信息'])#循环爬取10页数据foriinrange(10):#调用main函数,传入当前页的URLmain(f'https://movie.douban.com/top250?start={i*25}&filter=')#打印完成提示print(f'第{i+1}页爬取完毕.')    请注意,Ch模块包含了处理网络请求和文件路径的自定义功能,它包含get_web_request()方法用于发送网络请求,并且get_dir_cache_to()方法用于返回缓存目录路径。我是一名python初学者,正探索美妙旅程的起点,希望高手指教,与友互进!-该文章仅供学习交流使用,不得用于商业目的或非法传播。若有侵权请联系作者进行删除。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-3 02:54 , Processed in 0.457554 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表