python web 基础

web客户端和服务器端交互需要用到特定的语言,即web交互用到的标准协议,称为HTTP超温暖本传输

HTTP是TCP/IP的上层协议,这意味着HTTP协议依靠着TCP/IP来进行底层的交流工作,他的职责不是发生

或者传递消息(TCP/IP负责),而是通过发送.接受HTTP消息来处理客户端的请求

HTTP属于无状态协议,从不跟踪从一个客户端到另一个客户端的请求信息,客户端会随时发新的请求,但是新的

请求会处理成独立的服务请求,由于每个请求缺乏上下文,因此好多的url中包含很长的变量信息和值,

作为请求的一部分.

使用cookie即保存在客户端的客户状态信息,也可以解决这个问题

因为在因特网上传输的数据有些比较敏感,但是在传输过程中又默认没有加密服务,为了对传输的数据

进行加密,需要在普通的套接字上添加一个额外的安全层,称为安全套接字SSL,用来创建一个套接字,加密通过

该套接字传输的数据

防火墙用来阻止对工作或是家庭网络未授权的网络,如阻止已知的接入点,对每个网络进行基础配置.

网络管理员会封杀大部分的端口,只留下常见的服务,如web服务器和安全shell访问(SSH),以降低入侵的

概率,ssh基于前面提到的SSL

代理服务器:网络管理员可以只让一部分计算机访问网络,也可更好的监控网络数据的传输,代理服务器

特性是可以缓存数据.一个访问之后其他会更快一点.(正向代理)

反向代理,like服务器,客户端可以连接这个服务器,客户端访问这个服务器,接着后端服务器在网上进行

真正的操作,获得客户端请求的服务,方向代理也可以缓存服务器的数据,如果其作为后端服务器,会将数据

直接返给客户端

urllib.request urllib.error使用2.6才有urllib2这种,而且直接是urlopen2.7以及3.*以上都是request.urlopen()

url="http://www.baidu.com"
response=urllib.request.urlopen(url)
print(response.read().decode('utf-8'))
urllib.request.urlopen(

    url, data=None, [timeout, ]*, cafile=None, 
capath=None, cadefault=False, context=None
)
第一个参数 String 类型的地址或者
data 是 bytes 类型的内容,可通过 bytes()函数转为化字节流。
它也是可选参数。使用 data 参数,请求方式变成以 POST 方式提交表单。
使用标准格式是application/x-www-form-urlencoded
timeout 参数是用于设置请求超时时间。单位是秒。
cafile和capath代表 CA 证书和 CA 证书的路径。
如果使用HTTPS则需要用到。
context参数必须是ssl.SSLContext类型,用来指定SSL设置
cadefault参数已经被弃用,可以不用管了。
该方法也可以单独传入urllib.request.Request对象
该函数返回结果是一个http.client.HTTPResponse对象。
url="http://www.baidu.com"
#response=urllib.request.urlopen(url)
req=urllib.request.Request(url)
response=urllib.request.urlopen(req)
print(response.read().decode('utf-8'))也是同样的
对urllib.request.urlopen()返回的对象有以下方法
read() , readline() ,readlines() , fileno() , close() :
对HTTPResponse类型数据进行操作:
info():返回HTTPMessage对象,表示远程服务器返回的头信息
getcode():返回Http状态码。如果是http请求,200请求成功完成;404网址未找到
geturl():返回请求的url

发送数据

import socket
import urllib.request
import  urllib.parse
url="http://httpbin.org/post"
data=urllib.parse.urlencode({'name':'ada'}).encode('utf-8')
try:
    response=urllib.request.urlopen(url=url,data=data,timeout=1)
    print(response.read().decode('utf-8'))
    print(response.status)
    print(response.getHeaders()) # 元祖列表
    print(response.getHeader('Server'))
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('Time Out')
该url是HTTP测试网站
可以设置请求超时的时间

e.code:HTTP 请求返回的状态码。 
e.reason:与父类用法一样,表示返回错误的原因。 
e.headers:HTTP 请求返回的响应头信息。
import socket
import urllib.request
import  urllib.parse
url="http://httpbin.org/post"
data=urllib.parse.urlencode({'name':'ada'}).encode('utf-8')
headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36',
    'Referer': r'',       
    'Connection': 'keep-alive'
 }
try:
    response=urllib.request.Request(url=url,data=data,headers=headers,method='POST')
    req=urllib.request.urlopen(response,timeout=1)
    print(req.read().decode('utf-8'))
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('Time Out')
request方法解析:

urllib.request.Request(url, data=None, headers={}, 
origin_req_host=None, unverifiable=False, method=None)
url 参数是请求链接,这个是必传参数,其他的都是可选参数。
data 参数跟 urlopen() 中的 data 参数用法相同。
headers 参数是指定发起的 HTTP 请求的头部信息。headers 是一个字典。
它除了在 Request 中添加,还可以通过调用 Reques t实例的
 add_header() 方法来添加请求头。
origin_req_host 参数指的是请求方的 host 名称或者 IP 地址。
unverifiable 参数表示这个请求是否是无法验证的,默认值是False。
意思就是说用户没有足够权限来选择接收这个请求的结果。
例如我们请求一个HTML文档中的图片,但是我们没有自动抓取图像的权限,
我们就要将 unverifiable 的值设置成 True。
method 参数指的是发起的 HTTP 请求的方式,有 GET、POST、DELETE、PUT等

user_agent解析:

User-Agent :这个头部可以携带如下几条信息:浏览器名和版本号、操作系统名和版本号、默认语言
Referer:可以用来防止盗链,有一些网站图片显示来源http://***.com,就是检查Referer来鉴定的
Connection:表示连接状态,记录Session的状态。

urllib.parse.urllencode()的用法

data = {
     'first': 'true',
     'pn': 1,
     'kd': 'Python'
 }
data = parse.urlencode(data).encode('utf-8')
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
经过urlencode()转换后的data数据为?first=true?pn=1?kd=Python,最后提交的url为

http://www.lagou.com/jobs/positionAjax.json?first=true?pn=1?kd=Python

HTTP认证:

import urllib.request

url = "http://tieba.baidu.com/"
user = 'user'
password = 'password'
pwdmgr = urllib.request.HTTPPasswordMgrWithDefaultRealm()
pwdmgr.add_password(None,url ,user ,password)

auth_handler = urllib.request.HTTPBasicAuthHandler(pwdmgr)
opener = urllib.request.build_opener(auth_handler)
response = opener.open(url)
print(response.read().decode('utf-8'))

使用代理:

urllib.request.ProxyHandler(proxies=None)

当需要抓取的网站设置了访问限制,这时就需要用到代理来抓取数据。

import socket
import urllib.request
import  urllib.parse
url="http://www.baidu.com"
data=urllib.parse.urlencode({'name':'ada'}).encode('utf-8')
headers = {
      'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36',
 }
proxy_handler = urllib.request.ProxyHandler({
    'http': 'web-proxy.oa.com:8080',
    'https': 'web-proxy.oa.com:8080'
})
opener = urllib.request.build_opener(proxy_handler)
urllib.request.install_opener(opener)
try:
    response=urllib.request.Request(url=url,data=data,headers=headers,method='POST')
    req=urllib.request.urlopen(response,timeout=1)
    print(req.read().decode('utf-8'))
except urllib.error.URLError as e:
    if isinstance(e.reason,socket.timeout):
        print('Time Out')

保存cookie

import http.cookiejar
import urllib.request

url = "http://www.baidu.com/"
fileName = 'cookie.txt'

cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open(url)

f = open(fileName,'a')
for item in cookie:
    f.write(item.name+" = "+item.value+'\n')
f.close()
如果请求的页面每次需要身份验证,我们可以使用 Cookies 来自动登录,
免去重复登录验证的操作。获取 Cookies 需要使用 http.cookiejar.CookieJar() 
实例化一个 Cookies 对象。再用 urllib.request.HTTPCookieProcessor 
构建出 handler 对象。最后使用 opener 的 open() 函数即可。

猜你喜欢

转载自blog.csdn.net/qq_37312720/article/details/83006683