HTML中的常见标签和常见属性:
BeautifulSoup模块
爬虫的四个步骤:1.获取数据2.解析数据3.提取数据4.存取数据。使用requests库完成爬虫第1步——获取数据。使用网页解析库BeautifulSoup来解析和提取数据。
我们平时使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子,之后我们才能在网页上做各种操作。在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据。
这就是解析数据。
提取数据是指把我们需要的数据从众多数据中挑选出来。
在括号中,要输入两个参数,第0个参数是要被解析的文本,注意了,它必须是字符串。括号中的第1个参数用来标识解析器,我们要用的是一个Python内置库:html.parser。(它不是唯一的解析器,却是简单的那个)
仍然以网站这个书苑不太冷为例(url:https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html),假设我们想爬取网页中的书籍类型、书名、链接、和书籍介绍。
在pycharm编辑器中的解释器里没有发现bs4库,需要在使用pip install beautifulsoup4之后,自行安装和添加bs4,否则会报错
import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
print(res.status_code)
html = res.text # 将返回的内容以字符串的形式返回
soup = BeautifulSoup(res.text, 'html.parser') # 把网页解析为BeautifulSoup对象
print(html) # 打印出html的源码
第6行中的第1个参数,必须是字符串类型;括号中的第2个参数是解析器。soup的数据类型是
import requests
from bs4 import BeautifulSoup
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
soup = BeautifulSoup( res.text,'html.parser')
# 查看soup的类型
print(type(soup))
# 打印soup
print(soup)
虽然response.text和soup打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类:
格式
from bs4 import BeautifulSoup
soup = BeautifulSoup(字符串,'html.parser')
先看find()与find_all()
find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。
find()只提取首个满足要求的数据。find()方法将代码从上往下找,找到符合条件的第一个数据,不管后面还有没有满足条件的其他数据,停止寻找,立即返回。find_all()顾名思义(find all:查找全部),提取出的是所有满足要求的数据。代码从上往下找,一直到代码的最后,把所有符合条件的数据揣好,一起打包返回。
在网页的HTML代码中有三个div元素(
import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
res = requests.get (url)
print(res.status_code)
soup = BeautifulSoup(res.text,'html.parser')
# 使用find()方法提取首个元素,并放到变量item里。
item = soup.find('div')
# 打印item的数据类型
print(type(item))
# 打印item
print(item)
结果:
首个div元素吧!打印了它的数据类型:,说明这是一个Tag类标签对象。
import requests
from bs4 import BeautifulSoup
url = 'https://localprod.pandateacher.com/python-manuscript/crawler-html/spder-men0.0.html'
res = requests.get (url)
print(res.status_code)
soup = BeautifulSoup(res.text,'html.parser')
# 用find_all()把所有符合要求的数据提取出来,并放在变量items里
items = soup.find_all('div')
# 打印items的数据类型
print(type(items))
# 打印items
print(items)
运行结果是那三个div元素,它们一起组成了一个列表结构。打印items的类型,显示的是,是一个ResultSet类的对象。其实是Tag对象以列表结构储存了起来,可以把它当做列表来处理。
# 调用requests库
import requests
# 调用BeautifulSoup库
from bs4 import BeautifulSoup
# 返回一个Response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把Response对象的内容以字符串的形式返回
html = res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser')
# 通过匹配标签和属性提取我们想要的数据
items = soup.find_all(class_='books')
# 打印items
print(items)
# 打印items的数据类型
print(type(items))
三本书的全部信息都被我们提取出来了。它的数据类型是, 前面说过可以把它当做列表list来看待.
列表并不是我们最终想要的东西,我们想要的是列表中的值,所以要想办法提取出列表中的每一个值.
用for循环遍历列表,就可以把这三个div元素取出来了。
# 调用requests库
import requests
# 调用BeautifulSoup库
from bs4 import BeautifulSoup
# 返回一个Response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把Response对象的内容以字符串的形式返回
html= res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser')
# 通过定位标签和属性提取我们想要的数据
items = soup.find_all(class_='books')
for item in items:
# 打印item
print('想找的数据都包含在这里了:\n',item)
但是,我们现在打印出来的东西还不是目标数据,里面含着HTML标签,还需使用提取数据中的另一个知识点——Tag对象。这个时候,我们一般会选择用type()函数查看一下数据类型,因为Python是一门面向对象编程的语言,只有知道是什么对象,才能调用相关的对象属性和方法看到它们的数据类型是,是Tag对象。
Tag类对象的常用属性和方法
刚刚写的代码:即爬取这个书苑不太冷网站中每本书的类型、链接、标题和简介,我们刚刚拿到的分别是三本书的内容,即三个Tag对象
首个Tag对象:
<div class="books">
<h2><a name="type1">科幻小说</a></h2>
<a href="https://book.douban.com/subject/27077140/" class="title">《奇点遗民》</a>
<p class="info">本书精选收录了刘宇昆的科幻佳作共22篇。《奇点遗民》融入了科幻艺术吸引人的几大元素:数字化生命、影像化记忆、人工智能、外星访客……刘宇昆的独特之处在于,他写的不是科幻探险或英雄奇幻,而是数据时代里每个人的生活和情感变化。透过这本书,我们看到的不仅是未来还有当下。
</p>
<img class="img" src="./spider-men5.0_files/s29492583.jpg">
<br>
<br>
<hr size="1">
</div>
第2行:书籍的类型在这里面;第3行:我们要取的链接和书名在里面;第4行:书籍的简介在里面。因为是只取首个数据,这次用find()就好。
# 调用requests库
import requests
# 调用BeautifulSoup库
from bs4 import BeautifulSoup
# 返回一个response对象,赋值给res
res = requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把res的内容以字符串的形式返回
html = res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser')
# 通过定位标签和属性提取我们想要的数据
items = soup.find_all(class_='books')
for item in items:
# 在列表中的每个元素里,匹配标签提取出数据
kind = item.find('h2')
# 在列表中的每个元素里,匹配属性class_='title'提取出数据
title = item.find(class_='title')
# 在列表中的每个元素里,匹配属性class_='info'提取出数据
brief = item.find(class_='info')
# 打印提取出的数据
print(kind,'\n',title,'\n',brief)
# 打印提取出的数据类型
print(type(kind),type(title),type(brief))
运行结果的数据类型,又是三个,用find()提取出来的数据类型和刚才一样,还是Tag对象.把Tag对象中的文本内容提出来。用到Tag对象的另外两种属性——Tag.text(获得标签中的值),和Tag[‘属性名’](获得属性值)。
用Tag.text提出Tag对象中的文字,用Tag[‘href’]提取出URL。
# 调用requests库
import requests
# 调用BeautifulSoup库
from bs4 import BeautifulSoup
# 返回一个response对象,赋值给res
res =requests.get('https://localprod.pandateacher.com/python-manuscript/crawler-html/spider-men5.0.html')
# 把res解析为字符串
html=res.text
# 把网页解析为BeautifulSoup对象
soup = BeautifulSoup( html,'html.parser')
# 通过匹配属性class='books'提取出我们想要的元素
items = soup.find_all(class_='books')
# 遍历列表items
for item in items:
# 在列表中的每个元素里,匹配标签提取出数据
kind = item.find('h2')
# 在列表中的每个元素里,匹配属性class_='title'提取出数据
title = item.find(class_='title')
# 在列表中的每个元素里,匹配属性class_='info'提取出数据
brief = item.find(class_='info')
# 打印书籍的类型、名字、链接和简介的文字
print(kind.text,'\n',title.text,'\n',title['href'],'\n',brief.text)
完整源代码参考:希望大家多多给星
https://github.com/Bryant-New/python-crawler