目标:爬取网站上的书名和简介
以下为代码:
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('想找的数据都包含在这里了: ',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,' ',title,' ',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,' ',title.text,' ',title['href'],' ',brief.text) # 打印书籍的类型、名字、链接和简介的文字