文章目录
前言
学习爬虫的第一次实践,在这里记录下
以 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模糊的认识更加清晰。学习知识要知其然,也应该知其所以然,这条路还有很长要走。