Python作为一种简洁而强大的编程语言,凭借其丰富的库和框架,成为了数据抓取和处理的首选工具之一。Python爬虫技术,正是在这种背景下应运而生,它能够自动化地从互联网上获取大量数据,为企业和个人提供了巨大的便利。 本文旨在为Python爬虫技术提供一份详尽的入门指南,适合零基础的初学者,将向您介绍爬虫的基础知识和基本工作流程,并探讨如何使用Requests库发送请求,以及利用BeautifulSoup库解析HTML文档。
一、爬虫的基本知识
1. 什么是爬虫
爬虫,全称是网络爬虫(Web Crawler),也称为网络蜘蛛,是一种自动化程序,用于抓取网页上的信息。这些信息可以包括网页的内容、结构或其他相关资源。爬虫通过模拟用户访问网站的行为,自动化地从互联网上抓取数据,并在后续阶段对这些数据进行存储和处理。爬虫广泛应用于搜索引擎索引、数据分析、电子商务价格监控、社交媒体数据采集等领域,是大数据和人工智能应用的重要组成部分。
目前,我们常用Python来实现爬虫,Python为爬虫提供了多种库和框架,如Requests、BeautifulSoup、Scrapy等,极大地提高了编写爬虫程序的效率,并提高了数据抓取的效率和准确性。
2. 爬虫的工作流程
一个完成的爬虫程序,大致具有如下五个步骤:发送请求、接收响应、解析响应、数据清洗与存储、循环爬取。
-
发送请求(Request):爬虫向目标网站发送 HTTP 请求,常见的请求方法包括 GET 和 POST。请求可能携带特定的参数(如查询条件)和头信息(如 User-Agent)。
-
接收响应(Response):目标网站的服务器返回 HTTP 响应,通常包含网页的 HTML 源码。响应还可能包括 JSON 数据(如 API 的返回结果)。
-
解析响应(Parsing):解析网页内容或 JSON 数据,提取出目标信息。解析工具可以是正则表达式、HTML 解析器(如 BeautifulSoup)或 JSON 解析库。
-
数据清洗与存储(Data Cleaning & Storage):清洗提取到的原始数据,去除噪声或冗余内容。将清洗后的数据存储到文件(如 CSV)或数据库中(如 MySQL、MongoDB)。
-
循环爬取(Iteration):根据链接结构或其他规则,递归爬取更多页面;或使用 URL 队列管理待爬取的链接。
3. 爬虫的注意事项
在设计爬虫程序和进行爬虫实操时,我们需注意以下的注意事项,以保证爬虫程序有效、合理、合法地进行,避免带来不必要的麻烦。
-
合法性与合规性:我们的爬虫程序必须遵守目标网站的 robotx.txt 文件中的爬取规则。在爬虫时,不得抓取或使用受版权保护的数据,并要遵守当地法律法规,避免侵犯用户隐私。
-
对目标网站的影响:在设计爬虫程序时,要避免频繁发送请求对目标服务器造成负担,并设置合理的请求间隔。
-
数据安全与隐私:不爬取敏感信息(如个人隐私数据),并确保提取的数据不得用于非法用途。
二、Requests模块
1. 什么是 Requests 模块
Requests 是 Python 的一个 HTTP 客户端库,支持发送各种类型的 HTTP 请求,包括 GET、POST、PUT、DELETE 等。它可以帮助我们与网页服务器交互,获取需要的数据。目前,Requests 模块的最新版本是 requests 2.32.3,更新于2024年5月29日。Requests 模块的官方文档:requests · PyPI
2. 安装 Requests 模块
首先,确保你已经安装了 requests 模块。如果没有安装,可以运行以下命令:
pip install requests
当安装完成后,你可以在 Python 中使用 requests 模块。
3. 基本用法:发送 HTTP 请求
发送 HTTP 请求是 requests 模块的最基本用法。我们常用 GET 请求和 POST 请求。
GET 请求是最常见的 HTTP 请求方式,用于从服务器获取数据。你可以理解成,让 Python 代码去访问一个网页,并把网页内容拿回来。在爬虫中,我们常使用 GET 请求来获取一个网页的内容。
import requests
# 发送 GET 请求
response = requests.get('...') # 输入拟访问的网址
# 输出响应的文本内容
print(response.text)
在爬虫中,有时候我们需要向服务器提交一些数据,比如登录信息。这时我们需要用到 POST 请求。
import requests
# 表单数据
data = {'username': 'test', 'password': '1234'}
# 发送 POST 请求
response = requests.post('...', data=data) # 输入拟访问的网址
# 输出服务器返回的内容
print(response.text)
4. 模拟浏览器:User-Agent
很多网站会检查你的请求,看它是不是来自真实的浏览器。如果不是,它可能会拒绝响应。为了让爬虫“伪装”成浏览器,我们可以加一些特殊信息,比如 User-Agent。
import requests
# 添加请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0 Safari/537.36'
}
# 带上伪装信息访问网页
response = requests.get('...', headers=headers) # 输入拟访问的网址
# 打印网页内容
print(response.text)
5. 处理返回的结果
服务器会给你的请求一个回复(我们称之为“响应”)。你可以用以下几种方法处理:
- 网页内容:response.text 以字符串形式会返回网页的内容(通常是 HTML)。
- 检查是否成功:response.status_code 返回一个数字,比如 200 表示成功,404 表示页面不存在。
import requests
response = requests.get('...') # 输入拟访问的网址
# 检查状态码
if response.status_code == 200:
print("请求成功!")
print(response.text) # 打印网页内容
else:
print(f"请求失败,状态码:{response.status_code}")
6. 下载文件
你可以用 requests 下载网页上的文件,比如图片或文档。
import requests
url = '...' # 图片的地址
# 获取图片
response = requests.get(url)
# 保存到本地
with open('image.jpg', 'wb') as file:
file.write(response.content)
print("图片下载完成!")
7. 错误处理
有时候,服务器可能比较慢,或者你的网络不好,代码会报错。这时,我们可以加一个“错误处理”的部分,让代码更加稳健。requests 提供了异常处理机制,确保我们的爬虫能够更有效的运行。
import requests
try:
response = requests.get('...', timeout=5) # 最多等待 5 秒
if response.status_code == 200:
print("请求成功!")
print(response.text)
else:
print(f"请求失败,状态码:{response.status_code}")
except requests.exceptions.Timeout:
print("请求超时!")
except requests.exceptions.RequestException as e:
print(f"请求出错:{e}")
三、BeautifulSoup 模块
1. 什么是 BeautifulSoup 模块
如果说 requests 是帮我们“爬”下网页内容的工具,那么 BeautifulSoup 就是帮我们从这些内容中“挑出有用数据”的工具。它特别擅长处理 HTML 和 XML 格式的内容,简单又强大。它为文档创建解析树,可用于从 HTML 中提取数据,
这对于网页抓取非常有用。
表格中是 BeautifulSoup 模块常用的函数,及其对应的功能。
soup.title | 打印标题 |
soup.title.name | 打印标题的标签 |
soup.title.text | 打印标题的文本 |
soup.p | 打印第一个p标签 |
soup.p.parent | 打印第一个p标签的父标签内容 |
soup.p['class'] | 获取第一个p标签的class属性值 |
soup.p.get('class') | 获取第一个p标签的class属性值,功能与 soup.p['class']相似,但如果没有class属性,不会报错,而是返回None。 |
soup.find(id="?") | 根据 id 属性值查找第一个符合条件的标签并返回(返回的是整个标签内容) |
soup.find(class_='?') | 根据class属性值查找第一个符合条件的标签并返回(返回整个标签内容)。 |
soup.findAll(name=?1,attrs=?2) | 查找所有符合条件的标签并返回一个列表。 |
2. 安装 BeautifulSoup 模块
首先,确保你已经安装了 BeautifulSoup 模块。如果没有安装,可以运行以下命令:
pip install beautifulsoup4 requests
当安装完成后,你可以在 Python 中使用 BeautifulSoup 模块。
3. 基础用法:从网页中提取标题
首先,我们需要用到 requests 模块把网页内容下载下来:
import requests
# 获取网页内容
response = requests.get('...')
# 打印网页的 HTML 内容
print(response.text)
输出的内容是一大段 HTML。它可能看起来很复杂,但是我们可以使用 BeautifulSoup 来处理它。BeautifulSoup 可以帮我们把这些复杂的 HTML 转成结构化的内容,这样我们就能轻松找到需要的部分。
from bs4 import BeautifulSoup
# 假设我们已经用 requests 获取了网页内容
html = response.text
# 创建一个 BeautifulSoup 对象
soup = BeautifulSoup(html, 'html.parser')
# 提取网页标题
title = soup.title.string
print("网页标题是:", title)
- soup.title 会找到网页中的 <title> 标签。
- .string 是取标签里的文字内容。
4. 提取特定的内容:寻找标签
HTML 是由很多标签(如<h1>、<p>、<a>
)组成的。我们可以用 BeautifulSoup 找到这些标签。
# 找到网页中的所有链接
links = soup.find_all('a')
for link in links:
print("链接地址:", link.get('href'))
-
find_all ('a') 会找到网页中所有的 <a> 标签。
-
link.get ('href') 是获取每个链接的地址。
当我们想要找到某个特定的段落时,可以使用 soup.find。例如查找第一个段落。
# 找到第一个段落
paragraph = soup.find('p')
print("段落内容:", paragraph.text)
5. 更复杂的查找方法
有时候我们需要更精确地查找标签,比如根据它的“类名”或“id”。
# 找到 class 是 "example-class" 的标签
results = soup.find_all(class_='example-class')
for result in results:
print("内容:", result.text)
- class = 'example-class' 是制定查找标签的类名。
# 找到 id 是 "main-content" 的标签
content = soup.find(id='main-content')
print("内容:", content.text)
- id = 'main-content' 是制定查找标签的 id。
6. 查找标签的嵌套内容
HTML 标签是嵌套的,比如:
<div class="container">
<h1>标题</h1>
<p>这是一个段落。</p>
</div>
我们可以从外层标签进入到内层标签。
# 找到 class 是 "container" 的 div
container = soup.find(class_='container')
# 再从这个 div 中找 h1
title = container.find('h1').text
print("标题是:", title)
# 再从这个 div 中找 p
paragraph = container.find('p').text
print("段落是:", paragraph)
四、爬虫案例
以上就是有关爬虫和 Requests、BeautifulSoup 模块的基础知识。以下是一个爬虫案例,使用了Requests、BeautifulSoup 模块爬取豆瓣电影Top250榜单。