在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)