当前位置:首页>python>Python 爬虫入门: GET 与 POST 请求

Python 爬虫入门: GET 与 POST 请求

  • 2026-09-10 19:05:27
Python 爬虫入门: GET 与 POST 请求
我们来拆解典型的 Python 爬虫入门代码。这段代码涵盖了 Python 网络请求的两个主流库:标准库 urllib 和第三方库 requests,并且演示了 GET 请求、POST 请求、请求头伪装、参数传递、JSON 解析、文件保存 等核心知识点。
from encodings import utf_8from urllib.request import urlopenurl = "https://www.baidu.com"resp = urlopen(url)with open("baidu.html",mode="w",encoding="utf-8") as f:     f.write(resp.read().decode())     print("over")
上面是一段简单的爬虫代码,我们现在来逐步拆解:
from urllib.request import urlopen
  • urllib.request 是 Python 标准库中用于处理 URL 请求的模块,不需要额外安装。

  • urlopen 函数用于打开一个 URL,返回一个响应对象(HTTPResponse)。

  • 这是最基础的网络请求方式,适合简单场景。

url = "https://www.baidu.com"
  • 字符串变量,存放要访问的网址。

resp = urlopen(url)
  • urlopen 向百度服务器发送一个 GET 请求。

  • 返回的 resp 是一个 HTTPResponse 对象,可以理解为服务器返回的“响应包”,里面包含状态码、响应头、响应体等信息。

  • 注意:urlopen 默认的 User-Agent 是 Python-urllib/3.x,很多网站会识别出这是爬虫并拒绝访问。百度首页通常可以访问,但有些网站会返回 403。

with open("baidu.html", mode="w", encoding="utf-8") as f:
  • 使用 with 语句打开(或创建)当前目录下的 baidu.html 文件。

  • mode="w":以写入模式打开,如果文件不存在则创建,存在则清空内容。

  • encoding="utf-8":指定写入文件时使用 UTF-8 编码,避免中文乱码。

  • as f:文件对象赋值给变量 f,with 块结束后自动关闭文件。

print("over")
  • 写入完成后输出提示,表示任务结束。

运行结果

执行后,当前目录下会生成一个 baidu.html 文件,打开后可以看到百度首页的 HTML 源代码(可能会因为缺少样式而显示不完整,但源代码是完整的)。控制台输出 over。


我们接下来再看一段代码:

import requestsquery = input("输入你要搜索的内容:")url = f"https://cn.bing.com/search?q={query}"headers = {    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"}resp = requests.get(url, headers=headers)print(resp)print(resp.text)

现在我们逐步解释代码:

import requests
  • requests 是第三方库,需要先安装:pip install requests。

  • 它封装了底层的网络操作,使用起来比 urllib 更简洁、更人性化。

query = input("输入你要搜索的内容:")
  • input 函数接收用户从键盘输入的内容,返回字符串,赋值给 query。

url = f"https://cn.bing.com/search?q={query}"
  • 使用 f-string 把用户输入的关键词拼接到必应搜索的 URL 中。

  • ?q= 是查询字符串,q 是参数名,代表搜索关键词。

headers = {    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"}
  • 字典形式存储 HTTP 请求头字段。

  • User-Agent(不区分大小写,这里写成了小写 user-agent,requests 会自动处理)告诉服务器客户端的信息:使用的是 Windows 10 的 Edge 浏览器。

  • 伪装成浏览器可以降低被服务器识别为爬虫的概率。

resp = requests.get(url, headers=headers)
  • requests.get 发送 GET 请求,返回一个 Response 对象 resp。

  • headers 参数接收字典,设置请求头。

  • 请求的完整 URL 就是拼接后的字符串。

print(resp)
  • 直接打印 resp,输出的是响应状态码,例如 <Response [200]>。200 表示请求成功。

print(resp.text)
  • resp.text 返回响应体的字符串形式。

  • requests 会根据响应头中的编码自动解码(默认猜测或从 Content-Type 中获取),通常能正确处理中文。

核心知识点

  1. GET 请求:参数拼接在 URL 中,使用 requests.get(url, headers=headers)。

  2. 请求头伪装:通过 User-Agent 模拟浏览器。

  3. 响应对象:resp 包含状态码、响应头、响应体等,resp.text 获取字符串,resp.content 获取 bytes。

运行结果

用户输入“Python爬虫”,程序会请求必应搜索,然后打印出响应状态码和搜索结果的 HTML 源代码。控制台会输出很多 HTML 代码。

例如:在终端中输入123,就会返回状态码200,翻找源代码就会找到与123相关的内容。


接下来我们来看一下如何用python调用百度翻译:
import requestss = input("请输入你要翻译的单词:")dat = {    "kw": s}url = "https://fanyi.baidu.com/sug"resp = requests.post(url, data=dat)print(resp.json())
我们粗略解释一下代码:
dat = {    "kw": s}
  • 创建一个字典 dat,键 "kw" 是百度翻译 sug 接口要求的参数名,值 s 是用户输入的单词。

  • 这个字典将作为 POST 请求的 表单数据(data)发送。

url = "https://fanyi.baidu.com/sug"
  • 百度翻译的“联想建议”接口地址。当你在百度翻译输入框输入单词时,它会返回联想词列表。

resp = requests.post(url, data=dat)
  • requests.post 发送 POST 请求。

  • data 参数接收字典,requests 会将其编码为 application/x-www-form-urlencoded 格式,放在请求体中。

  • 返回的 resp 是 Response 对象。

print(resp.json())
  • resp.json() 将响应内容解析为 Python 字典或列表。

核心知识点

  1. POST 请求:使用 requests.post(url, data=data),数据放在请求体中,适合提交表单。

  2. 表单数据与 JSON 数据的区别:

    • data= 参数用于发送表单数据(Content-Type: application/x-www-form-urlencoded)。

    • 如果要发送 JSON 数据,应该使用 json= 参数(Content-Type: application/json)。

    • 这里百度翻译接口期望的是表单数据,所以用 data=。

  3. JSON 解析:resp.json() 自动将 JSON 字符串转为 Python 对象,非常方便。

运行结果

用户输入 apple,程序会输出类似下面的 JSON 数据:


接下来我们来看看如何爬取豆瓣榜单:

import requestsparam = {    "type": "24",    "interval_id": "100:90",    "action": "",    "start": "0",    "limit": "20"}headers = {    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36 Edg/138.0.0.0"}url = "https://movie.douban.com/typerank"resp = requests.get(url=url, params=param, headers=headers)resp.encoding = "utf-8"print(resp.text)
param = {    "type": "24",           # 电影类型    "interval_id": "100:90", # 评分区间    "action": "",           # 动作    "start": "0",           # 起始位置    "limit": "20"           # 每页数量}
  • 这是一个字典,包含了请求豆瓣电影排行榜所需的多个查询参数。

  • type:电影类型,24 可能代表“喜剧”等。

  • interval_id:评分区间,100:90 表示 9.0 到 10.0 分。

  • action:空字符串,可能是一个占位参数。

  • start:起始位置,0 表示从第一条开始。

  • limit:每页数量,20 表示获取 20 条。

  • 这些参数会被拼接到 URL 后面,形成查询字符串。

resp = requests.get(url=url, params=param, headers=headers)
  • 使用 params 参数传递字典,requests 会自动将其编码为查询字符串,并拼接到 URL 后面。

resp.encoding = "utf-8"
  • 手动将 resp.encoding 设置为 "utf-8",强制使用 UTF-8 解码。

  • 这行代码是在读取 resp.text 之前设置的,所以能确保正确解码。

核心知识点

  1. 多个查询参数:使用 params 字典传递,避免手动拼接 URL,自动处理 URL 编码。

  2. 手动设置编码:当自动解码不正确时,可以通过 resp.encoding 属性手动指定编码。

  3. 请求头伪装:同样使用 User-Agent 模拟浏览器。

运行结果

程序会打印豆瓣电影排行榜页面的 HTML 源代码(部分截图)。由于豆瓣有反爬机制,可能返回 418 或需要验证码,或者返回的 HTML 中数据是动态加载的,直接打印可能看不到电影列表。但作为教学示例,它演示了多参数 GET 请求的写法。

四段代码对比总结

代码段库请求类型参数传递方式主要知识点
第一段urllibGETURL 直接拼接urlopen、read、decode、文件保存
第二段requestsGETURL 拼接requests.get、headers、resp.text
第三段requestsPOSTdata 表单requests.post、data、resp.json
第四段requestsGETparams 字典params、resp.encoding
  1. 库的选择

    • urllib 是 Python 标准库,无需安装,但 API 较繁琐,适合了解底层原理。

    • requests 是第三方库,简洁易用,功能强大,是实际爬虫开发的首选。

  2. GET 与 POST 的区别

    • GET:参数放在 URL 后面,适合获取数据,长度有限。

    • POST:参数放在请求体中,适合提交数据,更安全,长度无限制。

    • 在 requests 中,GET 用 params 传参,POST 用 data(表单)或 json(JSON 数据)传参。

  3. 请求头伪装

    • 通过设置 User-Agent 模拟浏览器,降低被服务器拒绝的概率。

    • 常见写法:复制浏览器开发者工具中的 UA 字符串。

  4. 响应处理

    • resp.read()(urllib)返回 bytes,需 .decode() 转为字符串。

    • resp.text(requests)自动解码为字符串,必要时可手动设置 resp.encoding。

    • resp.json() 直接解析 JSON 响应为 Python 字典/列表。

  5. 参数传递

    • 推荐使用字典通过 params(GET)或 data(POST)传递,避免手动拼接 URL 导致编码问题。


注意:
  • 遵守目标网站的 robots.txt 协议。

  • 控制请求频率,避免对服务器造成压力。

  • 仅用于学习目的,不爬取敏感或隐私数据。

  • 请不要盲目、无节制爬取网站内容,遵守相关法律法规

最新文章

随机文章