Http请求协议
该章节作用是帮助开发人员看懂浏览器中开发者工具(快捷键F12)里的各种参数
关键字
关键字 | 说明 |
---|---|
Request URL | 请求的URL地址 |
Request Method | 请求方法get/post |
Status Code | 状态码 |
状态码 | 说明 |
---|---|
200 | 响应成功 |
206 | 视频传输 |
403 | 不允许访问 |
404 | 没有页面 |
500 | 服务器错误 |
关键字 | 说明 |
---|---|
Remote Address | 远端地址 |
Connection | 连接类型 |
Content-Encoding | 数据压缩方式常用压缩算法: Content-Encoding:gzip, Content-Encoding:compress, Content-Encoding:deflate, Content-Encoding:identity , Content-Encoding:br |
Content-Type | 互联网媒体类型 |
互联网媒体类型 | 格式 |
---|---|
text/html | HTML格式 |
text/plain: | 文本格式 |
text/xml: | XML格式 |
image/gif: | gif图片格式 |
image/jpeg: | jpg图片格式 |
image/png: | png图片格式 |
application/xhtml+xml: | XHTML格式 |
application/xml: | XML数据格式 |
application/atom+xml | Atom XML聚合格式 |
application/json | JSON数据格式 |
application/pdf: | pdf格式 |
application/msword: | Word文档格式 |
application/octet-stream | 二进制流数据(例如文件下载) |
application/x-www-form-urlencoded: | 普通表单提交 |
multipart/form-data | 表单文件上传 |
关键字 | 说明 |
– | – |
Accept | 发送端希望接受的数据类型 |
Accept-Encoding | 发送端支持的压缩算法 |
Accept-Language | 发送端支持的语言 |
Cache-Control | 缓存机制 |
Cookie | Cookie |
User-Agent | 用户代理 |
实例
访问https://edu.csdn.net/按F12选择NETWORK刷新页面
左上角的红按钮代表开始记录和停止记录,stop按钮代表清空记录
urllib模块使用案例
作用:模拟浏览器读取在线的html
新建python项目、文件urllib_.py(不要与包名相同。否则会导入本地的py文件)
import urllib.request as ur
ret = ur.urlopen('https://edu.csdn.net/')
# 返回的是HTTPResponse对象
print(ret)
print(type(ret))
# 返回的是整个页面数据
ret = ur.urlopen('https://edu.csdn.net/').read()
print(ret)
# 在项目根路径生成edu.html文件
with open('edu.html','wb') as f:
f.write(ret)
Request对象之Get请求与编码
与第一种相比较,因为封装了headers和data所以更加方便
实例:获取https://edu.csdn.net/网站源代码
新建py项目和py文件
# 导入包
import urllib.request as ur
# 按住ctrl点击Request查看类
request = ur.Request('https://edu.csdn.net/')
# 读取整个页面数据
response = ur.urlopen(request).read()
print(response)
# reques类
class Request:
# url: url地址
# data默认为空是GET请求,如果添加数据会变成POST请求
# headers请求头
def __init__(self, url, data=None, headers={},
origin_req_host=None, unverifiable=False,
method=None):
实例:获取https://edu.csdn.net/网站源代码
(1)分析Url地址
在请求后面指定了utf-8的编码格式和关键词英雄联盟,因为是不加密的明文所以我们知道他是GET请求,接着查看第二页和第三页的url
# 第二页
# 发现英雄联盟四个字变成了乱码
https://tieba.baidu.com/f?kw=%E8%8B%B1%E9%9B%84%E8%81%94%E7%9B%9F&ie=utf-8&pn=50
# 第三页
# 发现英雄联盟四个字变成了乱码
https://tieba.baidu.com/f?kw=%E8%8B%B1%E9%9B%84%E8%81%94%E7%9B%9F&ie=utf-8&pn=100
发现多了个参数pn,这个参数常用于页码,在贴吧中每页递增50,且每页正好50个帖子,按此规律访问一下其他页成功说明推断没有错。
接着研究汉字为什么变成符号,原因是在GET编码中如果有汉字会对其进行url编码成符号,接下来我们解决url汉字编码问题
url汉字编码解码
下载英雄联盟吧首页
实现把英雄联盟首页下载到项目根目录
实例
# 导入编码的包
import urllib.parse as up
# 导入访问网站的包
import urllib.request as ur
data = {
'kw': '英雄联盟',
'ie': 'utf-8',
'pn': '100',
}
# 编码
data_url = up.urlencode(
data
)
# 查看编码后的关键字
print(data_url)
# 解码
ret = up.unquote(data_url)
# 查看解码后的关键字
print(ret)
# 访问百度贴吧对应吧对应页码
request = ur.Request('https://tieba.baidu.com/f?'+ data_url )
# 将Request对象request转变为可读的页面数据
response = ur.urlopen(request).read()
with open('baidu.html', 'wb') as f:
f.write(response)
下载任意吧的首页
对kw单独抽离出来,可以爬取其他吧
import urllib.parse as up
import urllib.request as ur
# 单独抽离kw可以输入任意关键字(吧名)
kw = '美剧'
data = {
'kw': kw,
'ie': 'utf-8',
'pn': '100',
}
data_url = up.urlencode(
data
)
# 访问百度贴吧对应吧对应页码,将生成的html可以自动命名为爬取的网页
request = ur.Request('https://tieba.baidu.com/f?'+ data_url )
# 将HttpResponse对象request转变为可读的页面数据
response = ur.urlopen(request).read()
with open('%s.html' % kw, 'wb') as f:
f.write(response)
利用浏览器下载html
以谷歌浏览器为例打开页面后工具栏>更多工具>网页另存为即可;
谷歌浏览器快捷键ctrl+s
Request对象之HttpPost请求案例分析
百度翻译网站的爬取
- 打开百度翻译网站https://fanyi.baidu.com/
- 打开开发者工具F12并清空记录
- 搜索python查看开发者工具返回的信息(sug)
因为我们没有输入完就会右侧翻译结果栏就会有翻译信息,说明输入和翻译是实时同步的,所以会有多个sug文件,其中的preview里的k:会分别等于h、ha、hap到happy,根据你输入速度的不同会产生<=len(‘happy’)个sug文件,那我们只需要看最后一个即可,如下图所示
- 点击header可以看到返回的结果是一个json文件,那么我们一会用python处理的时候需要进行编码解码
- 根据http请求协议的知识即可分析他的请求网址和请求方式
- 在header最下面有一个form表单,我们可以知道传递的参数名称和内容
代码实现 - 新建项目及baidufanyi.py
import urllib.parse as up
import urllib.request as ur
import json
word = input('请输入要翻译的英文')
# url编码
data = {
'kw': word,
}
data_url = up.urlencode(data)
request = ur.Request(
url='https://fanyi.baidu.com/sug',
data=data_url.encode('utf-8'),
)
# 获得一个字节类型的response对象json
response = ur.urlopen(request).read()
# print(response)
# 把json对象转化为python对象
ret = json.loads(response)
# 查看python对象的格式
# print(ret)
# 根据格式索引取出需要的数据
translate = ret['data'][0]['v']
print(translate)
Request对象之Header伪装策略
deader cookie模拟登陆 useragent模拟浏览器的访问
import urllib.request as ur
import user_agent
# import json
request = ur.Request(
url='https://edu.csdn.net/',
headers={
'User-Agent': user_agent.get_user_agent_pc()
}
)
response = url.urlopen(request).read