-
BeautifulSoup 高级用法:
- 标签查找与筛选:除了简单地通过标签名查找(如
soup.find('div')
查找第一个div
标签),还可以利用属性来更精准地查找。例如,如果要查找所有class
属性为article
的div
标签,可以使用soup.find_all('div', class_='article')
。这里注意class_
后面的下划线,是为了避免和 Python 的关键字class
冲突。 - 层级关系查找:网页中的标签往往是有层级嵌套关系的,BeautifulSoup 可以方便地根据层级来查找元素。比如要查找
div
标签下的p
标签,可以这样写soup.div.find_all('p')
,先定位到div
标签,再查找其内部的所有p
标签。还可以使用soup.select()
方法,通过 CSS 选择器来进行更灵活的层级元素查找,像soup.select('div.article p')
就是查找class
为article
的div
标签下的所有p
标签。 - 获取标签内容与属性:讲解如何获取标签包裹的文本内容(如
tag.text
)以及获取标签的各种属性值(比如对于<a href="https://example.com">链接</a>
这样的a
标签,可以通过tag['href']
来获取href
属性的值)。
- 标签查找与筛选:除了简单地通过标签名查找(如
-
XPath 解析:
- 介绍 XPath 概念:XPath 是一种在 XML 文档中查找信息的语言,由于 HTML 可以看作是 XML 的一种特殊形式,所以也能用 XPath 来解析网页结构定位元素。它通过路径表达式来选取节点,比如
/html/body/div
表示从根节点html
开始,依次选择body
节点下的div
节点。 - 在 Python 中使用(结合 lxml 库):示例代码展示如何安装和使用
lxml
库来通过 XPath 解析网页,像下面这样:
- 介绍 XPath 概念:XPath 是一种在 XML 文档中查找信息的语言,由于 HTML 可以看作是 XML 的一种特殊形式,所以也能用 XPath 来解析网页结构定位元素。它通过路径表达式来选取节点,比如
from lxml import etree
import requestsurl = "https://www.example.com"
response = requests.get(url)
html = etree.HTML(response.text)
result = html.xpath('//div[@class="article"]/p/text()') # 选取class为article的div下的p标签的文本内容
print(result)
二、处理多种网页数据类型
-
图片、链接等资源的提取:
- 图片提取:讲解如何从网页中找出所有图片的链接,通常图片会放在
<img>
标签里,通过src
属性来指定图片的 URL。可以用 BeautifulSoup 查找所有img
标签(如soup.find_all('img')
),然后遍历获取每个img
标签的src
属性值,这些值就是图片的链接,后续可以进一步下载图片到本地等操作。 - 链接提取:对于网页中的超链接(
<a>
标签),同样可以通过查找a
标签,并获取href
属性值来提取链接,可用于构建站内链接的爬虫,顺着这些链接去爬取网页的其他页面等。
- 图片提取:讲解如何从网页中找出所有图片的链接,通常图片会放在
-
数据格式化与清洗:
- 去除空格、特殊字符:爬取到的文本数据可能存在前后空格或者一些不需要的特殊字符,比如换行符
\n
等,可以使用 Python 的字符串方法(如strip()
去除两边空格、replace()
替换特定字符等)来进行清理。 - 数据类型转换:如果爬取的数据要用于后续的计算、分析等,可能需要进行数据类型的转换,比如把字符串形式的数字转换为整型(
int()
函数)或者浮点型(float()
函数)等操作。
- 去除空格、特殊字符:爬取到的文本数据可能存在前后空格或者一些不需要的特殊字符,比如换行符
三、应对简单的反爬虫机制
- 设置请求头(Headers):很多网站会通过检测请求头中的信息(如
User-Agent
,它代表了客户端浏览器等相关信息)来判断请求是否来自正常的浏览器访问。可以通过在Requests
库中设置合适的请求头,模拟真实浏览器请求,示例如下: -
import requestsheaders = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/5.25.25 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } url = "https://www.example.com" response = requests.get(url, headers=headers) print(response.text)
- 控制请求频率:避免过于频繁地向网站发送请求,以免触发网站的反爬虫限制,可以使用
time
模块来设置每次请求之间的时间间隔,像这样: -
通过这些内容的讲解,能让学习者在网络爬虫 Python 的学习道路上更进一步,掌握更实用的爬虫技能,为后续处理更复杂的爬虫项目打下基础。