跳到主要内容Python 爬虫入门:构建第一个简单爬虫 | 极客日志Python
Python 爬虫入门:构建第一个简单爬虫
Python 爬虫通过模拟浏览器发送 HTTP 请求获取网页源码,利用解析库提取目标数据并保存至本地。本文演示了使用 requests 库发起请求,结合 BeautifulSoup 解析 HTML 结构,以及通过文件操作存储链接数据的完整流程。内容涵盖环境配置、基础代码实现及异常处理建议,帮助初学者快速掌握爬虫核心逻辑与基本开发规范。
氛围2 浏览 1. 爬虫的过程分析
当人类去访问一个网页时,是如何进行的?
① 打开浏览器,输入要访问的网址,发起请求。
② 等待服务器返回数据,通过浏览器加载网页。
③ 从网页中找到自己需要的数据(文本、图片、文件等等)。
④ 保存自己需要的数据。
对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。
首先,对应于上面的①和②步骤,我们要利用 Python 实现请求一个网页的功能。
其次,对应于上面的③步骤,我们要利用 Python 实现解析请求到的网页的功能。
最后,对于上面的④步骤,我们要利用 Python 实现保存数据的功能。
因为是讲一个简单的爬虫,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。
2. 如何用 Python 请求一个网页
作为一门拥有丰富类库的编程语言,利用 Python 请求网页完全不在话下。这里推荐一个非常好用的第三方类库 requests。
2.1 requests
2.1.1 安装方式
一般不会出什么问题,如果下载太慢,是因为 pip 使用的源服务器在国外,可以设置 pip 使用国内镜像源,设置方法可以参考 PyPI 使用国内源。
2.1.2 测试是否安装成功
在命令行中输入 python,敲击回车,进入 Python 交互环境。在里面输入以下代码并回车:
2.2 使用 requests 请求网页
创建一个项目,再创建一个 py 文件,用来写代码。
import requests
resp = requests.get('https://www.baidu.com')
print(resp.status_code)
print(resp.content)
对上面的代码进行以下简单的分析:
第 1 行到第 4 行,都是为了将字符编码设置为 utf8。
第 2 行:引入 requests 包。
第 4 行:使用 requests 类库,以 get 的方式请求网址 https://www.baidu.com,并将服务器返回的结果封装成一个对象,用变量 resp 来接收它。
第 5 行:一般可以根据状态码来判断是否请求成功,正常的状态码是 200,异常状态码就很多了,比如 404(找不到网页)、301(重定向)等。
第 6 行:打印网页的源码。注意,只是源码。不像是浏览器,在获取到源码之后,还会进一步地取请求源码中引用的图片等信息,如果有 JS,浏览器还会执行 JS,对页面显示的内容进行修改。使用 requests 进行请求,我们能够直接获取到的,只有最初始的网页源码。也正是因为这样,不加载图片、不执行 JS 等等,爬虫请求的速度会非常快。
运行一下代码看看。箭头指向的是状态码,可以看到,200,请求正常。
被圈起来是网页的源码。
3. 如何用 Python 解析网页源码
网页源码我们拿到了,接下来就是要解析了。Python 解析网页源码有很多种方法,比如 BeautifulSoup、正则、pyquery、xpath 等。这里我简单介绍一下。
3.1 网页源码解析器
3.1.1 BeautifulSoup
这是我比较推荐的一款解析器,简单易用,容易理解。
但是使用 bs4 还需要安装另一个类库 lxml,用来代替 bs4 默认的解析器。之所以这样做,是因为默认的那个实在太慢了,换用了 lxml 后,可以大幅度提升解析速度。
3.1.1.1 安装
pip3 install beautifulsoup4
使用 pip 直接安装 lxml 会出错,所以要用些特别的方法。Windows 用户的话,去搜索 lxml 在 Windows 环境下的安装方法,网上有很多。Ubuntu 用户就很方便了,在终端里面输入以下指令并回车就行了:
apt-get install python-lxml
3.1.1.2 测试是否安装成功
进入 Python 交互环境,引用 bs4 和 lxml 类库,不报错即安装成功。
3.1.2 正则
这个不用安装,标准库里带的就有。
正则的优点:①速度快 ②能够提取有些解析器提取不到的数据
正则的缺点:①不够直观,很难从面向对象的角度来考虑数据的提取 ②你得会写正则表达式
教程就不放了,善用搜索引擎嘛。正则一般用来满足特殊需求、以及提取其他解析器提取不到的数据,正常情况下我会用 bs4,bs4 无法满足就用正则。
3.1.3 pyquery
这个解析器的语法和 jQuery 很相似,所以写过 jQuery 的同学用起来可能比较容易上手。国内有个大佬写的爬虫框架 pyspider 用的就是这个解析器。
如果没用过 jQuery,那就在 bs4 和 pyquery 两个里面选一个学吧,一般情况下会一个就够了。
3.1.3.1 安装
3.1.3.2 测试
3.2 使用 BeautifulSoup+lxml 解析网页源码
接着上面的代码来,我们使用 BeautifulSoup+lxml 解析请求到的网页源码。
从百度的首页,可以通过点击跳转到很多其他页面。
现在,我们想要用 Python 获得从百度能够跳转到的页面的链接,该怎么做?
代码很简单,接着上面的写:
import requests
from bs4 import BeautifulSoup
resp = requests.get('https://www.baidu.com')
print(resp.status_code)
print(resp.content)
bsobj = BeautifulSoup(resp.content, 'lxml')
a_list = bsobj.find_all('a')
for a in a_list:
print(a.get('href'))
首先,第 3 行,引入我们解析时要使用的类库,beautifulsoup4。
第 9 行,将网页的源码转化成了 BeautifulSoup 的对象,这样我们可以向操作 DOM 模型类似地去操作它。
第 10 行,从这个 BeautifulSoup 对象中,获取所有的 a 标签对象(大家应该知道 a 标签对象是什么吧,网页中的链接绝大多数都是 a 对象实现的),将他们组成一个列表,也就是 a_list。
第 11、12 行,遍历这个列表,对于列表中的每一个 a 标签对象,获取它的属性 href 的值(href 属性记录一个 a 标签指向的链接地址)。获取一个标签对象的属性,可以使用 get('xx') 方法,比如 a_tag 是一个 a 标签对象,获取它的 href 的值,就是 a_tag.get('href'),获取它的 class 信息可以用 a_tag.get('class'),这将返回一个修饰该标签的 class 列表。
4. 简单的保存数据的方法
保存数据的方法大概可以分为几类:保存文本、保存二进制文件(包括图片)、保存到数据库。保存二进制文件和保存到数据库后面会具体说,这里简单讲一下怎么保存到文本。
Python 里面操作文本相当的简单。现在,我将刚才提取出来的链接保存到一个名称为 url.txt 的文本里面去,将上面的代码稍作修改。
import requests
from bs4 import BeautifulSoup
resp = requests.get('https://www.baidu.com')
bsobj = BeautifulSoup(resp.content, 'lxml')
a_list = bsobj.find_all('a')
text = ''
for a in a_list:
href = a.get('href')
if href:
text += href + '\n'
with open('url.txt', 'w', encoding='utf-8') as f:
f.write(text)
代码中注释写得很清楚了,就不多做解释了。值得一提的是,使用 with...as...来打开文件,在操作完成后,会自动关闭文件,不用担心忘记关闭文件了,超级好用啊!
运行一下代码,可以发现,当前路径下多了个名为 url.txt 的文件。
打开后,能够看到我们刚才提取出来的 url。
5. 进阶:最佳实践与异常处理
在实际开发中,简单的脚本往往不足以应对复杂的网络环境。为了提高爬虫的稳定性和成功率,建议遵循以下最佳实践。
许多网站会检测 User-Agent,如果没有设置,可能会被视为机器人而拒绝服务。建议在请求时添加模拟浏览器的 Headers。
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
resp = requests.get('https://www.baidu.com', headers=headers)
5.2 异常处理
网络请求可能会因为超时、连接断开等原因失败。使用 try-except 块包裹请求代码可以防止程序崩溃。
try:
resp = requests.get('https://www.baidu.com', timeout=10)
resp.raise_for_status()
except Exception as e:
print(f"请求失败:{e}")
5.3 遵守 robots 协议
在爬取任何网站之前,请检查网站的 robots.txt 文件,确认哪些页面允许抓取。尊重版权和数据隐私是每个开发者应尽的义务。
6. 总结
本文讲解了 Python 爬虫的基础流程,包括使用 requests 发送请求、使用 BeautifulSoup 解析 HTML 以及使用文件 I/O 保存数据。通过添加 Headers 和异常处理,可以使爬虫更加健壮。初学者应在此基础上继续探索更高级的解析技术(如 XPath、正则)以及数据存储方案(如数据库、JSON 文件)。
相关免费在线工具
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
- Markdown转HTML
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
- HTML转Markdown
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
- JSON 压缩
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online