urllib模块使用案例

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/htmlHTML格式
text/plain:文本格式
text/xml:XML格式
image/gif:gif图片格式
image/jpeg:jpg图片格式
image/png:png图片格式
application/xhtml+xml:XHTML格式
application/xml:XML数据格式
application/atom+xmlAtom XML聚合格式
application/jsonJSON数据格式
application/pdf:pdf格式
application/msword:Word文档格式
application/octet-stream二进制流数据(例如文件下载)
application/x-www-form-urlencoded:普通表单提交
multipart/form-data表单文件上传
关键字说明
Accept发送端希望接受的数据类型
Accept-Encoding发送端支持的压缩算法
Accept-Language发送端支持的语言
Cache-Control缓存机制
CookieCookie
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文件,那我们只需要看最后一个即可,如下图所示
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值