URL编程

提醒,最后不要忘了:response.close()或者把requests.get放在with as中

 

更多资料查询:

https://www.cnblogs.com/lanyinhao/p/9634742.html

一、python提供了一个urllib模块,但是操作复杂,我们使用第三方模块requests模块,需要安装

pip install requests

二、介绍一下url编码:

urllib模块下有一个函数可以进行url编码:urlencode(),跟我们平时所用的endode('utf-8')有什么区别呢,下面来看一看:

dic = {"name": "唐俊", "password": 12345}
param = urllib.parse.urlencode(dic)  # url编码,可以转换中文为十六进制的Unicode
print(param)  # name=%E5%94%90%E4%BF%8A&password=12345

print('唐俊'.encode())  # b'\xe5\x94\x90\xe4\xbf\x8a'

区别:

1、urlencode()是对字典进行编码,encode()是对字符串进行编码

2、urlencode会自动添加一些符号比如:= & 以适应参数的格式要求

3、最大的区别,urlencode()编码以后变成字符串,而encode()编码以后变成二进制。

4、最终在网上传递数据都是要以二进制方式传递的,

问题:

中文字符为什么要进行url编码?

答:服务器处理数据是一个字节一个字节的读,也就是说,当读到某一个字节时服务器就知道下一步该怎么处理数据了,url编码是对中文和一些特殊字符进行的,比如:=&,它们有特殊的意义,

向服务器发送数据不是简单的发送一些二进制数据,而是还发送一些“格式”,服务器要解析这些格式,知道什么代表文件头,什么代表参数,什么代码二制文件,所以需要编码,规范语法

三、requests模块

# encoding = utf-8
# 一、安装 pip install requests
import requests
# 访问方式:
# get,
# post,
# put,从客户端向服务器传送的数据取代指定的文档的内容
# head,类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
# delete,请求服务器删除指定的页面
# options 允许客户端查看服务器的性能

# 传递的参数,是一个字典,get用params关键字,post用data关键字,中文字符能自动编码
data = {
    'name':'唐俊',  # 中文字符能自动编码
    'age':22
}

# 要上传的二进制文件,必须用post上传
files = {
    'file': open('001.jpg', 'rb')
}
response = requests.get('http://httpbin.org/get', params=data)
# print(response.url)  # http://httpbin.org/get?name=%E5%94%90%E4%BF%8A&age=22 可以看到中文字符会自动帮你编码
response = requests.post('http://httpbin.org/post', files=files)
# response = requests.post('http://httpbin.org/post', data=data)

print(response.status_code)  # 200 正常,如果是404的话是错误
try:
    response.raise_for_status()  # 错误的话会抛出一个异常。
except:
    print('网址或服务器错误')

print(response.encoding)  # ISO-8859-1
response.encoding = 'utf-8'  # 出现乱码的话修改一下这个值。

# 下面几种print的结果几乎都是一样的,
# 方法一:
response.text  # 是str,有时候会乱码,需要设置一下 response.encoding = 'utf-8'

# 方法二:
response.content.decode()  # response.content是二进制,需要decode()手动解码。
# 方法三:
for i in response.iter_content(1024*10):  # 适合下载较大的二进制文件,比如电影
    # print(i.decode())  # i 是二进制,需要解码,还是含有文件头。
    pass

# 方法四:
for i in response.iter_lines():
    # print(i.decode())  # i 是二进制,需要解码,还是含有文件头。
    pass



print(response.url)  # http://...你所访问的网址
print(response.history)  # []


# 其它一些方法:
# header响应头和cookies
# 服务器端的
print(response.headers)
print(response.headers['Content-Type'])
print(response.headers.get('content-type')) #访问响应头部分内容的两种方式

response.cookies  # cookies,是一个字典dict,可以用for in遍历items
print(response.cookies)  # <RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
for key, value in response.cookies.items():
    print(key + '=' + value) # BDORZ=27315

# 客户端的
# 说明,可以手动设置一个cookies的值,模拟登录状态
header = {'user-agent': 'my-app/0.0.1'}
cookie = {'key': 'value'}
r = requests.get('http://www.baidu.com', headers=header, cookies=cookie) # 也可以是post

#设置超时时间
r = requests.get('http://m.ctrip.com', timeout=1)          #设置秒数超时,仅对于连接有效

# 会话:session
s = requests.Session()
s.auth = ('auth', 'passwd')
s.headers = {'key': 'value'}
r = s.get('http://www.baidu.com')

# 代理设置:
# 对于某些网站,在测试的时候请求几次,能正常获取内容。但是一旦开始大规模爬取,对于大规模且频繁的请求,网站可能会弹出验证码,
# 或者跳到登录认证页面,更甚至可能会直接封禁客户端的IP,导致一段时间内无法访问。
# 那么为了防止这种情况发生,我们需要设置代理来解决这个问题,这就需要用到proxies参数。可以用这样的方式设置:
# proxies = {
#     'http':'http://10.10.1.10:3128',
#     'https':'http://10.10.1.10:1080',
# }
# requests.get('https://www.taobao.com',proxies=proxies)

# 身份验证:
# import requests
# from requests.auth import HTTPBasicAuth
#
# r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
# # r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd'))    # 简写
# print(r.json())

 

如果用浏览器访问一个socketServer,你就会看到浏览器包装了一些头文件:

GET /aaa.html HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0

posted @ 2020-10-22 06:23  老谭爱blog  阅读(106)  评论(0)    收藏  举报