爬虫摸索中~~(PS:小小爬虫,何惧哉?且到明日,再看今朝。)

搭建环境

  在操作系统中安装好Python,这里采用的是Python 3.9.9;选择VS Code作为开发工具,安装Python插件,方便代码编辑和调试。

安装爬虫库

  初入爬虫世界,先要了解下今天用的常规工具库——RequestsBeautifulSoup
  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信息。分析一级标题的标签信息,可以知道,该元素有idname,但两者都有可能是网页唯一的,不是一级标题的共同特点,因此,我们在调试器中将该元素的两个属性idname删除,使元素变成<h1>Unicode编码</h1>,此时采用之前的方法,在该部分信息上点击右键->复制->复制Selector,便可获得新的目标网页定位信息。

#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:nth-child(8)

  其中,定位信息最后的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
总结
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值