Python爬虫进阶-第2关爬虫初体验

Python爬虫进阶-第2关爬虫初体验

基础知识:

HTML中的常见标签和常见属性:
Python爬虫进阶-第2关爬虫初体验_第1张图片
Python爬虫进阶-第2关爬虫初体验_第2张图片
BeautifulSoup模块

爬虫的四个步骤:1.获取数据2.解析数据3.提取数据4.存取数据。使用requests库完成爬虫第1步——获取数据。使用网页解析库BeautifulSoup来解析和提取数据。

我们平时使用浏览器上网,浏览器会把服务器返回来的HTML源代码翻译为我们能看懂的样子,之后我们才能在网页上做各种操作。在爬虫中,也要使用能读懂html的工具,才能提取到想要的数据。
Python爬虫进阶-第2关爬虫初体验_第3张图片
这就是解析数据。
提取数据是指把我们需要的数据从众多数据中挑选出来。

BeautifulSoup解析数据的用法

Python爬虫进阶-第2关爬虫初体验_第4张图片

在括号中,要输入两个参数,第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的数据类型是,说明soup是一个BeautifulSoup对象

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.textsoup打印出的内容表面上看长得一模一样,却有着不同的内心,它们属于不同的类: 与****。前者是字符串,后者是已经被解析过的BeautifulSoup对象。之所以打印出来的是一样的文本,是因为BeautifulSoup对象在直接打印它的时候会调用该对象内的str方法,所以直接打印 bs 对象显示字符串是str的返回结果。

BeautifulSoup解析数据

格式

from bs4 import BeautifulSoup
soup = BeautifulSoup(字符串,'html.parser') 

BeautifulSoup提取数据

Python爬虫进阶-第2关爬虫初体验_第5张图片
先看find()与find_all()
find()与find_all()是BeautifulSoup对象的两个方法,它们可以匹配html的标签和属性,把BeautifulSoup对象里符合要求的数据都提取出来。
find()只提取首个满足要求的数据。find()方法将代码从上往下找,找到符合条件的第一个数据,不管后面还有没有满足条件的其他数据,停止寻找,立即返回。find_all()顾名思义(find all:查找全部),提取出的是所有满足要求的数据。代码从上往下找,一直到代码的最后,把所有符合条件的数据揣好,一起打包返回。
Python爬虫进阶-第2关爬虫初体验_第6张图片
在网页的HTML代码中有三个div元素(

),用find()可以提取出首个元素(只有一个),而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)
print(res.status_code)
soup = BeautifulSoup(res.text,'html.parser')
# 使用find()方法提取首个
元素,并放到变量item里。 item = soup.find('div') # 打印item的数据类型 print(type(item)) # 打印item print(item)

结果:
Python爬虫进阶-第2关爬虫初体验_第7张图片
首个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类对象的常用属性和方法

Python爬虫进阶-第2关爬虫初体验_第8张图片
刚刚写的代码:即爬取这个书苑不太冷网站中每本书的类型、链接、标题和简介,我们刚刚拿到的分别是三本书的内容,即三个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)

总结:
Python爬虫进阶-第2关爬虫初体验_第9张图片

完整源代码参考:希望大家多多给星
https://github.com/Bryant-New/python-crawler

你可能感兴趣的:(爬虫,python)