搭建环境
??在操作系统中安装好Python,这里采用的是Python 3.9.9;选择VS Code作为开发工具,安装Python插件,方便代码编辑和调试。
安装爬虫库
??初入爬虫世界,先要了解下今天用的常规工具库——Requests 和BeautifulSoup 。 ??Requests 主要作用是请求网站获取网页数据,BeautifulSoup 则可以轻松解析Requests 库获得的网页信息,并把网页源代码解析为Soup文档,便于过滤提取数据。这里简单介绍一种安装方法如下,其它方法请大家自行搜索。
pip install requests
pip install bs4
爬虫测试
获取网页整体信息
1.访问目标网页
??使用Chromium内核的新版Edge浏览器打开任意网页,下图为网页网页,是一篇文章。
2.引入Requests库获取请求响应
??这里,我们新建一个python文件,引入Requests库,通过requests.get() 以GET方式发送请求,获取响应信息。
import requests
res = requests.get("https://*.*.*")
print(res)
print(res.text)
??通过print()函数将响应结果的HTTP状态码响应消息内容输出后,结果如下。可以看出,数据结构不清晰,不利于我们分析数据,因此,需要对数据进行处理,方便查找分析。
3.引入BeautifulSoup库格式化处理响应数据
??我们在原有代码的基础上,添加BeautifulSoup 相关代码,对Requests 库获得的响应信息进行处理,将数据格式化,形成一个具有内在结构的 BeautifulSoup 对象。
import requests
from bs4 import BeautifulSoup
res = requests.get("https://*.*.*")
soup = BeautifulSoup(res.text, 'html.parser')
print(soup.prettify())
??通过prettify() 方法可以将Beautiful Soup 文档树格式化,以Unicode编码输出,每个XML/HTML标签都独占一行,结果如下图所示,格式清晰,可视化效果好,方便分析。
获取网页中特定信息
??对于一个网页来说,我们感兴趣的往往是一部分特定信息,因此,可以利用Beautiful Soup 的选择功能筛选出感兴趣的内容,予以爬取。下面我们来看看怎么去做。
1.找到目标HTML标签
??在网页上右键选择检查 ,可以打开网页调试工具,如下图所示。 ??点击调试工具左上角的按钮(如下图所示)后,再点击左边网页中的某个目标元素,在右边调试部分便会高亮显示当前元素的标签信息。
2.获取目标网页定位
??以刚才打开的网页为例,这篇文章有很多标题,假设我们想要获取这些一级标题信息,该怎么办呢?我们可能发现,页面结构比较复杂,通过上一步操作无法获得目标的完整标签路径,也就是无法得到目标的准确位置,进而无法通过代码定位选择出我们需要的信息。这时,该怎么办呢?其实很简单,我们选中感兴趣的某个标题,比如Unicode编码 这行,在调试器中看到这个元素的标签信息,如下图所示。 ??此时,在该部分信息上点击右键->复制->复制Selector,可以获得目标网页定位#Unicode\%E7\%BC\%96\%E7\%A0\%81 。于是,我们在代码响应信息处理部分加入以下代码,成功得到Unicode编码 这行文章信息。
titles=soup.select('#Unicode\%E7\%BC\%96\%E7\%A0\%81')
print(titles)
[<h1 id="Unicode%E7%BC%96%E7%A0%81" name="Unicode%E7%BC%96%E7%A0%81">Unicode编码</h1>]
??可是,利用这个标签,我们无法获得其他一级标题信息,因为在HTML中#ID信息是唯一的,就像我们利用一个人的身份证没法找到另一个人一样。因此,这里我们不能使用# 开头的元素ID信息。分析一级标题的标签信息,可以知道,该元素有id 、name ,但两者都有可能是网页唯一的,不是一级标题的共同特点,因此,我们在调试器中将该元素的两个属性id 、name 删除,使元素变成<h1>Unicode编码</h1> ,此时采用之前的方法,在该部分信息上点击右键->复制->复制Selector,便可获得新的目标网页定位信息。
??其中,定位信息最后的h1:nth-child(8) 表示的是满足当前选择器条件的第8个<h1> 元素。所以,我们推测,其他一级标题应该也是类似<h1> 元素,因此,把nth-child(8) 去掉应该就是我们要获取的一级标题的共同路径。
3.爬取指定数据信息
??获得一级标题共同路径信息后,将信息遍历输出,便可得到我们想要的数据信息,代码如下。
titles=soup.select("#react-root > div:nth-child(1) > div.J-body.col-body.pg-2-article > div.com-3-layout > div.layout-main > section.com-2-panel.col-2-article.J-articlePanel > div.com-markdown-collpase > div.com-markdown-collpase-main > div.rno-markdown.J-articleContent > h1")
for title in titles:
print(title.get_text())
??titles 参数存储有相关元素的标签信息,通过get_text() 便可提取出该元素的文本信息,也就是最终我们感兴趣的所有一级标题信息。至此,我们便完成了爬虫第一步,虽然我们爬得很晚很慢,但我们依然有颗征服山顶的心。 加油,共勉!
概述
Unicode编码
UTF-8
UTF-16
JavaScript中的string与DOMString
总结
|