查找本地 python 解析器的 路径
- 命令:
win + R
启动cmd, 在cmd中,执行where python
, 可查看python环境所在的路径
这是我的python环境所在的路径
E:\Python 3.7\python.exe
使用urllib爬取网页图片
# 1.导入 urllib 中的 request 包
from urllib import request
# 2.下载图片
request.urlretrieve('https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png', 'bd.png') # 图片被保存在当前工作目录下
'''
request.urlretrieve(url, img_name)
url: 表示网页图片的地址
img_name: 表示保存图片的名称,包括保存的扩展名
'''
使用requests爬虫
requests是第三方库,所以要手动安装
- 命令
pip install requests -i https://pypi.douban.com/simple
案例1: get请求
### 爬取百度搜索python关键字的页面内容
# 1.安装 requests 包 : pip install requests -i https://pypi.douban.com/simple
# 2.导入 requests 包
import requests
# 3.模拟浏览器的请求头,发送请求数据
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 4.发送get请求,用get方法请求百度的页面
response = requests.get(url='https://www.baidu.com/s?wd=python', headers=headers)
# 5.获取爬取的内容
print(response.text) # response.text返回响应的整个页面内容,即获取网页源代码
# 6.把爬取到的内容保存到文件
with open('baidu.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
response.text与response.content的区别:
response.text 返回的是源代码的文本形式(str)
response.content 返回的是源代码的二进制形式(bites)
response.content.decode() 解码后返回的是源代码的文本形式---与查看网页源码一致
注意
(1)
# 5.获取爬取的内容
print(response.text) # response.text返回响应的整个页面内容,即获取网页源代码
# 6.把爬取到的内容保存到文件
## 使用respons.text获取网页内容时,选择这种方式保存文件
with open('baidu.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
(2)
# 5.获取爬取的内容
print(response.content.decode()) # 等价于response.text , 解码后返回的是源代码的文本形式---与查看网页源码一致
# 6.把爬取到的内容保存到文件
## 使用response.content.decode()获取网页内容时,选择这种方式保存文件
with open('baidu2.html', 'wb') as fp: # wb:以二进制形式写入
fp.write(response.content)
get请求中响应对象的属性与方法:
- response.url : 获取请求的url
- response.encoding : 返回网页的编码格式(response.encoding = ‘utf-8’)
- response.status_code : 返回网页状态码
- response.headers : 获取响应头的信息 , 以dict形式返回
- response.text : 获取网页源代码 , 以str形式返回
- response.content : 获取网页内容 , 以bytes形式返回
- response.content.decode() : 获取网页源代码 , 以str形式返回
- response.json() : 获取json数据 , 以dict或list形式返回
- response.request.headers : 查看请求头信息
案例2: post请求
### 模拟百度翻译
# 1.导包
import requests
import json
# 2.模拟浏览器的请求头,发送请求数据
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
# 3.通过字典形式模拟post数据
data = {
'kw':'job'
}
# 4.发送post请求,请求百度翻译的页面
response = requests.post(url='https://fanyi.baidu.com/sug', headers=headers, data=data)
# 5.获取网页数据
print(response.json()) # 获取网页数据,以字典形式返回
'''
结果:
{'errno': 0, 'data': [{'k': 'job', 'v': 'n. 职业; (一件)工作; 职责; (作为一个单元处理的)作业 vt. 承包; 代客买卖 vi. '}, {'k': 'Jobo', 'v': '[地名] [厄瓜多尔] 霍沃'}, {'k': 'jobs', 'v': 'n. 职业; (一件)工作( job的名词复数 ); 职责; (作为一个单元处理的)作业'}, {'k': 'Jobs', 'v': '[人名] 乔布斯'}, {'k': 'JOBS', 'v': 'abbr. Job Opportunities and Basic Skills 工作环境与基本技能'}]}
'''
注意
# 5.获取网页数据
(1)
print(response.text) # 直接使用该方法不可行
'''
结果: 由此可以看到, 该数据是字典类型的, 所以,我们必须获取 json数据 -- response.json()会以dict或list形式返回数据
{"errno":0,"data":[{"k":"job","v":"n. \u804c\u4e1a; \uff08\u4e00\u4ef6\uff09\u5de5\u4f5c; \u804c\u8d23; \uff08\u4f5c\u4e3a\u4e00\u4e2a\u5355\u5143\u5904\u7406\u7684\uff09\u4f5c\u4e1a vt. \u627f\u5305; \u4ee3\u5ba2\u4e70\u5356 vi. "},{"k":"Jobo","v":"[\u5730\u540d] [\u5384\u74dc\u591a\u5c14] \u970d\u6c83"},{"k":"jobs","v":"n. \u804c\u4e1a; \uff08\u4e00\u4ef6\uff09\u5de5\u4f5c( job\u7684\u540d\u8bcd\u590d\u6570 ); \u804c\u8d23; \uff08\u4f5c\u4e3a\u4e00\u4e2a\u5355\u5143\u5904\u7406\u7684\uff09\u4f5c\u4e1a"},{"k":"Jobs","v":"[\u4eba\u540d] \u4e54\u5e03\u65af"},{"k":"JOBS","v":"abbr. Job Opportunities and Basic Skills \u5de5\u4f5c\u73af\u5883\u4e0e\u57fa\u672c\u6280\u80fd"}]}
'''
(2)
print(json.loads(response.text)) # 将文本信息转换为字典信息 效果==respons.json()
'''
结果:
{'errno': 0, 'data': [{'k': 'job', 'v': 'n. 职业; (一件)工作; 职责; (作为一个单元处理的)作业 vt. 承包; 代客买卖 vi. '}, {'k': 'Jobo', 'v': '[地名] [厄瓜多尔] 霍沃'}, {'k': 'jobs', 'v': 'n. 职业; (一件)工作( job的名词复数 ); 职责; (作为一个单元处理的)作业'}, {'k': 'Jobs', 'v': '[人名] 乔布斯'}, {'k': 'JOBS', 'v': 'abbr. Job Opportunities and Basic Skills 工作环境与基本技能'}]}
'''
(3)
print(response.json()) # 获取网页数据,以字典形式返回 效果==json.loads(respons.text)
'''
结果:
{'errno': 0, 'data': [{'k': 'job', 'v': 'n. 职业; (一件)工作; 职责; (作为一个单元处理的)作业 vt. 承包; 代客买卖 vi. '}, {'k': 'Jobo', 'v': '[地名] [厄瓜多尔] 霍沃'}, {'k': 'jobs', 'v': 'n. 职业; (一件)工作( job的名词复数 ); 职责; (作为一个单元处理的)作业'}, {'k': 'Jobs', 'v': '[人名] 乔布斯'}, {'k': 'JOBS', 'v': 'abbr. Job Opportunities and Basic Skills 工作环境与基本技能'}]}
'''