|
一、利用《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初学者,正探索美妙旅程的起点,希望高手指教,与友互进!-该文章仅供学习交流使用,不得用于商业目的或非法传播。若有侵权请联系作者进行删除。
|
|