一、简介
1、使用requests模块可以模拟浏览器发送请求
2、发送请求后会将页面代码下载下来,但是并不会执行js代码,之后需要再进行解析发起新的请求,至今获取到需要的数据
3、安装:pip install requests
4、请求方式:
import requests # 常用 requests.get(url, params=None, **kwargs) requests.post(url, data=None, json=None, **kwargs) # 不常用 requests.put(url, data=None, **kwargs) requests.patch(url, data=None, **kwargs) requests.delete(url, **kwargs) requests.head(url, **kwargs) requests.options(url, **kwargs)
二、get请求
1、特征:
①没有请求体
②请求参数都会暴露在url中
③参数大小有限制,1KB以内
2、常用场景:
①在浏览器的地址栏直接输入url访问,一定是get请求
②页面上的超链接一定是get请求
③提交表单,默认会用get请求
3、基本方式:
import requests rep = requests.get('http://dig.chouti.com') # 获取页面代码 print(rep.text)
4、请求头和参数:
import requests rep = requests.get( # 可以直接把参数加在url后面 'https://www.baidu.com/s?wd=game&pn=10', # 还可以把参数放进params里面,会自动调用urlencode params={'wd': '魔兽世界', 'pn': 10}, # 解析页面完善请求头 headers={ # 设备信息(操作系统,浏览器等) 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36', # 跳转源 'Referer': 'https://www.baidu.com/s?wd=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&pn=10', # 登录信息,可以先用浏览器正常登录后获取 'Cookie': 'BAIDUID=A912A9B08644D88B80CAC6DD5516D886:FG=1; BIDUPSID=A912A9B08644D88B80CAC6DD5516D886; PSTM=1587180972; BD_UPN=12314753; BDUSS=5IMVhYZEswV1VENEU0Slc5Z1hvTEVHSm9yS3Noa1RaWWFWY2lObFlubURBZXRlSVFBQUFBJCQAAAAAAAAAAAEAAACiwuMVYmFueGlkZXpodWh1bwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIN0w16DdMNeVm; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDUSS_BFESS=5IMVhYZEswV1VENEU0Slc5Z1hvTEVHSm9yS3Noa1RaWWFWY2lObFlubURBZXRlSVFBQUFBJCQAAAAAAAAAAAEAAACiwuMVYmFueGlkZXpodWh1bwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIN0w16DdMNeVm; delPer=0; BD_CK_SAM=1; PSINO=3; COOKIE_SESSION=4_0_8_3_27_23_1_0_7_5_0_0_50_0_0_0_1596450289_0_1596451916%7C9%2333126_230_1595897281%7C9; H_PS_PSSID=32294_1458_31670_32141_32355_31254_32348_32045_32395_32404_32429_32115_26350_32432; sug=3; sugstore=0; ORIGIN=0; bdime=0; H_PS_645EC=41b24zgrdk7UcoF4Fmi8uCregdUIx%2FUvpWtgUqDkvHv%2Bs%2FjFLUOCGfgQOHE', } ) print(rep.text) # 获得页面代码
5、编码问题:
# 如果参数含有中文或一些特殊符号,可能需要先进行编码 # 编码,解码 from urllib.parse import urlencode, unquote wd = '魔兽世界' res = urlencode({'wd': wd, 'pn': 10}, encoding='utf-8') print(res) # wd=%E9%AD%94%E5%85%BD%E4%B8%96%E7%95%8C&pn=10
三、post请求
1、特征:
①数据既可以放在url后面,也可以另外放在请求体中
②数据大小没有限制
③请求体内的数据如果有中文等字符,会自动使用url编码
2、用法:requests.post和requests.get的用法基本一致,只是前者多一个data参数,用来携带请求体数据
四、请求补充
1、需要登录的情况,可以先有意输错账号或密码,然后进行页面解析,若正常登录极有可能直接跳转,则无法进行解析。
2、如果需要请求体中携带密码,且密码是密文的形式,可以先输对密码同时输错密码,以此获取密码编码后的字符串。
3、部分网站需要先get访问一次,获取初始的cookie,第二次post访问携带cookie和账号密码登录获取token,之后的访问就可以直接携带token。
4、以上为了获取token的步骤,可以直接正常登录一次获取token后操作。
5、自动携带cookie:
import requests # 获取session对象 session = requests.session() # 先用session对象访问一次,若能得到cookie,会自动收集 session.get('http://www.url.com/home/', headers={}, timeout=3) # 可以从session对象中取出cookie,所有用session对象访问得到的cookie,都会存于cookies中 cookies = session.cookies # 后续访问即可将cookies传入使用 rep = session.get('http://www.url.com/index/', headers={}, cookies=cookies, timeout=5)
五、reponse响应
1、response.encoding和response.apparent_encoding:
import requests # requests的默认解码格式为ISO-8859-1,而有些网站页面返回的内容是gbk格式的,需要提前进行设置 rep = requests.get('https://www.autohome.com.cn/news/', ) rep.encoding = 'gbk' # 效果同上,自动匹配合适编码 rep.encoding = rep.apparent_encoding # 获取页面内容 print(rep.text)
2、response.content:
import requests # 获取二进制数据 rep = requests.get('https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1855338777,4026397193&fm=26&gp=0.jpg', ) with open(file=r'aaa.jpg', mode='wb')as f: f.write(rep.content)
3、respnse.iter_content:
import requests # 获取大文件,迭代取值 rep3 = requests.get( 'https://img.tukuppt.com/video_show/2418175/00/01/59/5b46cd09f3f1e.mp4', # 数据流参数,针对大文件 stream=True ) with open(file=r'bbb.mp4', mode='wb')as f: for line in rep3.iter_content(): f.write(line)
4、response.json:
import requests rep = requests.get('http://httpbin.org/get', ) # 直接反序列化,省去调用json的环节 print(rep.json())
5、response.status_code:响应状态码
6、response.url:跳转后的url
7、response.history:重定向之前response对象
8、respone.headers:响应头
9、respone.cookies:cookies也可放入此中
六、高级用法
1、使用代理:
①原理:通过代理发送请求,再由代理转发响应
②高匿:服务端无论如何都无法获取本机ip
③透明:服务端通过X-Forwarded-For可以获取本机ip
④代理池:存放了一堆代理ip的列表,每次使用随机获取一个
⑤使用:
import requests rep = requests.get('https://www.baidu.com/', proxies={ # 填入代理ip与端口 'http': '113.195.18.245:9999', # 有部分代理需要用户名与密码 'https': 'username:password@175.44.108.136:9999', })
2、超时设置:
import requests # 只写一个数字,代表接收数据超时时间 rep1 = requests.get('https://www.baidu.com', timeout=0.1) # 写两个数字,前一个代表连接超时时间,后面一个代表接收数据超时时间 rep2 = requests.get('https://www.baidu.com', timeout=(0.01, 0.02))
3、ssh证书:
import requests # 不携带证书无法访问 rep1 = requests.get('https://www.12306.cn') # 携带证书则可以正常访问 rep2 = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key'))
4、认证设置:
import requests # 并非登录信息,现在已几乎见不到 rep = requests.get('http://www.xxx.com', auth=('user', 'password'))
5、异常处理:
import requests # 可以点进源码查看requests.exceptions获取异常的类型,但是一般都会统一捕捉 from requests.exceptions import * try: rep = requests.get('http://www.baidu.com', timeout=0.01) except Exception as e: print(e)
6、上传文件:
import requests rep = requests.post('http://www.xxx.com/up/', files={'file': open('a.jpg', 'rb'), })