以下代码是一个简单的网络爬虫程序,用于从豆瓣电影 Top250 页面获取电影信息并保存到 CSV 文件中。以下是代码的一些主要步骤和功能:
-
导入模块:代码开始部分导入了
requests
和etree
模块用于网络请求和数据解析。 -
get_html(start)
函数:这个函数用于发起网络请求,获取豆瓣电影 Top250 页面中每页的电影数据。它通过 XPath 解析页面内容,提取电影的标题、链接、导演、评分、评分人数和概要等信息,并调用save_data()
函数保存到 CSV 文件中。 -
save_data()
函数:保存电影信息到 CSV 文件中。 -
程序入口
if __name__ == '__main__':
部分:在这里,程序会创建或清空一个名为“豆瓣TOP250.csv”的 CSV 文件并写入表头,“名称,网址,导演,评分,评分人数,概要”。然后,循环遍历 Top250 页面的不同部分,并调用get_html()
函数来获取数据并保存到 CSV 文件中。 -
数据清洗与处理:代码中还包含了一些数据清洗和处理的步骤,如读取 CSV 文件、处理缺失值、转换数据类型、处理异常值、数据去重和保存清洗后的数据到csv文件中。
# 导入模块 import requests # 网络请求模块 from lxml import etree # 数据解析模块# 发起网络请求 def get_html(start):print('正在爬取', start)url = f'https://movie.douban.com/top250?start={start}&filter='# 请求头信息,防止反爬虫操作headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36 Edg/125.0.0.0'}res = requests.get(url=url, headers=headers)print(res.status_code)html = etree.HTML(res.text)lis = html.xpath('//*[@id="content"]/div/div[1]/ol/li')# 解析数据(xpath解析)for li in lis:title = ''.join(li.xpath('./div/div[2]/div[1]/a/span[1]/text()')).replace('\n', '').replace(' ', '')src = ''.join(li.xpath('./div/div[2]/div[1]/a/@href')).replace('\n', '').replace(' ', '')dictor = ''.join(li.xpath('./div/div[2]/div[2]/p[1]/text()')).replace('\n', '').replace(' ', '')score = ''.join(li.xpath('./div/div[2]/div[2]/div/span[2]/text()')).replace('\n', '').replace(' ', '')comment = ''.join(li.xpath('./div/div[2]/div[2]/div/span[4]/text()')).replace('\n', '').replace(' ', '')summary = ''.join(li.xpath('./div/div[2]/div[2]/p[2]/span/text()')).replace('\n', '').replace(' ', '')# movies.append({# 'title':title,# 'src':src,# 'score':score,# 'comment':comment,# 'summary':summary,# })save_data(title, src, dictor, score, comment, summary)# print(title,src,dictor,score,comment,summary)def save_data(title, src, dictor, score, comment, summary):with open('./豆瓣TOP250.csv', 'a+', encoding='utf-8-sig') as f:movies_info = f'{title},{src},{dictor},{score},{comment},{summary}\n'f.write(movies_info)if __name__ == '__main__':with open('./豆瓣TOP250.csv', 'a+', encoding='utf-8-sig') as f:head = '名称,网址,导演,评分,评分人数,概要\n'f.write(head)for start in range(0, 250, 25):get_html(start)import pandas as pd # 读取数据 df = pd.read_csv('豆瓣TOP250.csv') # 查看数据信息 print(df.info()) # 处理缺失值 df.dropna(inplace=True) # 转换数据类型 df['评分'] = df['评分'].astype(float) # 处理异常值 df = df[df['评分'] >= 0 & df['评分'] <= 10] # 数据去重 df.drop_duplicates(inplace=True) # 保存清洗后的数据 df.to_csv('豆瓣TOP250.csv', index=False)