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

tech2022-09-03  92

文章目录

前言1. requests(1)get()方法(2)Response对象四大常用属性 2.BeautifulSoup初步使用(1)通过BeautifulSoup来解析文本,格式如:(2)通过BeautifulSoup中提取数据的两大知识点 一、先爬取网页第一个影片信息2.代码如下:3.最终结果: 二、爬取所有影片信息1.代码2.查看文件内容 总结


前言

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

最新回复(0)