Python3:urllib模块的使用
2024-09-06 10:45:19
Python3:urllib模块的使用
1.基本方法
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url: 需要打开的网址
data:Post提交的数据
timeout:设置网站的访问超时时间
直接用urllib.request模块的urlopen()获取页面,page的数据格式为bytes类型,需要decode*()解码,转换成str类型。
from urllib import request
response = request.urlopen(r'http://python.org/')
page = response.read()
page = page.decode('utf-8')
urlopen返回对象提供方法: read() , readline() ,readlines() , fileno() , close() :对HTTPResponse类型数据进行操作 info():返回HTTPMessage对象,表示远程服务器返回的头信息
getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
geturl():返回请求的url
2.使用Request
urllib.request.Request(url, data=None, headers={}, method=None)
使用request()来包装请求,再通过urlopen()获取页面。
url = r'http://www.lagou.com/zhaopin/Python/?labelWords=label'
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}
req = request.Request(url, headers=headers)
page = request.urlopen(req).read()
page = page.decode('utf-8')
用来包装头部的数据:
User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
Connection:表示连接状态,记录Session的状态。
3.Post数据
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post。 from urllib import request, parse
url = r'http://www.lagou.com/jobs/positionAjax.json?'
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
data = parse.urlencode(data).encode('utf-8')
req = request.Request(url, headers=headers, data=data)
page = request.urlopen(req).read()
page = page.decode('utf-8')
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
urlencode()主要作用就是将url附上要提交的数据。
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
data = parse.urlencode(data).encode('utf-8')
经过urlencode()转换后的data数据为?first=true?pn=1?kd=Python,最后提交的url为:
http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python
Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码
当然,也可以把data的数据封装在urlopen()参数中:
page = request.urlopen(req, data=data).read()
在这里就要说点实际应用的事儿了:
从json中取出的数据类型和数据如下:
<class 'dict'> {'install': {'install_date': '2018/09/26', 'install_result': 'success'}}
经过转码:company_data = parse.urlencode(data).encode('utf-8')
变成这样:b'install=%7B%27install_date%27%3A+%272018%2F09%2F26%27%2C+%27install_result%27%3A+%27success%27%7D'
服务器端接收数据:
data = request.POST.get("company_data")
数据类型、数据分别如下:
<class 'str'> {"install": {"install_result": "success", "install_date": "2018/09/26"}}
我想要的字典变成了字符串,这就得找解决办法(用json去解决问题):
客户端:
import json
with open('1.json', 'r') as f:
data = json.load(f) data = {"company_data": json.dumps(data)} # urlopen()的data参数默认为None,当data参数不为空的时候,urlopen()提交方式为Post
from urllib import request, parse
url = r'http://192.168.165.4:8000/show/report/'
company_data = parse.urlencode(data).encode('utf-8')
req = request.Request(url, data=company_data)
print(company_data)
page = request.urlopen(req).read()
page = page.decode('utf-8')
服务器端:
@csrf_exempt
def receive_data(request):
data = request.POST.get("company_data")
if data:
try:
data = json.loads(data)
print("企业数据", type(data), data)
return HttpResponse(data)
except ValueError as e:
print(str(e))
else:
return HttpResponse("no data")
4.处理异常
from urllib import request, parse
def get_page(url):
headers = {
'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ''
r'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
'Referer': r'http://www.lagou.com/zhaopin/Python/?labelWords=label',
'Connection': 'keep-alive'
}
data = {
'first': 'true',
'pn': ,
'kd': 'Python'
}
data = parse.urlencode(data).encode('utf-8')
req = request.Request(url, headers=headers)
try:
page = request.urlopen(req, data=data).read()
page = page.decode('utf-8')
except request.HTTPError as e:
print(e.code())
print(e.read().decode('utf-8'))
return page
get_page
5.使用代理
urllib.request.ProxyHandler(proxies=None)
当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。
data = {
'first': 'true',
'pn': 1,
'kd': 'Python'
}
proxy = request.ProxyHandler({'http': '5.22.195.215:80'}) # 设置proxy
opener = request.build_opener(proxy) # 挂载opener
request.install_opener(opener) # 安装opener
data = parse.urlencode(data).encode('utf-8')
page = opener.open(url, data).read()
page = page.decode('utf-8')
python3-urllib参考:https://www.cnblogs.com/Lands-ljk/p/5447127.html
最新文章
- Android 自定义 attr
- 2016总结&;2017计划
- 使用gulp添加版本号
- linux权限管理_文件特殊权限
- Apache mod_jk
- 代码编译方式 ant +ivy
- git 创建一个新分支,并将一个分支内容复制给创建的新分支
- HDU 4391 - Paint The Wall - 分块哈希入门
- attr()和prop()的区别
- OpenGL红宝书学习笔记(1)
- c 整数的逆序输出 输入3,2就算 2+22+222的结果
- openstack私有云布署实践【7.1 keystone + memcache (科兴环境)】
- js中两个感叹号的原理与用法分析(转载记录没找到原帖)
- JS 的NULL undefined 空
- JavaScript动画1-速度动画
- 一位资深程序员大牛给予Java提升技术的学习路线建议
- 想做iPhoneX抢购活动?压测大师先教你优化网站后台
- web前端面试官挖的那些坑(js)
- angular6 input节流
- 二十五、过滤器Filter,监听器Listener,拦截器Interceptor的区别
热门文章
- 毛毛虫组【Beta】Scrum Meeting 3
- Bootsrtap 面包屑导航(Breadcrums)
- nib、xib、storyboard(故事板)
- IP数据包的校验和算法
- IntelliJ IDEA 中自定义模板代码的缩写
- linux-MySQL基本指令-增删改查
- Linux内核中的段属性
- Verilog学习笔记基本语法篇(五)&#183;&#183;&#183;&#183;&#183;&#183;&#183;&#183; 条件语句
- kendo Grid 列添加自定义模板
- JMeter安装JSON Path Extractor插件