很多人听到"爬虫"两个字就觉得很复杂,要学好多东西。其实入门级的数据采集特别简单——你只需要几行代码,就能把一个网页的内容拿下来。
这是「Python 数据实战」系列的第一篇。我们从最基础的requests库开始,一步一步带你从零基础到能自己抓数据、洗数据、分析数据、做图表。
今天这篇是最简单的:发一个请求,拿到一个网页。
一、requests 是什么?
你可以把requests理解成 Python 版的浏览器。
你平时打开浏览器,输入一个网址,回车,然后网页就出来了。这个过程背后其实就是浏览器向服务器发了一个"请求",服务器把网页内容"响应"回来,浏览器把它渲染成你看到的样子。
requests干的就是同样的事——只不过它不渲染页面,而是把网页的原始代码(HTML)直接拿给你。
为什么用requests不用别的?因为它是 Python 里最简单、最流行、文档最全的 HTTP 请求库。没有之一。
二、安装:一行命令搞定
打开你的终端(Windows 是命令提示符或 PowerShell,Mac 是终端),输入:
pipinstallrequests等它跑完就行了。如果你的环境里pip不行,试试pip3:
pip3installrequests装完之后,可以验证一下装没装上:
pip show requests能看到版本号就说明装好了。写这篇的时候最新版本是 2.32.x,你看到的可能比这个新,没关系,用法是一样的。
三、第一个请求:3行代码拿到网页
直接上代码,别害怕,就3行:
importrequests response=requests.get('https://www.example.com')print(response.text)就这么多。我们一行一行说。
第一行:import requests—— 把刚才装的库引进来。就像打开工具箱盖子。
第二行:response = requests.get('https://www.example.com')—— 向 example.com 这个网址发了一个 GET 请求,把服务器返回的结果存在response这个变量里。
第三行:print(response.text)—— 打印响应的文本内容,也就是网页的 HTML 源码。
你把这段代码存成demo.py,然后运行:
python demo.py运行之后,你会看到一大段 HTML 代码打印出来。那就是 example.com 这个网页的全部内容。
恭喜你,你已经完成了人生第一个数据采集程序。🍃
四、响应状态码:网页到底拿到了没有?
光拿到response还不够,你得知道请求到底成功了没有。
怎么判断?看状态码。
importrequests response=requests.get('https://www.example.com')print(response.status_code)# 输出 200status_code就是状态码。常见的几个你得认识:
| 状态码 | 含义 | 通俗解释 |
|---|---|---|
| 200 | OK | 成功拿到了,一切正常 |
| 301/302 | 重定向 | 网页搬家了,让你去新地址 |
| 404 | Not Found | 页面不存在 |
| 403 | Forbidden | 服务器拒绝了你,不让看 |
| 500 | Internal Server Error | 服务器自己崩了 |
做数据采集时,最理想的就是 200。如果拿到的是 403,说明对方网站检测到你是爬虫,把你拒了。这种情况后面我们会讲怎么应对。
写代码的时候,最好判断一下状态码,别瞎往下跑:
importrequests response=requests.get('https://www.example.com')ifresponse.status_code==200:print('请求成功!')print(response.text[:500])# 只打印前500个字符,免得刷屏else:print(f'请求失败,状态码:{response.status_code}')五、response 对象里还有什么?
response不只有text和status_code,它里面东西挺多的。常用的几个:
importrequests response=requests.get('https://www.example.com')print(response.status_code)# 状态码print(response.text)# 响应文本(字符串形式)print(response.content)# 响应内容(字节形式,图片/文件用这个)print(response.headers)# 响应头信息print(response.encoding)# 编码方式print(response.url)# 实际请求的 URL(重定向后可能不一样)有一个新手容易踩的坑:中文乱码。
有些网页的编码检测不准,response.text拿到的中文是乱码。这时候你可以手动指定编码:
response.encoding='utf-8'print(response.text)或者更智能一点,从内容里自动推断:
response.encoding=response.apparent_encoding这个小技巧在抓中文网站的时候特别好用。
六、加个请求头,装得像个浏览器
你直接用requests.get()发请求,对方网站一看就知道你是爬虫——因为你的请求头里明明白白写着python-requests/2.xx。
大部分网站无所谓,但有些比较敏感的网站会直接给你返回 403。
怎么解决?加上User-Agent请求头,伪装成浏览器:
importrequests headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'}response=requests.get('https://www.example.com',headers=headers)print(response.status_code)加上之后,从请求头看,你和一个正常的 Chrome 浏览器没区别。
这个User-Agent去哪里找?最简单的办法——打开你的浏览器,百度搜"我的User-Agent",第一个结果就是你自己的,直接复制粘贴用。
七、GET 请求带参数
有时候你需要在 URL 后面加参数,比如搜索的时候:
https://www.example.com/search?q=python&page=1手动拼 URL 也行,但更优雅的写法是用params参数:
importrequests params={'q':'python','page':1}response=requests.get('https://www.example.com/search',params=params)print(response.url)# https://www.example.com/search?q=python&page=1requests会自动帮你把参数拼好、编码好,不用你自己操心特殊字符转义的问题。
八、今天的重点回顾
这一篇内容不多,但都是基础中的基础。记住这几个关键点:
requests.get(url)发 GET 请求,返回一个response对象response.status_code == 200才是成功,其他状态码都要处理response.text拿网页文本,乱码就手动指定encoding- 加
User-Agent请求头,伪装成浏览器,不容易被封 - 参数用
params传,别自己拼 URL
掌握了这些,你已经能拿到任何公开静态网页的源码了。但拿到源码只是第一步——你拿到的是一大坨 HTML,怎么从里面提取出你想要的具体数据呢?
下一篇我们讲BeautifulSoup:怎么从网页里精准提取标题、内容、表格等信息。
本文仅讲解核心思路与关键代码片段,适合零基础学习原理。
完整可运行工程源码、配套测试数据、详细逐行注释、常见报错排错文档已打包成资源。
【资源说明】
- 所有资源仅限个人学习使用,禁止商用、二次倒卖、公开分发
- 包含完整源码 + 测试数据 + 使用文档
- 不含一对一远程调试、环境配置答疑服务
- 适合直接复用、写作业、练项目、做个人作品集
【合规声明】
本项目仅用于公开静态网页、公开学习数据采集练习,禁止用于商业爬取、高频爬取、隐私数据爬取,使用者自行承担使用责任。©️ 梅雅达编程笔记原创 · 首发 CSDN · 转载请注明出处