哈喽,大家好,我是程序员晓晓。
想象一下,作为一名市场分析师,你需要迅速掌握电影行业的最新动态和用户评价,但手动搜集和整理这些信息既费时又低效。
或者作为一个HR专家,你希望了解不同类型电影的人气,以便策划相关的团队建设活动,但数据来源有限,获取困难。
作为一个电影爱好者,想要深入了解不同年代、不同国家的经典电影,却发现手动搜集信息耗时耗力。
这些都是在日常生活或职业工作中,不懂爬虫技术可能面临的实际问题。
今天,我们通过学习Python爬虫,来解决这些问题,轻松获取豆瓣电影Top250的宝贵数据,无论是用于职业分析还是个人兴趣,都将大有裨益。
解决思路
在开始编写代码之前,我们需要明确解决的问题和步骤。
首先,目标是提取豆瓣电影Top250的详细信息,包括电影名称、导演、年份、产地、类型、评分和评价人数。
其次,考虑到这些信息分散在不同的页面,我们需要逐页获取并解析数据。
最后,考虑到数据的可用性和后续处理,我们将数据整合到一个表格中,并导出为CSV文件。
-
获取页面:首先,我们使用requests库发送请求到豆瓣电影Top250的每个页面。考虑到豆瓣可能有反爬机制,需要模拟浏览器行为,这就需要设置合适的请求头。
-
解析数据:接下来,利用lxml库解析获得的页面内容。lxml能够处理HTML文档,从中提取我们需要的数据,例如电影标题、导演信息等。
-
提取信息:我们将使用re库来处理文本,提取如年份、国家、电影类型等信息。re库在处理复杂的文本模式匹配时非常有效。
-
数据整理:最后,使用pandas库将所有提取的数据整理成表格格式,并导出为CSV文件,方便后续的分析和共享。
代码示例
import requests
from lxml import etree
import re
import pandas as pd
# 定义一个函数,用于从字符串中提取导演的名字
def extract_director_name(s):
# 使用正则表达式匹配“导演:”后面的中文字符
match = re.search(r'导演:\s*([\u4e00-\u9fff]+(?:·[\u4e00-\u9fff]+)*)', s)
if match:
# 返回匹配的中文名字
return match.group(1)
else:
# 如果没有找到匹配项,返回None
return None
# 定义一个函数,用于提取电影的年份、产地和类型
def extract_movie_info(s):
# 提取年份
year_match = re.search(r'(\d{4})', s)
year = year_match.group(1) if year_match else None
# 提取产地,可能包含多个地名
country_match = re.search(r'/\s*([\u4e00-\u9fff\s]+)\s*/', s)
countries = ' '.join(country_match.group(1).split()) if country_match else '' # 输出空格相隔的字符串
# 提取电影类型,可能包含多个类型
genres_match = re.search(r'/\s*([\u4e00-\u9fff\s]+)\s*$', s)
genres = ' '.join(genres_match.group(1).split()) if genres_match else '' # 输出空格相隔的字符串
return year, countries, genres
# 定义一个函数,用于从字符串中提取数字
def extract_number(s):
# 使用正则表达式匹配字符串开始部分的数字
match = re.match(r'(\d+)', s)
return int(match.group(1)) if match else None
# 定义一个函数,用于获取单个页面上的电影信息
def get_movie_info(url):
response = requests.get(url = url, headers= headers)
response.encoding = 'utf-8'
page_text = response.text
# 解析 HTML 页面
tree = etree.HTML(page_text)
li_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li')
movie_list = []
for li in li_list:
# 提取电影信息
title = li.xpath('./div/div[2]/div[1]/a/span[1]/text()')[0]
director = extract_director_name(li.xpath('./div/div[2]/div[2]/p[1]/text()')[0])
info = li.xpath('./div/div[2]/div[2]/p[1]/text()')[1]
year, countries, genres = extract_movie_info(info)
rating = li.xpath('./div/div[2]/div[2]/div/span[2]/text()')[0]
num_reviews = extract_number(li.xpath('./div/div[2]/div[2]/div/span[4]/text()')[0])
# 打印信息并将其添加到列表中
print(title, director, year, countries, genres, rating, num_reviews, ':写入成功!')
movie_list.append([title, director, year, countries, genres, rating, num_reviews])
return movie_list
# 设置 HTTP 请求头部信息
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'
}
base_url = "https://movie.douban.com/top250"
all_movies = []
# 循环访问每个页面并提取电影信息
for i in range(10):
url = f"{base_url}?start={i*25}&filter="
all_movies.extend(get_movie_info(url))
# 将提取的信息保存到 DataFrame 中
df = pd.DataFrame(all_movies, columns=['电影名称', '导演', '上映年份', '产地', '电影类型', '评分', '评价人数'])
# 将 DataFrame 保存为 CSV 文件
df.to_csv('douban_top250.csv', index=False, encoding='utf_8_sig')
代码使用库介绍
-
requests:这个库用于发送网络请求,就像我们通过浏览器访问网页一样。非常简单易用,适合初学者。
-
lxml:一个强大的库,用于解析HTML和XML文档,帮助我们从复杂的网页结构中提取所需数据。
-
re(正则表达式):在文本中寻找特定模式的高效工具。即使是复杂的字符串模式,也能轻松应对。
-
pandas:一个数据分析的利器,使数据处理、清洗和分析变得简单。
探索与改进
-
性能优化:考虑使用多线程或异步请求,以更快地处理多个页面。
-
数据分析:使用提取的数据进行更深入的分析,如观众喜好趋势、电影类型分布等。
-
代码健壮性:加强异常处理和数据校验,确保稳定性和准确性。
结语
通过掌握Python爬虫技术,我们不仅能解决实际工作中遇到的数据获取难题,还可以拓宽个人知识领域,收获副业机会,从而实现职业成长和个人发展的双重提升。这是技术带给我们的力量~
今天的分享就到这里啦,喜欢今天的文章的话,别忘了点赞👍、收藏📚和分享📎哦!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
