python-爬虫学习3:BeautifulSoup 库解析提取数据

第一篇讲到爬虫的四个步骤:获取数据   解析数据   提取数据   存储数据

第二篇有讲到利用requests 库去获取数据;

这篇主要是讲利用BeautifulSoup 库解析提取数据

一、解析数据和提取数据

 

  • 解析数据

    平常使用浏览器上网,浏览器会把服务器返回的HTML源代码翻译成我们看得懂的样子,然后我们才能在网页上继续操作,所以爬虫的时候,也要使用能读懂html 的工具,才能拿到想要的数据。这个过程就叫解析数据 

  • 提取数据

    提取数据就是把需要的数据从一大堆的数据里挑出来我们想要的。这个过程叫做提取数据。

二、BeautifulSoup 库解析数据

1.BeautifulSoup 库安装

  • winds: pip install BeautifulSoup4
  • mac: pip3 install BeautifulSoup4

2.BeautifulSoup 用法

  bs 对象 = BeautifulSoup(要解析的文本,‘解析器’)

!!!要注意的点:要解析的文本必须是字符串;解析器的话这里列举一个‘html.parser’,用这个是因为这个解析器相对简单一点,容易上手,还有其他解析器,后续会补充进来。

3.代码实操

实例链接:https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html

取这个网址的书籍类型,书名,链接和书籍介绍

import requests
from bs4 import BeautifulSoup #导入bs4 库
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
print(res.status_code)  #输出请求的响应状态码
html =res.text # 把res内容转化为字符串形式输出
soup = BeautifulSoup(res.text,'html.parser') #把网页解析为BeautifulSoup 对象
print(type(soup)) 
print(soup)

其中导入bs4 库和解析BeautifulSoup 对象这两行是新加的代码。

运行输出soup的数据类型<class 'bs4.BeautifulSoup'>,这个可以手敲代码然后运行在终端看一下,说明soup 是一个BeautifulSoup对象。

最后一行打印出来的soup 就是我们请求的网页的源代码。源代码里包含书名,链接,书籍内容等数据。

4.BeautifulSoup用法

from bs4 import BeautifulSoup

soup = BeautifulSoup(字符串,‘html.parser’)

解析数据整体就是这么个过程,接着看提取数据

 三、提取数据

提取数据的话主要涉及到两大部分:find()与find_all(),以及Tag对象

 

 

  •  find() 和find_all() 
  • 都可以匹配html 的标签和属性,把BeautifulSoup 对象里符合要求的数据都提取数来

find(): 只提取首个满足要求的数据

find_all(): 提取所有满足要求的数据

!!!注意:示例中的class_,是包含下划线的,为了和python 语法里类 class 区分开;除了可以用class 属性去匹配外,还可以用其他属性;标签和属性可以任选其一,也可以两个搭配一起使用。 

实例:https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html

find() 练习:

import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find('div') #使用find()方法提取首个<div>元素
print(item) #打印item 
print(type(item)) #打印item 数据类型

终端输出:

 

 这里item 的数据类型<class 'bs4.element.Tag'>,说明这是一个Tag 类对象

find_all() 练习:

import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find_all('div') #使用find_all()方法提取所有<div>元素
print(item) #打印item
print(type(item)) #打印item 数据类型

终端运行:

 

 item 的数据类型显示为<class 'bs4.element.ResultSet'>,是一个ResultSet 类的对象。其中Tag 对象以列表的结构储存起来,可以当做列表使用

四、代码实操

url:https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html

目标:爬取网页中的三本书的书名,链接,书籍介绍。

 

 首先,右键单击打开开发者选项(F12),然后观察代码结构,三本书分别在三个class = 'books'里,这里要提取三本书的全部信息的话,首选find_all()

import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html'
res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find_all('div',class_ = 'books') #使用find_all()方法提取所有<div>元素
print(item) #打印item

这里提取出来的是个列表格式的数据,包含了三本书的所有信息,为了提取单本书的信息,我们可以用for 循环进行遍历列表,进行数据提取

import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html'
res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find_all('div',class_ = 'books') #使用find_all()方法提取所有<div>元素
for i in item:
    print('所有要的数据:',i)

这时候打印出来的是一个个包含html 标签的数据。

要进一步进行数据提取操作,就需要用到Tag 对象。

 

 对于刚刚遍历之后打印出来带有html 标签的数据(Tag 对象--可以通过print(type(i))查看输出的类型),取中间的一个Tag 对象

 <div class="books">
<h2><a name="type3">技术参考</a></h2>
<a class="title" href="https://book.douban.com/subject/25779298/">《利用Python进行数据分析》</a>
<p class="info">本书含有大量的实践案例,你将学会如何利用各种Python库(包括NumPy、pandas、matplotlib以及IPython等)高效地解决各式各样的数据分析问题。由于作者Wes McKinney是pandas库的主要作者,所以本书也可以作为利用Python实现数据密集型应用的科学计算实践指南。本书适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。</p>
<img class="img" src="./spider-men5.0_files/s27275372.jpg"/>
<br/>
<br/>
<hr size="1"/>
</div>

书籍类型:<h2><a name="type3">技术参考</a></h2>

链接和书名:<a class="title" href="https://book.douban.com/subject/25779298/">《利用Python进行数据分析》</a>

简介:<p class="info">本书含有大量的实践案例,你将学会如何利用各种Python库(包括NumPy、pandas、matplotlib以及IPython等)高效地解决各式各样的数据分析问题。由于作者Wes McKinney是pandas库的主要作者,所以本书也可以作为利用Python实现数据密集型应用的科学计算实践指南。本书适合刚刚接触Python的分析人员以及刚刚接触科学计算的Python程序员。</p>

import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html'
res = requests.get(url)
soup = BeautifulSoup(res.text,'html.parser')
item = soup.find_all('div',class_ = 'books') #使用find_all()方法提取所有<div>元素
for i in item:
type = i.find('h2').text
book = i.find(class_ ='title').text #这里我直接用了tag.text 去提取文字
details = i.find(class_ = 'info').text #在列表中的每个元素里,匹配属性class_='info'提取出数据
print(book,'\n',type,'\n',details)

终端输出:

 

 看一下  已经都是文本数据啦

整个解析数据提取数据的过程就结束了。

六、复习

爬虫的整个流程前面三大部分:requests 去获取数据;BeautifulSoup 进行数据解析;利用find/find_all进行数据提取操作。

  • requests 对象:
    • reponse = requests.get(url)   
    • 这里的get 要注意,因为用到的是get 请求,所以用的是get.之后可能还有post 请求,就要使用requests.post (url) 了
  • bs 对象: 
    • bs对象 = BeautifulSoup(要解析的文本,‘解析器’)   
    • 这里选了‘html.paeser’
  • find/find_all 对象:
    • find
      • 提取满足条件的单个数据---BeautifulSoup 对象.find(标签,属性)---soup.find('div',class_='books')  要注意class_ 的下划线
    • find_all
      • 提取满足条件的单个数据---BeautifulSoup 对象.find_all(标签,属性)---soup.find_all('div',class_='books')  要注意class_ 的下划线
  • Tag 对象:   
    • Tag.find()  / Tag.find_all()   提取Tag 中的Tag
      •  Tag.text   提取Tag 中的文字
      • Tag['属性名']  输入参数:属性名,可以提取Tag 中的属性值

 

之后还会用有利用excel 和csv 进行数据存储,获取cookie 等。不要急,慢慢来。

贴的知识点部分是要重点,需要理解和掌握的,

对于贴的代码,仅供参考,主要是明白逻辑和流程。

 

posted @ 2020-09-22 14:13  胖虎大人v  阅读(1153)  评论(0)    收藏  举报