一、简介

  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'), })

 

posted on 2020-07-01 02:01  焚音留香  阅读(180)  评论(0编辑  收藏  举报