首页 > 技术文章 > 形象理解爬虫的四步

waterr 2020-12-15 23:22 原文

目标:爬取网站上的书名和简介
 
以下为代码:
 
import requests # 调用requests库
from bs4 import BeautifulSoup # 调用BeautifulSoup库

res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html') # 返回一个response对象,赋值给res
 
爬虫有四步:获取数据、解析数据、提取数据、保存数据
 
这一步就是获取数据,利用requests库中的get函数,在给定的网址中,获取数据,得到的东西是一个封装的response对象,对于对象,会有各种属性方法,我们要通过方法(打个比方就是对象是一个黑盒,方法是各种钥匙,不同的钥匙打开不同的门,不同的门里面包含着不同的数据)
 
html = res.text# 把res的内容以字符串的形式返回
这一步,就是运用了res对象中text方法,将对象中包含字符串的门,打开,使之将内容吐出来这里的 html 的类型是 string 字符串,对应到这里,通过打印html,里面是包含着我们需要的内容的网页代码,所以这一步只是粗糙的拿到了我们的数据。
 
soup = BeautifulSoup( html,'html.parser') # 把网页解析为BeautifulSoup对象
 
获取数据后,下一步就是解析数据了,我们引入了一个用来解析网页内容的模块,通过解析后,将解析的数据赋值给了soup,打印soup 的类型,<class 'bs4.BeautifulSoup'>打印soup 内容,可以发现和html的区别:
区别:html中的代码部分的格式,被清除了。这种格式体现在排版上。但是内容依然是:我们需要的内容+网页代码,所以下一步我们就需要将网页代码部分去掉。
 
items = soup.find_all(class_='books') # 通过定位标签和属性提取我们想要的数据
 
实际上,获取数据的过程就是一点点缩小范围,直到拿到需要的数据为止。所以这里,我们需要精确定位一下,通过查看网页代码,我们发现,我们需要的内容,其实是在 class=book 的标签中,所以我们缩小一下范围拿到的数据赋值给 items ,items的类型 <class 'bs4.element.ResultSet'>,我们可以把它当做一个列表 list 来看待内容当然是class= book 中的文字+代码了
 
for item in items:
print('想找的数据都包含在这里了:\n',item) # 打印item
print(type(item))
 
既然是列表,我们要想获得里面的内容就需要  【遍历】 一下子了,【遍历】完后,我们发现:内容还是那些内容,只不过,item 的【格式】<class 'bs4.element.Tag'>既然是个【对象】,我们就知道应该怎么办了

 

 

首先,tag对象依旧可以使用find继续缩小范围式的查找

for item in items:
    kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
    title = item.find(class_='title') #在列表中的每个元素里,匹配属性                
    class_='title'提取出数据
    brief = item.find(class_='info') #在列表中的每个元素里,匹配属性        
    class_='info'提取出数据
    print(kind,'\n',title,'\n',brief) # 打印提取出的数据
    print(type(kind),type(title),type(brief)) # 打印提取出的数据类型        

 

实际上这时拿到的kind、title、brief 依然包含着网页代码,他们各自的类型依然是tag,所以我们可以继续使用以下方法

 

import requests # 调用requests库from bs4 import BeautifulSoup # 调用BeautifulSoup库
res =requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')# 返回一个response对象,赋值给res
html=res.text
# 把res解析为字符串
soup = BeautifulSoup( html,'html.parser')# 把网页解析为BeautifulSoup对象
items = soup.find_all(class_='books') # 通过匹配属性class='books'提取出我们想要的元素for item in items: # 遍历列表items
kind = item.find('h2') # 在列表中的每个元素里,匹配标签<h2>提取出数据
title = item.find(class_='title') # 在列表中的每个元素里,匹配属性class_='title'提取出数据
brief = item.find(class_='info') # 在列表中的每个元素里,匹配属性class_='info'提取出数据
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text) # 打印书籍的类型、名字、链接和简介的文字

 

 

推荐阅读