urllib笔记
在Python 3中,urllib2被合并到了urllib中,叫做urllib.request 和 urllib.error 。
urllib整个模块分为urllib.request, urllib.parse, urllib.error。 HTTP 请求方法:
根据 HTTP 标准,HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。 1 GET 请求指定的页面信息,并返回实体主体。(从服务器获取请求)
2 HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。(向服务器发送数据)
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 url详解:
URI:统一资源标识符(Uniform Resource Identifiers),用来传输数据和建立连接。
URL:统一资源定位符(Uniform Resource Locator).
URL的一般格式为(带方括号[]的为可选项):protocol :// hostname[:port] / path / [;parameters][?query]#fragment
1、scheme(协议):指定使用的传输协议, 最常用的是HTTP协议,它也是目前WWW中应用最广的协议。
file 资源是本地计算机上的文件。格式file://
ftp 通过 FTP访问资源。格式 FTP://
gopher 通过 Gopher 协议访问该资源。
http 通过 HTTP 访问该资源。 格式 HTTP://
https 通过安全的 HTTPS 访问该资源。 格式 target=_blank>HTTPS:// 2、host(主机名,域名):是指存放资源的服务器的域名系统 (DNS) 主机名或 IP 地址。
3、port(端口号):整数,可选,浏览器默认使用80端口
4、path(路径):由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址
5、parameters(参数):这是用于指定特殊参数的可选项。
6、query-string(查询字符串):可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。
7、anchor(锚点):后台一般不用管,前端用来做页面定位的 请求头常见参数: 在http协议中,向服务器发送一个请求,数据分为三部分,第一个是把数据放在url中,第二个是把数据放在body中(在post请求中),第三个教是把数据放在head中,这里介绍在网络爬虫中经常会用到的一些请求头梦数:
1. User-Agent:浏览器名称。
这个在网爬虫中经常会被使用到。请求一个网页的时候,服务器通过这个参数就可以知道这个请求是由哪种刘览器发送的。如果我们是通过是虫发送请求,那么我们的User-Agent就是pyton,这对于那些有反建虫机制的网站来说,可以轻易的产断你这个请求是爬虫。因此我们要经常设置这个值为一些浏览器的值,来伪装我们的爬虫。
2. Referer: 表明当前这个请求是从哪个url过来的。这个一般也可以用来做反爬虫技术。如果不是从指定页面过来的,那么就不做相关的响应。
3.Cookie: http协议是无状态的。 也就是同一个人发送了两次请求,服务器没有能力知道这两个请宋是否来自同个人。因此这时候款用cookie来做标识。一般如果想要做登录后才能访问的阿站,那么教需要发送cookie信息了。 HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。
它由 RFC 2616 规范定义的,并得到RFC 2518、RFC 2817、RFC 2295、RFC 2774、RFC 4918等规范扩展。
1xx 消息
2xx 成功
3xx 重定向
4xx 请求错误
5xx 6xx 服务器出错
(常见状态码:200,301,302,400,403,500)
1开头的http状态码
表示临时响应并需要请求者继续执行操作的状态代码。 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 2开头的http状态码
表示请求成功 200 成功处理了请求,一般情况下都是返回此状态码;
201 请求成功并且服务器创建了新的资源。
202 接受请求但没创建资源;
203 返回另一资源的请求;
204 服务器成功处理了请求,但没有返回任何内容;
205 服务器成功处理了请求,但没有返回任何内容;
206 处理部分请求; 3xx (重定向)
重定向代码,也是常见的代码 300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久重定向) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 4开头的http状态码表示请求出错 400 服务器不理解请求的语法。
401 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 服务器拒绝请求。
404 服务器找不到请求的网页。
405 禁用请求中指定的方法。
406 无法使用请求的内容特性响应请求的网页。
407 此状态代码与 401类似,但指定请求者应当授权使用代理。
408 服务器等候请求时发生超时。
409 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 如果请求的资源已永久删除,服务器就会返回此响应。
411 服务器不接受不含有效内容长度标头字段的请求。
412 服务器未满足请求者在请求中设置的其中一个前提条件。
413 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 请求的 URI(通常为网址)过长,服务器无法处理。
415 请求的格式不受请求页面的支持。
416 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 服务器未满足”期望”请求标头字段的要求。 5开头状态码并不常见,但是我们应该知道 500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。 抓包工具:
Elements: 当前网页有哪些源代码构成的
Console: JS代码输出端
Sources: 网页由那些文件组成的
Network: 查看网页发送的请求(查看请求是那种方式,请求内容) 请求库:
(进入到内置函数:Ctrl+B或者Ctrl+鼠标左键)
urllib库:(python3中集合到内置urllib。request模块内,导入库函数:from urllib import request)
urlopen函数:
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=None):
url:请求的网址
data:请求的data,如果设置了这个值那么支持post请求
timeout:延时
返回值:返回值是一个http.client.HTTPResponse 对象,这个对象是一个句柄对象。
read(size)未指定读取所有文件内容
readline:读取一行数据
readlines:读取多行数据
getcode:状态码
urlretrieve函数:
这个方法可以方便的将网页上的一个文件保存到本地,保存图片等
from urllib import request
request.urlretrieve('http://www.baidu.com','baidu.html')('url','保存文件名')
urlencode函数:
使用代码发送请求,如果url中包含非英文字母字符时需要进行编码,这时候使用urlencode实现,urlencode可以将字典数据转换为URL编码数据
例:from urllib import parse
data = {'name':'zhao','ming':'xiujie','age':'24'}
qs = parse.urlencode(data)
print(qs)
parse_qs函数:解码还原
from urllib import parse
data = {'name':'赵','ming':'秀杰','age':24}
qs = parse.urlencode(data)
result = parse.parse_qs(qs)
print(result) urlparse 和 urlsplit,基本一样,urlparse多了一个params。
from urllib import parse
url = 'http://www.imailtone.com/WebApplication1/WebForm1.aspx;hello?name=tom&;age=20#resume'
resault = parse.urlparse(url)
print('scheme:',resault.scheme)
print('netloc:',resault.netloc)
print('path:',resault.path)
print('params:',resault.params)
print('query:',resault.query)
print('fragment:',resault.fragment) request.Request类:
如果想要在请求时增加请求头,就需要使用request.Request类来实现,比如增加一个User-Agent,
from urllib import request,parse
url = 'https://www.lagou.com/jobs/list_python/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput='
# resp = request.urlopen(url)
# print(resp.read())
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Referer':'https://www.lagou.com/jobs/list_python/p-city_0?&cl=false&fromSearch=true&labelWords=&suginput=',}
data = {
'first':'true',
'pn':'1',
'kd':'python'}
req = request.Request(url,headers=headers,data=parse.urlencode(data).encode('utf-8'),method='POST')#添加User-Agent,Referer,data参数并对data进行编码
resp = request.urlopen(req)
print(resp.read().decode('utf-8'))#解码 ProxyHandler处理器(IP代理设置)
使用‘http://www.httpbin.org/’这个网站查看Http请求的一些参数
在代码中是用代理,‘urllib.request.Proxyhandeler’,这一代理,这一代理是字典,,字典的key是代理服务器能够接受的类型,一般是http/https,值是'ip:port'
'''
from urllib import request
url = 'http://www.httpbin.org/ip'#url
handler = request.ProxyHandler({'http':'118.113.246.127:9999'})#使用request.ProxyHandler构建一个handler
opener = request.build_opener(handler)使用上面的handler构建一个opener()
resp = opener.open(url) #使用构建的opener发送一个url请求,
print(resp.read())
'''
什么是cookie:
Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。定义于RFC2109和2965都已废弃,最新取代的规范是RFC6265。
Name:该Cookie的名称。
Value:该Cookie的值。
Domain:可以访问该Cookie的域名。
Expires:该Cookie失效的时间,单位为秒,
Path:该Cookie的使用路径。
Secure:该Cookie是否仅被使用安全协议传输。安全协议有HTTPS和SSL等,在网络上传输数据之前先将数据加密。默认为false。 例1:
from urllib import request
url = 'http://www.renren.com/880151247/profile'
headers = {
'User-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:73.0) Gecko/20100101 Firefox/73.0',
'Cookie':'wp_fold=0; _r01_=1; anonymid=k6q3nelcabojoo; depovince=LN; taihe_bi_sdk_uid=09ecf7537e2a34b628e281831b84b42d; jebe_key=2c043046-81f7-4d1f-967b-311f5ced93f4%7Cd39a42f8e30da355ea6608fb51f73574%7C1581922246738%7C1%7C1581922246672; jebe_key=2c043046-81f7-4d1f-967b-311f5ced93f4%7Cd39a42f8e30da355ea6608fb51f73574%7C1581922246738%7C1%7C1581922246674; jebecookies=c773ae43-1e0b-49e7-968f-09395211d019|||||; JSESSIONID=abcfYtpckGeCT5Oaw-rbx; taihe_bi_sdk_session=a92b80af092a72dea469264ef24c32a1; ick_login=42131da7-55ae-47c7-a142-740f0df95f89; t=abc15a448e816609aad40fdb911941d27; societyguester=abc15a448e816609aad40fdb911941d27; id=973744147; xnsid=adfefda2; ver=7.0; loginfrom=null',
}
req = request.Request(url,headers=headers)
resp = request.urlopen(req)
# print(resp.read().decode('utf-8'))
with open('dapeng.html','w',encoding='utf-8') as fp:
#write写入的必须为str类型数据
#resp.read()读取出来的是一个bytes数据类型
#str -> encode -> bytes
#bytws -> decode -> str
fp.write(resp.read().decode('utf-8'))
例2:使用账号密码登录 http.cookjar 模块:
CookieJar(存储在内存中)、FileCookieJar,MozillaCookieJar,LWPCookieJar(存储在文件中)。
CookieJar:管理HTTP cookie值、存储HTTP请求生成的cookie、向传出的HTTP请求添加cookie的对象。整个cookie都存储在内存中,对CookieJar实例进行垃圾回收后cookie也将丢失。
FileCookieJar (filename,delayload=None,policy=None):从CookieJar派生而来,用来创建FileCookieJar实例,检索cookie信息并将cookie存储到文件中。filename是存储cookie的文件名。delayload为True时支持延迟访问访问文件,即只有在需要时才读取文件或在文件中存储数据。
MozillaCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与Mozilla浏览器 cookies.txt兼容的FileCookieJar实例。
LWPCookieJar (filename,delayload=None,policy=None):从FileCookieJar派生而来,创建与libwww-perl标准的 Set-Cookie3 文件格式兼容的FileCookieJar实例。
其实大多数情况下,我们只用CookieJar(),如果需要和本地文件交互,就用 MozillaCookjar() 或 LWPCookieJar()。当然,如果我们对cookie有定制的需要,那么我们也要借助HTTPCookieProcess处理器来处理。具体看下面代码。 将cookie保存到本地:
from urllib import request
from http.cookiejar import MozillaCookieJar cookiejar = MozillaCookieJar('cookie1.txt')
cookiejar.load(ignore_discard=True)#将cookie信息加载调用
handler = request.HTTPCookieProcessor(cookiejar)
opener = request.build_opener(handler)
# resp = opener.open("http://www.baidu.com")
resp = opener.open("http://www.httpbin.org/cookies/set?count=spider")
# cookiejar.save()#如果cookijar未设置名称需要再次填写文件保存名
# cookiejar.save(ignore_discard=True)#保存即将过期的cookie信息
for cookie in cookiejar:
print(cookie)
urllib笔记的更多相关文章
- python2 urllib 笔记
python2 urllib 笔记 import urllib base='http://httpbin.org/' ip=base+'ip' r=urllib.urlopen(ip) print r ...
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
- Python3学习笔记(urllib模块的使用)
转载地址:https://www.cnblogs.com/Lands-ljk/p/5447127.html 1.基本方法 urllib.request.urlopen(url, data=None, ...
- 学习笔记 urllib
第一步: get # -*- coding:utf-8 -*- # 日期:2018/5/15 19:39 # Author:小鼠标 from urllib import request url = ' ...
- 爬虫学习笔记-urllib库
urllib库是python中一个最基本的网络请求库.可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据. urlopen函数:在python3的urllib库中,所有和网络 ...
- 潭州课堂25班:Ph201805201 爬虫基础 第三课 urllib (课堂笔记)
Python网络请求urllib和urllib3详解 urllib是Python中请求url连接的官方标准库,在Python2中主要为urllib和urllib2,在Python3中整合成了url ...
- Python笔记(十三):urllib模块
(一) URL地址 URL地址组件 URL组件 说明 scheme 网络协议或下载方案 net_loc 服务器所在地(也许含有用户信息) path 使用(/)分割的文件或CGI应用的路径 p ...
- python学习笔记——urllib库中的parse
1 urllib.parse urllib 库中包含有如下内容 Package contents error parse request response robotparser 其中urllib.p ...
- python学习笔记——爬虫学习中的重要库urllib
1 urllib概述 1.1 urllib库中的模块类型 urllib是python内置的http请求库 其提供了如下功能: (1)error 异常处理模块 (2)parse url解析模块 (3)r ...
随机推荐
- 仿IntelliJ Darcula的Swing主题FlatLaf使用方法
最近Sandeepin想写个基于Java Swing的RSS阅读器练练手,不过Swing默认主题太丑了,切成系统原生的主题也不是非常好看,正好感觉开发时用的IDEA主题很不错,不管是Light还是Da ...
- Spark入门(五)--Spark的reduce和reduceByKey
reduce和reduceByKey的区别 reduce和reduceByKey是spark中使用地非常频繁的,在字数统计中,可以看到reduceByKey的经典使用.那么reduce和reduceB ...
- Linux中MySQL二进制安装步骤
MySQL二进制安装步骤 安装依赖环境 [root@node3 ~]# yum -y install libaio 将mysql-5.7.26-linux-glibc2.12-x86_64.tar.g ...
- 两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走 (不加flex不自动撑开)
两个div,高度都是100% 用 display:flex; 和 min-height 一边撑高了,另一边自动走
- 部署prometheus监控kubernetes集群并存储到ceph
简介 Prometheus 最初是 SoundCloud 构建的开源系统监控和报警工具,是一个独立的开源项目,于2016年加入了 CNCF 基金会,作为继 Kubernetes 之后的第二个托管项目. ...
- java基本类型、数组、和枚举类型
开始之前先吐槽一下,学艺不精,面试要吃大亏,出来混迟早要还的. 别的不说了,从零开始复习基础知识 1.标识符和关键字 意义:标识符用于对变量.类.和方法的命名.规范的标识符命名可以提高程序的可读取性. ...
- 网络安全从入门到精通 ( 第二章-5) 后端基础PHP—简介及基本函数-下
本文内容: 循环语句 PHP获取表单信息 PHP操作Mysql语句 语法SQL注入 1,循环语句: for循环: 语法:for($x=0,$x<10;$x++){执行语句;} 注意:$x++,先 ...
- Arch Linux开启SSH远程安装(1.5)
现在你的眼前应该可以看到[root@archiso~]#的提示. 首先,建立目标机器的网络设置: 安装和升级软件包前,先让本地的包数据库和远程的软件仓库同步是个好习惯. [root@archiso~] ...
- Python+Selenium+Unittest编写超链接点击测试用例
测试功能:博客园首页网站分类的一级菜单链接和二级菜单链接的点击. 遇到的问题: 1.循环点击二级菜单时,点击了一个一级菜单下的第一个二级菜单后,页面会刷新,再定位同一个一级菜单次下的第二个二级菜单时, ...
- selenium3浏览器驱动设置
设置浏览器驱动: 1.首先手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver.geckodriver)丢到该目录下. 2.打开计算机 ...