Python爬虫入门教程01之爬取豆瓣Top电影


Posted in Python onJanuary 24, 2021

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

基本开发环境

  •  Python 3.6
  • Pycharm

相关模块的使用

  •  requests
  • parsel
  • csv

安装Python并添加到环境变量,pip安装需要的相关模块即可。

爬虫基本思路

Python爬虫入门教程01之爬取豆瓣Top电影

一、明确需求

爬取豆瓣Top250排行电影信息

  • 电影名字
  • 导演、主演
  • 年份、国家、类型
  • 评分、评价人数
  • 电影简介

Python爬虫入门教程01之爬取豆瓣Top电影 

二、发送请求

Python中的大量开源的模块使得编码变的特别简单,我们写爬虫第一个要了解的模块就是requests。

Python爬虫入门教程01之爬取豆瓣Top电影
Python爬虫入门教程01之爬取豆瓣Top电影

请求url地址,使用get请求,添加headers请求头,模拟浏览器请求,网页会给你返回response对象

# 模拟浏览器发送请求
import requests
url = 'https://movie.douban.com/top250'
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
print(response)

Python爬虫入门教程01之爬取豆瓣Top电影

200是状态码,表示请求成功

2xx (成功)
3xx (重定向)
4xx(请求错误)
5xx(服务器错误)

常见状态码

  • 200 - 服务器成功返回网页,客户端请求已成功。
  • 302 - 对象临时移动。服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 304 - 属于重定向。自上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
  • 401 - 未授权。请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
  • 404 - 未找到。服务器找不到请求的网页。
  • 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。

通常,这只是暂时状态。

 三、获取数据

import requests
url = 'https://movie.douban.com/top250'
headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
}
response = requests.get(url=url, headers=headers)
print(response.text)

Python爬虫入门教程01之爬取豆瓣Top电影

requests.get(url=url, headers=headers) 请求网页返回的是response对象

response.text: 获取网页文本数据

response.json: 获取网页json数据

这两个是用的最多的,当然还有其他的

apparent_encoding cookies  	history
iter_lines  ok						close   
elapsed  is_permanent_redirect 	json   
raise_for_status	 connection  	encoding  
is_redirect  links   	raw   
content  headers  	iter_content  
next   reason					url

四、解析数据

常用解析数据方法: 正则表达式、css选择器、xpath、lxml…

常用解析模块:bs4、parsel…

我们使用的是 parsel 无论是在之前的文章,还是说之后的爬虫系列文章,我都会使用 parsel 这个解析库,无它就是觉得它比bs4香。

parsel 是第三方模块,pip install parsel 安装即可

parsel 可以使用 css、xpath、re解析方法

Python爬虫入门教程01之爬取豆瓣Top电影

所有的电影信息都包含在 li 标签当中。

# 把 response.text 文本数据转换成 selector 对象
selector = parsel.Selector(response.text)
# 获取所有li标签
lis = selector.css('.grid_view li')
# 遍历出每个li标签内容
for li in lis:
 # 获取电影标题 hd 类属性 下面的 a 标签下面的 第一个span标签里面的文本数据 get()输出形式是 字符串获取一个 getall() 输出形式是列表获取所有
 title = li.css('.hd a span:nth-child(1)::text').get() # get()输出形式是 字符串
 movie_list = li.css('.bd p:nth-child(1)::text').getall() # getall() 输出形式是列表
 star = movie_list[0].strip().replace('\xa0\xa0\xa0', '').replace('/...', '')
 movie_info = movie_list[1].strip().split('\xa0/\xa0') # ['1994', '美国', '犯罪 剧情']
 movie_time = movie_info[0] # 电影上映时间
 movie_country = movie_info[1] # 哪个国家的电影
 movie_type = movie_info[2] # 什么类型的电影
 rating_num = li.css('.rating_num::text').get() # 电影评分
 people = li.css('.star span:nth-child(4)::text').get() # 评价人数
 summary = li.css('.inq::text').get() # 一句话概述
 dit = {
 '电影名字': title,
 '参演人员': star,
 '上映时间': movie_time,
 '拍摄国家': movie_country,
 '电影类型': movie_type,
 '电影评分': rating_num,
 '评价人数': people,
 '电影概述': summary,
 }
 # pprint 格式化输出模块
 pprint.pprint(dit)

Python爬虫入门教程01之爬取豆瓣Top电影

以上的知识点使用到了

  • parsel 解析模块的方法
  • for 循环
  • css 选择器
  • 字典的创建
  • 列表取值
  • 字符串的方法:分割、替换等
  • pprint 格式化输出模块

所以扎实基础是很有必要的。不然你连代码都不知道为什么要这样写。

五、保存数据(数据持久化)

常用的保存数据方法 with open

像豆瓣电影信息这样的数据,保存到Excel表格里面会更好。

所以需要使用到 csv 模块

# csv模块保存数据到Excel
f = open('豆瓣电影数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['电影名字', '参演人员', '上映时间', '拍摄国家', '电影类型',
      '电影评分', '评价人数', '电影概述'])

csv_writer.writeheader() # 写入表头

Python爬虫入门教程01之爬取豆瓣Top电影
Python爬虫入门教程01之爬取豆瓣Top电影

这就是爬取了数据保存到本地了。这只是一页的数据,爬取数据肯定不只是爬取一页数据。想要实现多页数据爬取,就要分析网页数据的url地址变化规律。

Python爬虫入门教程01之爬取豆瓣Top电影

可以清楚看到每页url地址是 25 递增的,使用for循环实现翻页操作

for page in range(0, 251, 25):
 url = f'https://movie.douban.com/top250?start={page}&filter='

完整实现代码

""""""
import pprint
import requests
import parsel
import csv
'''
1、明确需求:
 爬取豆瓣Top250排行电影信息
 电影名字
 导演、主演
 年份、国家、类型
 评分、评价人数
 电影简介
'''
# csv模块保存数据到Excel
f = open('豆瓣电影数据.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['电影名字', '参演人员', '上映时间', '拍摄国家', '电影类型',
      '电影评分', '评价人数', '电影概述'])

csv_writer.writeheader() # 写入表头

# 模拟浏览器发送请求
for page in range(0, 251, 25):
 url = f'https://movie.douban.com/top250?start={page}&filter='
 headers = {
 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
 }
 response = requests.get(url=url, headers=headers)
 # 把 response.text 文本数据转换成 selector 对象
 selector = parsel.Selector(response.text)
 # 获取所有li标签
 lis = selector.css('.grid_view li')
 # 遍历出每个li标签内容
 for li in lis:
 # 获取电影标题 hd 类属性 下面的 a 标签下面的 第一个span标签里面的文本数据 get()输出形式是 字符串获取一个 getall() 输出形式是列表获取所有
 title = li.css('.hd a span:nth-child(1)::text').get() # get()输出形式是 字符串
 movie_list = li.css('.bd p:nth-child(1)::text').getall() # getall() 输出形式是列表
 star = movie_list[0].strip().replace('\xa0\xa0\xa0', '').replace('/...', '')
 movie_info = movie_list[1].strip().split('\xa0/\xa0') # ['1994', '美国', '犯罪 剧情']
 movie_time = movie_info[0] # 电影上映时间
 movie_country = movie_info[1] # 哪个国家的电影
 movie_type = movie_info[2] # 什么类型的电影
 rating_num = li.css('.rating_num::text').get() # 电影评分
 people = li.css('.star span:nth-child(4)::text').get() # 评价人数
 summary = li.css('.inq::text').get() # 一句话概述
 dit = {
  '电影名字': title,
  '参演人员': star,
  '上映时间': movie_time,
  '拍摄国家': movie_country,
  '电影类型': movie_type,
  '电影评分': rating_num,
  '评价人数': people,
  '电影概述': summary,
 }
 pprint.pprint(dit)
 csv_writer.writerow(dit)

实现效果

Python爬虫入门教程01之爬取豆瓣Top电影
Python爬虫入门教程01之爬取豆瓣Top电影

到此这篇关于Python爬虫入门教程01之爬取豆瓣Top电影的文章就介绍到这了,更多相关Python爬取豆瓣Top电影内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python开发编码规范
Sep 08 Python
Python中的迭代器漫谈
Feb 03 Python
Python类属性的延迟计算
Oct 22 Python
Python读取word文本操作详解
Jan 22 Python
浅谈python requests 的put, post 请求参数的问题
Jan 02 Python
numpy.where() 用法详解
May 27 Python
Django之创建引擎索引报错及解决详解
Jul 17 Python
python遍历文件目录、批量处理同类文件
Aug 31 Python
python实现的发邮件功能示例
Sep 11 Python
python脚本后台执行方式
Dec 21 Python
python中threading开启关闭线程操作
May 02 Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 Python
详解python的变量缓存机制
Jan 24 #Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 #Python
利用Python函数实现一个万历表完整示例
Jan 23 #Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 #Python
如何使用Python进行PDF图片识别OCR
Jan 22 #Python
详解pandas映射与数据转换
Jan 22 #Python
python实现简单的井字棋游戏(gui界面)
Jan 22 #Python
You might like
php读取二进制流(C语言结构体struct数据文件)的深入解析
2013/06/13 PHP
领悟php接口中interface存在的意义
2013/06/27 PHP
windows下配置apache+php+mysql时出现问题的处理方法
2014/06/20 PHP
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
js+jquery常用知识点汇总
2015/03/03 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
微信小程序 生命周期和页面的生命周期详细介绍
2017/01/19 Javascript
bootstrap table动态加载数据示例代码
2017/03/25 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
vue loadmore组件上拉加载更多功能示例代码
2017/07/19 Javascript
layui table设置前台过滤转义等方法
2018/08/17 Javascript
js实现每日签到功能
2018/11/29 Javascript
JavaScript创建对象的四种常用模式实例分析
2019/01/11 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
vue中使用vue-cli接入融云实现即时通信
2019/04/19 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[42:06]2019国际邀请赛全明星赛 8.23
2019/09/05 DOTA
Python入门_浅谈for循环、while循环
2017/05/16 Python
Python中矩阵库Numpy基本操作详解
2017/11/21 Python
Python subprocess模块常见用法分析
2018/06/12 Python
python re库的正则表达式入门学习教程
2019/03/08 Python
Python 没有main函数的原因
2020/07/10 Python
python 实现图片修复(可用于去水印)
2020/11/19 Python
一套VC试题
2015/01/23 面试题
.NET面试问题集
2015/12/08 面试题
写自荐信有哪些不宜?
2013/10/17 职场文书
教育学专业毕业生的自我评价
2013/11/21 职场文书
人事文员岗位职责
2014/02/16 职场文书
优秀本科毕业生自荐信
2014/07/04 职场文书
道歉信范文
2015/05/12 职场文书
入党积极分子考察意见
2015/06/02 职场文书
小爸爸观后感
2015/06/15 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
在CSS中使用when/else的方法
2022/01/18 HTML / CSS