Python 爬虫(Web Scraping)是指通过编写 Python 程序从互联网上自动提取信息的过程。
爬虫的基本流程通常包括发送 HTTP 请求获取网页内容、解析网页并提取数据,然后存储数据。
Python 的丰富生态使其成为开发爬虫的热门语言,特别是由于其强大的库支持。
一般来说,爬虫的流程可以分为以下几个步骤:
[requests](https://www.runoob.com/python3/python-requests.html)
。BeautifulSoup
、lxml
、Scrapy
等。本章节主要介绍 BeautifulSoup,它是一个用于解析 HTML 和 XML 文档的 Python 库,能够从网页中提取数据,常用于网页抓取和数据挖掘。
BeautifulSoup 是一个用于从网页中提取数据的 Python 库,特别适用于解析 HTML 和 XML 文件。
BeautifulSoup 能够通过提供简单的 API 来提取和操作网页中的内容,非常适合用于网页抓取和数据提取的任务。
要使用 BeautifulSoup,需要安装 beautifulsoup4 和 lxml 或 html.parser(一个 HTML 解析器)。
我们可以使用 pip 来安装这些依赖:
pip install beautifulsoup4
pip install lxml # 推荐使用 lxml 作为解析器(速度更快)
如果你没有 lxml,可以使用 Python 内置的 html.parser 作为解析器。
BeautifulSoup 用于解析 HTML 或 XML 数据,并提供了一些方法来导航、搜索和修改解析树。
BeautifulSoup 常见的操作包括查找标签、获取标签属性、提取文本等。
要使用 BeautifulSoup,需要先导入 BeautifulSoup,并将 HTML 页面加载到 BeautifulSoup 对象中。
通常,你会先用爬虫库(如 requests)获取网页内容:
from bs4 import BeautifulSoup
import requests
# 使用 requests 获取网页内容
url = ‘https://cn.bing.com/’ # 抓取bing搜索引擎的网页内容
response = requests.get(url)
# 使用 BeautifulSoup 解析网页
soup = BeautifulSoup(response.text, ‘lxml’) # 使用 lxml 解析器
# 解析网页内容 html.parser 解析器
# soup = BeautifulSoup(response.text, ‘html.parser’)
获取网页标题:
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = ‘https://cn.bing.com/’ # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = ‘utf-8’
# 确保请求成功
if response.status_code == 200:
# 使用BeautifulSoup解析网页内容
soup = BeautifulSoup(response.text, ‘lxml’)
\# 查找标签
title\_tag \= soup.find('title')
\# 打印标题文本
if title\_tag:
print(title\_tag.get\_text())
else:
print("未找到标签")
else:
print(“请求失败,状态码:”, response.status_code)
执行以上代码,输出标题为:
搜索 - Microsoft 必应
使用 requests 库抓取中文网页时,可能会遇到编码问题,导致中文内容无法正确显示,为了确保能够正确抓取并显示中文网页,通常需要处理网页的字符编码。
自动检测编码 requests 通常会自动根据响应头中的 Content-Type 来推测网页的编码,但有时可能不准确,此时可以使用 chardet 来自动检测编码。
import requests
url = ‘https://cn.bing.com/’
response = requests.get(url)
# 使用 chardet 自动检测编码
import chardet
encoding = chardet.detect(response.content)[‘encoding’]
print(encoding)
response.encoding = encoding
执行以上代码,输出为:
utf-8
如果你知道网页的编码(例如 utf-8 或 gbk),可以直接设置 response.encoding:
response.encoding = 'utf-8' # 或者 'gbk',根据实际情况选择
BeautifulSoup 提供了多种方法来查找网页中的标签,最常用的包括 find() 和 find_all()。
find()
返回第一个匹配的标签find_all()
返回所有匹配的标签from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = ‘utf-8’
soup = BeautifulSoup(response.text, ‘lxml’)
# 查找第一个 标签
first_link = soup.find(‘a’)
print(first_link)
print(“----------------------------”)
# 获取第一个 标签的 href 属性
first_link_url = first_link.get(‘href’)
print(first_link_url)
print(“----------------------------”)
# 查找所有 标签
all_links = soup.find_all(‘a’)
print(all_links)
输出结果类似如下:
新闻
----------------------------
http://news.baidu.com
----------------------------
[新闻, hao123, 地图, 视频,
通过 get_text() 方法,你可以提取标签中的文本内容:
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = ‘utf-8’
soup = BeautifulSoup(response.text, ‘lxml’)
# 获取第一个
标签中的文本内容
paragraph_text = soup.find(‘p’).get_text()
# 获取页面中所有文本内容
all_text = soup.get_text()
print(all_text)
输出结果类似如下:
百度一下,你就知道
...
你可以通过 parent 和 children 属性访问标签的父标签和子标签:
# 获取当前标签的父标签
parent_tag = first_link.parent
# 获取当前标签的所有子标签
children = first_link.children
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = ‘utf-8’
soup = BeautifulSoup(response.text, ‘lxml’)
# 查找第一个 标签
first_link = soup.find(‘a’)
print(first_link)
print(“----------------------------”)
# 获取当前标签的父标签
parent_tag = first_link.parent
print(parent_tag.get_text())
输出结果类似如下:
新闻
----------------------------
新闻 hao123 地图 视频 贴吧 登录 更多产品
你可以通过传递属性来查找具有特定属性的标签。
例如,查找类名为 example-class 的所有 div 标签:
# 查找所有 class="example-class" 的 标签
divs_with_class = soup.find_all('div', class_='example-class')
# 查找具有 id="unique-id" 的 标签
unique_paragraph = soup.find('p', id='unique-id')
获取搜索按钮,id 为 su :
实例
from bs4 import BeautifulSoup
import requests
# 指定你想要获取标题的网站
url = ‘https://www.baidu.com/’ # 抓取bing搜索引擎的网页内容
# 发送HTTP请求获取网页内容
response = requests.get(url)
# 中文乱码问题
response.encoding = ‘utf-8’
soup = BeautifulSoup(response.text, ‘lxml’)
# 查找具有 id=“unique-id” 的 标签
unique_input = soup.find(‘input’, id=‘su’)
input_value = unique_input[‘value’] # 获取 input 输入框的值
print(input_value)
输出结果为:
百度一下
高级用法
CSS 选择器
BeautifulSoup 也支持通过 CSS 选择器来查找标签。
select() 方法允许使用类似 jQuery 的选择器语法来查找标签:
# 使用 CSS 选择器查找所有 class 为 'example' 的