requests模块使用

爬虫介绍

https://www.cnblogs.com/xiaoyuanqujing/p/11805679.html

#爬虫简单来说指,网络蜘蛛

#爬虫本质,;模拟浏览器发送请求(使用的模块requests,selenium)>>>下载网页>>>提取需要的数据(使用的模块bs4,xpath,re)>>>保存数据(文件,excel,mysql,redis,mongodb)

#发送请求,请求地址(使用浏览器,抓包工具),请求头,请求体,请求方法

#拿到响应,拿到响应体(格式:json,xml,html(bs4,xpath)),加密的未知格式(需要解密)

#保存数据,Mongodb(json格式数据)

#性能高一些(多线程、多进程、协程),只针对python语言的cpython解释器(GIL,同一时刻只能有一个线程在执行)
	io 密集型:用线程
	计算密集型:用进程
	
#scrapy框架处理了性能

requests模块使用

#安装 pip install requests

#图片防盗链 referer

#使用
	import requests

#常用的请求方式,request.get()和request.post()

#基于GET请求

#1基本请求
res = requests.get('https://www.cnblogs.com/linqiaobao/')
# print(res.text)#打印出返回的文本内容

#2带参数的GET请求->params

#在?后自己拼接参数,请求头将自己伪装成浏览器,否则百度不会返回正常的页面内容
res = requests.get('https://www.baidu.com/s?ie=UTF-8&wd=python',
                   headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})

# print(res.text)

#如果查询关键字有中文或其他特殊符号,需要进行url编码
from urllib.parse import urlencode
wd='妹子图'
encode_res = urlencode({'k':wd},encoding='utf-8')
keyword = encode_res.split('=')[1]
# print(keyword)

#拼接url
url = f'https://www.baidu.com/s?wd={wd}&pn=1'

res = requests.get(url,
                   headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'})

# print(res.text)


#3带参数的GET请求->headers

#通常我们在发送请求时都需要带上请求头,请求头是将自身伪装成浏览器的关键,常用的有用的的请求头有:
    # HOST
    # Referer #根据该参数判断请求来源
    # User_Agent #客户端信息
    # Cookie #包含了Cookie信息,但requests模块有单独的参数来处理它,headers={}内不要放它

#4带参数的GET请求->cookies

# 如登录gitee,登录后就可以从浏览器获取cookies,使用cookies就可以无需用户名和密码了
Cookies ={'gitee-session-n':'am1vZGMwQStYKzBSV2VqNkV3Y2ExYWlSbEp3aXd1YUFZWFYrcE5OY01jcEtaUEVQSjN1RnpwTkVYdU5DakNYSnVydWlpMHlyd0wxbVpBd3lueGZheG1mcW5CQ1VBTkJyZVVJZnlveFJEYmptZHhURVNUOWNFSzZHdVhyVjY0M3NxUm1LZG54U0ZlditjdkJKVi9mUGliYkErMzdlamd2dDR1SFNyYmN5NENKMTZZdzJvdXZmSGVSaXkrUGtCQVZ1eFhEUU9nMkVoZ0ZmbmpQNGwydHBYMFZjSzBmTkR1bjNDZkc4RHhCUGhtUGlwaVVZMVJmUW01NGt5dlRicnBLWFRIRW9HVUhMSmVZZnM5c0hkamo4VlM0dXB5bmdoZlFXeENFRnpUN2JGeVRjZjdRWEFQSkVwaUFVbE9vNkdwdndYMmFQaElseHZRZCs4clR3VVRTSnN4YXRsc2lEUTFGd0dKZitMbk5HNUQ0PS0teDlQYWs2WllXUHhpTVIzdVhwNjcxQT09--d441f4ee1d62ddd98f9db1ff1446b271ff036494	'}

res = requests.get('https://gitee.com/',cookies=Cookies)

# print('个人主页' in res.text)#主页


#基于POST请求

#发送post请求,携带数据(urlencoded和json)

res=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
print(res.text)

res=requests.post('http://127.0.0.1:8000/index/',json={'age':1,},)
print(res.text)


# 5 自动携带cookie

session=requests.session()
res=session.post('http://127.0.0.1:8000/index/')  # 假设这个请求登录了
res1=session.get('http://127.0.0.1:8000/order/')  # 现在不需要手动带cookie,session会帮咱处理

# 6 response对象

respone=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
# print(respone.text)  # 响应的文本
# print(respone.text())  # 响应的文本转成二进制
print(respone.content)  # 响应体的二进制


print(respone.status_code)  # 响应状态码
print(respone.headers)    # 响应头
print(respone.cookies)   # cookie
print(respone.cookies.get_dict()) #  把cookie转成字典
print(respone.cookies.items())  # key和value

print(respone.url)        # 请求的url
print(respone.history)   #[]放重定向之前的地址

print(respone.encoding)  # 响应的编码方式

respone.iter_content()  # 图片,视频,大文件,一点一点循环取出来
for line in respone.iter_content():
    f.write(line)

# 7 编码问题
res=requests.get('http://www.autohome.com/news')

# 一旦打印出来出现乱码问题

# 方式一
res.encoding='gb2312'

# 方式二
res.encoding=res.apparent_encoding
print(res.text)


# 8 解析json
import json
respone=requests.post('http://127.0.0.1:8000/index/',data={'name':'lqz'})
print(type(respone.text))  # 响应的文本
print(json.loads(respone.text))
print(respone.json())  # 相当于上面那句话
print(type(respone.json()))  # 相当于上面那句话


# 9 高级用法之ssl(了解)
import requests
respone=requests.get('https://www.12306.cn') #不验证证书,报警告,返回200
print(respone.status_code)

# 使用证书,需要手动携带

import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)

# 9 高级用法之ssl(了解)
import requests
respone=requests.get('https://www.12306.cn') #不验证证书,报警告,返回200
print(respone.status_code)
# 使用证书,需要手动携带

import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)

# 10 高级用法:使用代理

respone=requests.get('http://127.0.0.1:8000/index/',proxies={'http':'代理的地址和端口号',})
# 代理,免费代理,收费代理花钱买
# 代理池:列表放了一堆代理ip,每次随机取一个,再发请求就不会封ip了
# 高匿和透明代理?如果使用高匿代理,后端无论如何拿不到你的ip,使用透明,后端能够拿到你的ip
# 后端如何拿到透明代理的ip,  后端:X-Forwarded-For
respone=requests.get('https://www.baidu.com/',proxies={'http':'27.46.20.226:8888',})
print(respone.text)


# 11 超时设置
import requests
respone=requests.get('https://www.baidu.com',
                     timeout=0.0001)


# 12 认证设置(你见不到了)
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)


# 13 异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
except Exception as e:
    print(e)


# 14 上传文件
res=requests.post('http://127.0.0.1:8000/index/',files={'myfile':open('a.jpg','rb')})
print(res.text)

模拟登录网站

#网站地址http://www.aa7a.cn/
    import requests
    session=requests.session()
    data = {
        'username': '616564099@qq.com',
        'password': 'lqz123',
        'captcha': 'zdu4',#验证码
        'remember': 1,
        'ref': 'http://www.aa7a.cn/user.php?act=logout',
        'act': 'act_login',
    }
    rest = session.post('http://www.aa7a.cn/user.php',data=data)
    print(rest.text)
    # 拿到cookie
    cookie=rest.cookies
    print(cookie)

    # 携带着cookies,表示登录了,页面中会有我们的用户信息616564099@qq.com
    rest1=session.get('http://www.aa7a.cn/index.php')
    print('616564099@qq.com' in rest1.text)

爬取梨视频

#网站地址https://www.pearvideo.com/
    import requests
    import re

    res=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=1&start=0')

    # print(res.text)
    re_video='<a href="(.*?)" class="vervideo-lilink actplay">'#正则匹配视频地址
    video_urls=re.findall(re_video,res.text)#去res.text找视频地址
    # https://www.pearvideo.com/
    # print(video_urls)

    for video in video_urls:
        url='https://www.pearvideo.com/'+video
        print(url)
        # 向视频详情发送get请求
        res_video=requests.get(url)
        # print(res_video.text)
        # break
        re_video_mp4='hdUrl="",sdUrl="",ldUrl="",srcUrl="(.*?)",vdoUrl=srcUrl,skinRes'
        video_url=re.findall(re_video_mp4,res_video.text)[0]
        print(video_url)
        video_name=video_url.rsplit('/',1)[-1]
        print(video_name)
        res_video_content=requests.get(video_url)
        with open(video_name,'wb') as f:
            for line in res_video_content.iter_content():
                f.write(line)
原文地址:https://www.cnblogs.com/linqiaobao/p/13508713.html