一、 python爬虫初探(使用BeautifulSoup爬取豆瓣电影排行榜)


前言

学习爬虫的第一次实践,在这里记录下
以 https://movie.douban.com/chart 网页数据为例


1. requests

(1)get()方法
使用requests的get方法像服务器发送请求并得到一个Response对象
	eg:res = requests.get("https://movie.douban.com/chart")  res的类型为:<class 'requests.models.Response'>
(2)Response对象四大常用属性
1、response.status_code	查看请求后的状态码
2、response.content		可得到response对象的二进制数据
3、response.text		可得到response对象的字符串数据
4、response.encoding	可转换response对象的编码方式

2.BeautifulSoup初步使用

(1)通过BeautifulSoup来解析文本,格式如:
bs对象 = BeautifulSoup(要解析的文本,解析器)
eg:datas = BeautifulSoup(res_text,'html.parser')
(2)通过BeautifulSoup中提取数据的两大知识点
一、	find()、find_all()方法
	find_all()可以提取出 所有的 符合条件的数据,返回的是一个bs4.element.ResultSet对象
	ResultSet类继承自list , ResultSet中的一个数据就是一个Tag对象
	用法:	BeautifulSoup对象.find_all(标签,属性)
	
	find()可以提取出 第一条 符合条件的数据,返回的是一个bs4.element.Tag对象,
	find()方法底层就是调用了find_all()方法,然后取第一条数据返回
	用法:	BeautifulSoup对象.find(标签,属性)
	
	eg:movie = datas.find('div', class_='pl2')		(取出第一个数据)
			movie = datas.find_all('div', class_='pl2')	(取出所有数据)



二、	Tag对象
	Tag对象是通过BeautifulSoup对于网页数据提取后得到的,其三个常用的属性和方法对为:
	1、 Tag.find()与Tag,find_all()   用法与上面的find()与find_all()相同(使用Tag.find()方法得到的对象类型还是Tag)
	
	2、Tag.text	可以提取出Tag中的文字
		eg:movie.find('p', class_='pl').text	(可获取到class=pl 的p标签下的文字内容,即去掉所有标签及其属性)
		
	3、Tag['属性名']	可以提取Tag中属性的值
		eg: movie_a['href']  (就可得到a标签中 href属性对应的链接地址)

一、先爬取网页第一个影片信息

爬取内容:
在这里插入图片描述

2.代码如下:

初次尝试,所以这里的代码比较繁琐、不够简洁,旨在理清各个环节

import  requests
from bs4 import  BeautifulSoup

# 爬取地址
url = "https://movie.douban.com/chart"

# 访问头,模拟浏览器
header={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

# 得到原始网页数据
res = requests.get(url,headers=header)

# 将Response得到的数据转换为text文本 (转换为'str'类型)
res_text = res.text

# 用html.parser 解析器来解析文本
datas = BeautifulSoup(res_text,'html.parser')

# 查找第一个最小父级标签
#  movie的类型为<class 'bs4.element.Tag'>  Tag类继承自PageElement ,而PageElement继承自Object
movie = datas.find('div', class_='pl2')

# 找到父级标签中的<a>标签信息
movie_a = movie.find('a')

"""
print(movie_a) 可以看到:
	<a class="" href="https://movie.douban.com/subject/30299515/">
                        釜山行2:半岛
                        / <span style="font-size:13px;">釜山行2 / 半岛</span>
	</a>
————————————可以看到以上数据仍然不够纯粹,还要进一步提纯
"""

# text获取标签中的内容,再使用replace方法去掉多余的空格及换行符 (Tag类中的text=property(get_text) 使用property方法来清洗标签)
#  print(name) 得到结果   釜山行2:半岛/釜山行2/半岛
movie_name = movie_a.text.replace(' ', '').replace('\n', '')

# 获取<a>中电影的url地址信息
movie_url = movie_a['href']

# 根据网页信息获取基本信息(上映时间,演员表,时长等等),并清洗数据
movie_info = movie.find('p', class_='pl').text

# 根据网页信息获取电影星级、评价数,并清洗数据
tag1_evaluate = movie.find('div', class_= 'star clearfix')
movie_evaluate = tag1_evaluate.text.replace(' ', '').replace('\n', '')

# 打印影片信息
print(movie_name)
print(movie_url)
print(movie_info)
print(movie_evaluate)

3.最终结果:

在这里插入图片描述


二、爬取所有影片信息

在第一步的基础上进行了优化,把网页中的目标数据全爬下来并保存到本地

(这里就直接上代码了)

1.代码

import  requests
from bs4 import  BeautifulSoup

# 爬取地址
url = "https://movie.douban.com/chart"

# 访问头文件,模拟浏览器
headers={'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}

# 得到原始网页数据
res = requests.get(url,headers=headers)

# 用html.parser解析器 来解析文本
datas = BeautifulSoup(res.text,'html.parser')

# 查找所有最小父级标签
#  list_movies的类型为<class 'bs4.element.ResultSet'>  ResultSet类继承自list  所以list_moves是所有为:<div class='pl2'>的标签的数据
list_movies = datas.find_all('div',class_='pl2')

lists = []
for movie in list_movies:
    # 获取name,url,info,evaluate
    movie_name = movie.find('a').text.replace(' ','').replace('\n','')
    movie_url = movie.find('a')['href']
    movie_info = movie.find('p',class_='pl').text
    movie_evaluate = movie.find('div',class_='star clearfix').text.replace(' ','').replace('\n','')

    # 将数据放入lists
    lists.append([movie_name,movie_url,movie_info,movie_evaluate])

with open(r'movie.txt','w+',encoding='utf-8') as file:
    for i in lists:
        file.write(str(i)+'\n')

2.查看文件内容

成功爬下想要的数据
在这里插入图片描述

总结

整个爬取过程:

获取数据
	 1.通过url发起请求
解析数据
	 2.服务器返回的数据放入一个Response对象中
	 3.将数据转换为字符串
筛选数据
	 4.通过BeautifulSoup把字符串解析为BeautifulSoup对象
	 5.有两种情况:
		(1)使用find()方法得到Tag对象
		(2)使用find_all()方法得到ResultSet对象,实际上就是list/dict

python还是非常有趣并且有用的,就拿爬虫来说,如果用得好,那么在平时的生活工作中就是一大助力;当然它也是一柄双利剑,爬取数据要遵守相应的规则,知道哪些是不能爬的,不然也可能给自己带来麻烦。
其次就是通过这次的记录,让原本对于BeautifulSoup模糊的认识更加清晰。学习知识要知其然,也应该知其所以然,这条路还有很长要走。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值