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实现无证书加密解密实例
Oct 27 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
用Python实现一个简单的多线程TCP服务器的教程
May 05 Python
使用Python实现BT种子和磁力链接的相互转换
Nov 09 Python
详解Python函数可变参数定义及其参数传递方式
Aug 02 Python
教你利用Python玩转histogram直方图的五种方法
Jul 30 Python
Python 输出时去掉列表元组外面的方括号与圆括号的方法
Dec 24 Python
使用python3实现操作串口详解
Jan 01 Python
详解python的四种内置数据结构
Mar 19 Python
python+OpenCV实现图像拼接
Mar 05 Python
Python常用类型转换实现代码实例
Jul 28 Python
python代数式括号有效性检验示例代码
Oct 04 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中判断字符串是否全是中文或含有中文的实现代码
2011/09/16 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
php实现的SESSION类
2014/12/02 PHP
Yii2框架引用bootstrap中日期插件yii2-date-picker的方法
2016/01/09 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
js获取单元格自定义属性值的代码(IE/Firefox)
2010/04/05 Javascript
juqery 学习之三 选择器 子元素与表单
2010/11/25 Javascript
jQuery powerFloat万能浮动层下拉层插件使用介绍
2010/12/27 Javascript
js Array对象的扩展函数代码
2013/04/24 Javascript
javascript:void(0)使用探讨
2013/08/27 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
JS实现从网页顶部掉下弹出层效果的方法
2015/08/06 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
js贪吃蛇游戏实现思路和源码
2016/04/14 Javascript
使用PBFunc在Powerbuilder中支付宝当面付款功能
2016/10/01 Javascript
nodejs连接mongodb数据库实现增删改查
2016/12/01 NodeJs
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
Javascript 之封装(Package)
2018/09/14 Javascript
利用JS判断元素是否为数组的方法示例
2021/01/08 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
Python中index()和seek()的用法(详解)
2017/04/27 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
pycharm远程连接vagrant虚拟机中mariadb数据库
2020/06/05 Python
以太网Ethernet IEEE802.3
2013/08/05 面试题
小学生自我评价范文
2014/01/25 职场文书
高中历史教学反思
2014/02/08 职场文书
2014年最新学校运动会广播稿
2014/09/17 职场文书
党员教师学习党的群众路线教育实践活动心得体会
2014/10/31 职场文书
商务代表岗位职责
2015/02/15 职场文书
世界气象日活动总结
2015/02/27 职场文书
正规欠条模板
2015/07/03 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
python numpy中setdiff1d的用法说明
2021/04/22 Python
Docker安装MySql8并远程访问的实现
2022/07/07 Servers