以下代码是一个简单的网络爬虫程序,用于从豆瓣电影 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)