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

浙公网安备 33010602011771号