豆瓣热映电影影评爬取
第一部分:首先对网页进行分析
详见:https://movie.douban.com,选择全部正在热映
然后点击切换城市
北京:https://movie.douban.com/cinema/nowplaying/beijing/
上海:https://movie.douban.com/cinema/nowplaying/shanghai/
广州:https://movie.douban.com/cinema/nowplaying/guangzhou/
通过对北京,上海,广东的url解析发现,变化的之后地点名称,于是可以通过for循环构造url,并通过request获取响应内容,为了防止反爬,还需要构造请求头信息
请求头获取方法:
chrom浏览器网页右击检查
构造url并获取响应内容
# 请求头
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
'Cookie': 'SUB=_2AkMSGWslf8NxqwFRmfoUzWLhbYt2wwDEieKkRZr-JRMxHRl-yT8XqmUFtRB6OZlFys4qvlKx3Tvb2etnSP7fIwH3xZrs; SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9WF4C88xAdkTOamY1VEDYLcD; XSRF-TOKEN=UWgjjU1gpBd6U_RyNd9Xj5tl; WBPSESS=V0zdZ7jH8_6F0CA8c_ussf0MMoeKVtPabByLGblUomw7z-ZSmpLzjmq_g5HzCnAVut_Q_s9RcaOG-5n78dfP6Uf4mudJLC-Tvq1Ou_UBUQHR8A7ThRBx-FfG9gqPrdYW'
}
# 构造url并获取响应内容
city_list = ['beijing', 'shanghai', 'guangzhou']
for city in city_list:
url = f'https://movie.douban.com/cinema/nowplaying/{city}/'
res = requests.get(
url=url,
headers=header,
).text
响应内容
然后对响应内容进行分析
对响应内容进行分析并通过lxmx转换为对象
data = etree.HTML(res)
print(data)
然后在网页中大致找到存放每一个电影的标签并获取xpath路径
通过循环这一标签获得每一个电影的信息,然后再解析每一个电影的 [‘电影中文名’, ‘电影详情页链接’, ‘导演’, ‘演员’, ‘上映年份’, ‘评分’]并放在全局列表中
最后将数据写入csv文件
# 定义空列表存放电影数据
tiltes_cn = [] # 中文标题
links = [] # 详情页链接
director = [] # 导演
actors = [] # 演员
years = [] # 上映年份
scores = [] # 评分
fp = open('./data/douban_hot.csv', 'w', encoding='utf-8')
writer = csv.writer(fp)
writer.writerow(
['电影中文名', '电影详情页链接', '导演', '演员', '上映年份', '评分'])
for 循环逻辑
writer.writerow([title1, movie_detail_url, director_one, actor, release_year, score])
fp.close() # 写入完成后,关闭文件
完整代码见文末百度网盘
第二部分:处理详情页url并获取评论信息
第一步,将存储的csv文件通过pandas读取并做一个电影名称,详情页url和分数的映射
接着我们分析网页,看看评论放在详情页的哪个部分
通过分析发现,详情页的url和评论的url存在的差别
详情页:https://movie.douban.com/subject/26925611/?from=playing_poster
评论第一页:https://movie.douban.com/subject/26925611/comments?start=0&limit=20&status=P&sort=new_score
评论第二页:https://movie.douban.com/subject/26925611/comments?start=20&limit=20&status=P&sort=new_score
发现评论页比详情页少了 ‘?from=playing_poster’ 多了 comments?start=0&limit=20&status=P&sort=new_score,评论页中的start代表了开始的条数,limit代表了一页显示多少条,于是我们可以拼接url
parsel
是一个用于从 XML 和 HTML 格式中提取数据的 Python 库。它提供了一种方法,可以使用 CSS 或 XPath 表达式选择 XML 或 HTML 文本的部分内容并从中提取数据。
当您创建一个 Selector
对象时,您基本上是将一个 HTML 或 XML 的字符串传递给它。然后,Selector
对象允许您运行 .xpath()
或 .css()
方法来在该 HTML/XML 文本中导航和搜索元素,并从中提取数据。
随后,用requests.get请求网页内容并传入parsel,之后通过css选择器先找到评论大致位置,再通过for循环将每条评论都取出来。
最后将数据保存为dataframe格式,并写入csv文件
完整源代码(含数据集)
链接:https://pan.baidu.com/s/10nRcBogGYBFkaivly5o6bw?pwd=spbd
提取码:spbd
–来自百度网盘超级会员V3的分享
开源代码
加微信 AI_xiaoao
回复题目【基于XXXX的XXXX系统设计】获取源代码
所有代码均可远程部署安装+代码调试及讲解
更多爬虫代码