要去爬取网页的数据, 还要调用 API 的接口, 对此能够堪称“神器”的库是存在的。其特点是一行代码就能够发起请求, 新手也能够快速上手。在今天整理出了 14 个实操案例, 这些案例覆盖了从基础到实战的全方面内容, 代码是直接复制就可以使用的, 所以要赶紧将其收藏起来!
1. 先装库:30秒搞定安装
使用之前, 要先保证它在你的电脑当中居住安顿下来。开启调出命令行的视窗界面, 把下面这一排排的代码进行复制, 按下回车键就可以了:
pip
(提示: 假若是提示“pip不是之内命令”的情形下, 要牢记要率先去核查是不是已添加进到环境变量之中哦~)
2. 最基础的GET请求:像浏览器一样“访问网页”
比如想看看的API长啥样,用GET请求一调就知道:
# 发送请求(相当于在浏览器输入网址)
= .get(';)
# 查看“访问结果”:状态码200=成功(就像电话打通了)
# 看内容:文本格式或JSON格式(API接口常用)
print("文本内容:")
print(.text) # 适合看网页源码
print("JSON数据:")
打印那点 JSON 括号内的内容, 这个操作适宜于剖析接口传送回来的结构规整的数据。
对于新手而言必须要看, 这可是构成所有操作的根基所在, 要记好, 只要是.get(网址)这种形式就能够去发送请求啦~
3. 带参数的GET请求:比如搜“仓库”
想在上搜相关的仓库?用传参数,就像在网页上填搜索框:
# 定义参数:q=搜索关键词,page=页码,=每页数量
= {
“q”之处为空字符串, 用于搜索空字符串。
'page': 1, # 第1页
'': 10 # 每页10条
# 发请求时带上参数(不用手动拼网址,超方便!)
= .get(';, =)
# 解析结果:看看有多少仓库,名字叫啥
data = .json()
print(f"找到{data
''
}个仓库")
for repo in data
'items'
print(repo
'name'
, repo
''
) # 输出仓库名和链接
具备实用性的场景为, 去实施爬取那种带有搜索条件的页面, 像豆瓣电影、做电商商品搜索时所涉及的状况, 均能够运用这一方法~
4. POST请求:提交表单数据(比如模拟登录)
在登录网站之际, 以及提交表单之时, 常常会运用POST请求。举例来说, 针对某一试用接口去发表单数据:
# 表单数据:就像在网页上填用户名和密码
data = {
'': '',
'': ''
# 发POST请求(把数据“递”给服务器)
= .post(';, data=data)
# 看看服务器收到了啥(测试接口会原封不动返回数据)
print(.json())
关键的区别在于, GET所代表的含义是“拿数据”, 而POST所代表的含义则是“发数据”, 此外, 登录以及注册这些行为基本上都采用POST~
5. POST发JSON数据:给接口传结构化信息
若接口规定要以JSON这种格式去传递数据, 现今好多API皆是如此一番状况, 那么直接采用json参数会显得更为便利:
# JSON数据:比如用户信息
= {
'name': '张三',
'age': 25,
'city': '上海'
# 直接传json参数,不用手动转格式
= .post(';, json=)
# 服务器返回的内容里,就能看到我们发的JSON
print(.json())
一小点诀窍, 采用json=要比data=json.dumps()更为简便, 能够少写一行代码呦~
6. 设置请求头:假装自己是“浏览器”
有些网站, 会对”程序“所发出的请求予以拒绝, 在这样的时候, 添加一个请求头, 以此告知服务器, ”我是浏览器“。
= {
进行假装, 使其成为浏览器, 任意搜寻一个User-Agent填入其中就可以了。
‘User - Agent’, 为‘/5.0 ( NT 10.0; Win64; x64) /91.0.4472.124’。
要是存在登录需求, 在此处能够放置令牌, 比如说那种形式如“: 你的令牌”这般的东西。
# 带着头信息发请求
= .get(';, =)
如果你在进行这样的操作时 出现了200 那就意味着成功 要是出现403 那就有可能是被拒绝了, 考虑换个User-Agent再试试 此时打印输出的是点 这一情况。
避坑点:爬网页时遇到403错误,先检查是不是没加请求头~
7. 处理超时:别让程序“卡”死
倘若网站有半天未能呈现反应, 程序届时会始终处于等待状态么? 添加一个超时所需的时间, 一旦超过此时间便予以“放弃”:
try:
# 设置3秒超时:3秒内没反应就报错
= .get(';, =3)
print(.)
..:
print("超时啦!这个网站太慢了~")
as e:
print(f"其他错误:{e}")
必加参数:写爬虫一定要加,不然程序可能无限等待~
8. 下载图片/文件:把网上的资源存到本地
看到好看的图片想下载?用轻松搞定,还能断点续传:
# 比如下载的logo
url = ';
# 用=True:边下载边存,适合大文件
= .get(url, =True)
if . == 200:
开启文件, 运用二进制进行写入操作, 其中图片、视频均采用'wb'。
以二进制可写模式, 即使用 'wb', 打开名为 '-logo.png' 的文件, 将其作为文件对象 f 来处理。
# 每次读1024字节(1KB),一点一点存
for chunk in .(1024):
f.write(chunk)
print("下载完成!图片在当前文件夹里~")
else:
print("下载失败,可能链接错了")
扩展:把url换成视频、文档链接,就能下载其他文件~
9. 用保持登录状态:模拟“登录后操作”
会存在这样一些网站, 其内容需登录之后方可查看, 像个人中心组的某些内容便是如此, 并且该网站具备能够记住登录状态的功能。
# 创建一个对象(相当于一个浏览器窗口,会记住)
= .()
# 第一步:登录(比如用POST提交账号密码)
你的内容似乎是一段代码相关且不是规范的中文表述, 确实不好按照要求进行有意义的改写, 可以提供更合适的中文句子让我来进行改写操作。
.post(';, data=) # 模拟登录
# 第二步:访问需要登录的页面(会自动带登录信息)
= .get(';)
print("当前的:")
打印(点JSON括号), 能看到登录之后的, 表明保持状态达成成功。
场景:爬需要登录的网站(比如论坛、个人博客)必须用~
10. 处理重定向:跟着网站“跳”
访问某些网址时, 其会发生自动跳转至另外一个页面的情况, 举例说明, 像是htpp跳转至https这种情况, 并且默认状态下是会跟随进行跳转的。
# 这个网址会自动跳1次
= .get(';)
打印, (输出)“最终状态码: ”。, (停顿)# 200(此为跳完之后所得到的结果)。
打印(“跳转历史: ”, .), # 此操作能够看见是从哪一个网址跳转而来的。
# 如果不想让它跳:=False
= .get(';, =False)
打印("不跳转的状态码: "), # 302(表明要跳转)。
小知识:状态码301=永久跳转,302=临时跳转~
11. 处理认证:访问需要账号密码的接口
有些API, 其访问需要输入账号密码才行, 像公司内部那些接口就是如此, 通过auth参数来将此问题解决:
# 比如这个测试接口,账号user,密码
url = ';
# 直接传(账号, 密码)就行,不用手动处理加密
等价于.get(, url, 的认证为用户名是'user', 密码为空)(。)。
打印(点), # 二百等于认证成功, 四百零一等于账号密码错了。
print(.json()) # 成功的话会返回信息
12. 异常处理:让程序更“抗造”
写代码时难免出错,用try-捕获错误,程序不会直接崩溃:
from . , ,
try:
= .get('
;) # 这个接口会返回404
.() # 主动抛出错误:4xx/5xx状态码会报错
as e:
print(f"网页发生错误: {e}(举例来说, 404意味着页面不存在, 500表示服务器崩溃了)".)。
:
print("连不上网站,可能网址错了或没网~")
:
print("超时了,网站没反应~")
as e:
print(f"其他意外:{e}")
else:
# 没出错的话,就处理数据
print("请求成功!内容:", .text)
好习惯, 正式写代码时, 必须加上对异常情况的应对处理,否则只因一点微小的错误, 就会导致之前所做的全部努力白费, 化为乌有~
13. 使用代理:换个“身份”访问
有些网站, 会对频繁访问加以限制, 借助代理, 能够更换一个IP, 进而继续进行爬取操作, 请注意要合法使用呀:
# 代理地址(这里是示例,实际需要找可用的代理)
= {
那里出现指代的“http”, 其对应的内容是“http://代理IP:端口”。
“https”, 其对应的是“http://代理给出之IP:按照规定划分的位置数量”。
try:
# 用代理访问,看看对外显示的IP
= .get(';, =)
print("当前显示的IP:", .json())
..:
print("代理用不了,换一个试试~")
提示一下, 免费的代理存在不稳定的境况, 对于重要的场景而言, 推荐使用付费后的代理, 并且要遵循网站所制定的规则哦~
14. 实战:查天气!调用公开API
直至末尾呈现一个具备实用性的: 借由天气应用程序编程接口选取任意地域的气象温度, 将代码予以修改便能够查询你所处居所的天气状况~
def (city, ):
# 天气API的地址(这里用的是,需要自己注册拿)
= ""
= {
‘q’: 城市, # 城市的名称, 像是“北京”“”中的那种城市名。
'appid': , # 换成你自己的
“单位”: “”, 温度的单位, 其中摄氏度, 默认情况下是开尔文。
try:
= .get(, =)
.() # 检查是否出错
= .json()
# 提取有用的信息
print(f"\n{city}的天气:")
print(f"温度:{
'main'
'temp'
}°C")
print(f"状况:{
''
''
}(比如晴、多云)")
print(f"湿度:{
'main'
''
}%")
print(f"风速:{
'wind'
'speed'
}米/秒")
as e:
打印(格式化输出("查不了: {e}(可能错了, 或城市名不对)"))。
# 用法:换成你自己的(去官网注册免费获取)
= '你的'
('北京', ) # 查北京的天气
以双引号为空, 括号内为空的形式, 查询名叫广州的城市, 其天气状况, 英文表达也可以的做法来进行。
动手试试:注册API时记得选免费套餐,足够个人用了~
那些案例所覆盖的, 是百分之九十的常用场景, 新手能够从“基础GET”开始练起, 接着练“带参数请求”,随后逐步尝试实战案例。要记住: 去爬取数据的时候, 务必要遵循网站的.txt规则, 千万别进行频繁请求, (添加一个时间间隔time.sleep(1)), 一定要合法合规, 这是最为重要的~
#基础##每天学##打卡##从今天起记录我的202#