requests模块介绍

requests模块发送get请求

复制代码
# 所有语言都可以做爬虫---》python简单一些---》库多
# 模拟发送http请求的库,requests库----》大佬基于python内置库 urllib(麻烦) 封装--》requests

# 安装
pip3 install requests

# 模拟发送get请求
import requests

res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html')
print(res.text)  # 响应体的内容打印出来了
复制代码

get请求中携带参数

复制代码
## 2 get 请求中携带参数
# res=requests.get('https://www.cnblogs.com/liuqingzheng/p/16005866.html',
#                  params={'name':'lqz','age':18}
#                  )
# # ?name=lqz&age=18拼到路径后面
# print(res.text)  # 响应体的内容打印出来了
# url编码和解码
# https://www.baidu.com/baidu?wd=python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81

# 把字段中文编码后转成 name=%E5%88%98%E6%B8%85%E6%94%BF&age=18
# from urllib.parse import urlencode
# d={'name':'刘清政','age':18}
# res=urlencode(d)
# print(res)

# 只想单独对中文编码和解码
from urllib.parse import quote, unquote

# 编码
# name='刘清政'
# res=quote(name)
# print(res)

# 解码
# s='python%20url%E7%BC%96%E7%A0%81%E5%92%8C%E8%A7%A3%E7%A0%81'
# print(unquote(s))
复制代码

 

携带请求头

复制代码
# 3 携带请求头
# 携带请求头-->重要的key:
# User-Agent:客户端浏览器的类型版本信息,操作系统版本---》django中如何取出请求头--》META---》中间件--》存到数据库--》饼形图--》统计你们网站近一个月客户端类型
# referer:图片防盗链 Referer: https://www.lagou.com/wn/zhaopin
# 记录的是上一个访问的地址---》反扒:如果上一个访问的地址不是自己的地址,认为不是正常请求就禁止


# header = {
#     'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
#     # 'Accept-Encoding': 'gzip, deflate, br',
# }
# res = requests.get('https://dig.chouti.com/',headers=header)
# with open('chouti.html','wb') as f:
#     f.write(res.content)
# print(res.text)
复制代码

携带cookie

复制代码
## 本身cookie是请求头中的值,那么就可以执行放在请求头中,但是cookie经常用,也可以单独是一个参数
# 模拟点赞
header = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
    # 'Cookie': ""
}
data={
    'linkId': '34934736'
}
# res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header)
res = requests.post('https://dig.chouti.com/link/vote',data=data,headers=header,cookies={'key':'value'})
print(res.text)
复制代码

发送post请求模拟登录

复制代码
#5  模拟登陆某网站
# data = {
#     'username': '616564099@qq.com',
#     'password': 'lqz123',
#     'captcha': 'kyca',
#     'remember': 1,
#     'ref': 'http://www.aa7a.cn/',
#     'act': 'act_login',
# }
# res = requests.post('http://www.aa7a.cn/user.php',data=data)
# print(res.text)
# print(res.cookies) # 登陆成功返回的cookie,这个cookie是登陆过后的,以后拿着这个cookie就可以模拟登陆后操作
#
# res2=requests.get('http://www.aa7a.cn/',cookies=res.cookies)
# print('616564099@qq.com' in res2.text)

# 每次都要手动携带cookie,麻烦,使用requests提供的session 方法

# session=requests.session()
# # 以后需所有请求都用session对象发送,不需要手动处理cookie
# data = {
#     'username': 'ee@qq.com',
#     'password': 'lqz123',
#     'captcha': 'kyca',
#     'remember': 1,
#     'ref': 'http://www.aa7a.cn/',
#     'act': 'act_login',
# }
# res = session.post('http://www.aa7a.cn/user.php',data=data)
# print(res.text)
# print(res.cookies) # 登陆成功返回的cookie,这个cookie是登陆过后的,以后拿着这个cookie就可以模拟登陆后操作
# 
# res2=session.get('http://www.aa7a.cn/')
# print('616564099@qq.com' in res2.text)
复制代码

响应对象

复制代码
## 6 响应对象
import requests
respone=requests.get('http://www.jianshu.com')
# respone属性
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())

print(respone.url) # 请求地址
print(respone.history) # 了解---》如果有重定向,列表,放着重定向之前的地址

print(respone.encoding) # 页面的编码方式:utf-8   gbk
# response.iter_content()  # content迭代取出content二进制内容,一般用它存文件
复制代码

编码问题

# 请求回来的数据,res.text 打印的时候乱码 ,因为没有指定编码,默认已utf-8编码
# 解决
response.encoding='gbk'

获取二进制数据

复制代码
# 下载图片,视频
# 下载图片
header={
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36'
}

res=requests.get('https://tva1.sinaimg.cn/mw2000/9d52c073gy1h1v6lmny8nj20j60pjtdh.jpg',headers=header)
with open('mv.jpg','wb') as f:
    # f.write(res.content)
    for line in res.iter_content(100):
        f.write(line)
复制代码

解析json

复制代码
## 8 json格式解析
import json

data = {
    'cname': '',
    'pid': '',
    'keyword': '上海',
    'pageIndex': 1,
    'pageSize': 10,
}
# res = requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data)
# j = json.loads(res.text)
# print(j['Table'][0]['rowcount'])

res= requests.post('http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword',data=data).json()
print(res['Table'][0]['rowcount'])
复制代码

ssl认证

复制代码
# 之前网站,有些没有认证过的ssl证书,我们访问需要手动携带证书
# 跳过证书直接访问
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)
# 手动携带
import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)
复制代码

搭建代理池

复制代码
# https://github.com/jhao104/proxy_pool
    -python的爬虫+flask写的
  -本质使用爬虫技术爬取免费的代理,验证--》requests模块验证---》存到redis中
  -起一个web服务器,只要访问一个地址,他就随机给你一个ip地址
  
  
# 步骤:
    第一步:git clone git@github.com:jhao104/proxy_pool.git
  第二步:安装依赖:pip install -r requirements.txt
  第三步: 修改代码,修改配置
  # setting.py 为项目配置文件
  # 配置API服务

  HOST = "0.0.0.0"               # IP
  PORT = 5000                    # 监听端口


  # 配置数据库

  DB_CONN = 'redis://:pwd@127.0.0.1:8888/0'


  # 配置 ProxyFetcher

  PROXY_FETCHER = [
      "freeProxy01",      # 这里是启用的代理抓取方法名,所有fetch方法位于fetcher/proxyFetcher.py
      "freeProxy02",
      # ....
  ]
  
  
  第四步:启动爬虫
      python3 proxyPool.py schedule
  第五步:启动服务
    # 启动webApi服务
    python proxyPool.py server
复制代码

 

使用代理

proxies = {
    'http': '39.103.217.44:59886', # http或https代理
}
respone=requests.get('https://www.baidu.com',proxies=proxies)

print(respone.status_code)

 

复制代码
# # 代理测试

import requests
# http://127.0.0.1:5010/get/
ip="http://"+requests.get('http://139.155.237.73:5010/get/').json()['proxy']
print(ip)
proxies = {
    'http': ip,
}
res=requests.get('http://47.104.165.24:8001/check/',proxies=proxies)
print(res.text)
复制代码

超时设置

复制代码
import requests
# http://127.0.0.1:5010/get/
ip="http://"+requests.get('http://139.155.237.73:5010/get/').json()['proxy']
print(ip)
proxies = {
    'http': ip,
}
res=requests.get('http://47.104.165.24:8001/check/',proxies=proxies,timeout=1)
print(res.text)
复制代码

认证设置

复制代码
# 这种很少见,极个别公司内部可能还用这种

import requests
from requests.auth import HTTPBasicAuth
r=requests.get('xxx',auth=HTTPBasicAuth('user','password'))
print(r.status_code)

#HTTPBasicAuth可以简写为如下格式
import requests
r=requests.get('xxx',auth=('user','password'))
print(r.status_code)
复制代码

异常处理

复制代码
from requests.exceptions import * #可以查看requests.exceptions获取异常类型

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
# except ConnectionError: #网络不通
#     print('-----')
# except Timeout:
#     print('aaaaa')

except Exception:
    print('Error')
复制代码

上传文件

复制代码
# 上传文件--》爬虫一般不会用,但是咱们服务会用
import requests
files={'file':open('a.jpg','rb')}
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)

# 咱们django项目
    -你们公司项目,使用了第三方服务,第三放服务提供了api接口,没提供sdk
  -就要使用request发送请求,获取数据

 # 前端提交一个长链地址  www.cnblogs.com/liuqingzheng/p/233.html--->转成短链--》x.com/asdf--->存到自己数据库中

# 专门服务,处理长连转短链(go,java)---》接口--》post,带着地址---》返回json,短链地址
复制代码

 

使用request爬取梨视频

复制代码
# re 解析想要的数据
# import requests
# res=requests.get("https://www.pearvideo.com/")
# print(res.text)
https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=130&start=72&mrd=0.04420865436910293&filterIds=1761413,1761302,1761419,1756340,1756343,1756342,1756344,1756346,1756345,1756349,1756348,1756350,1756352,1756351,1756354

# https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=24
import requests
import re
res=requests.get('https://www.pearvideo.com/category_loading.jsp?reqType=5&categoryId=8&start=24')
# print(res.text)
# 解析出页面中所有的视频地址
/html/body/div[2]/div[1]/div[1]/div[1]/div[1]

video_list=re.findall('<a href="(.*?)" class="vervideo-lilink actplay">',res.text)
# print(video_list)
for video in video_list:
    video_url='https://www.pearvideo.com/'+video
    video_id=video_url.split('_')[-1]
    header={
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36',
        'Referer': video_url
    }
    # 第一层反扒是加refer
    res_video=requests.get('https://www.pearvideo.com/videoStatus.jsp?contId=%s&mrd=0.7113776105084832'%video_id,headers=header)
    mp4_url=res_video.json()['videoInfo']['videos']['srcUrl']

    # 第二层反扒是把不能播放地址变成能播放地址
    mp4_url = mp4_url.replace(mp4_url.split('/')[-1].split('-')[0], 'cont-%s' % video_id)
    print(mp4_url)
    # 下载到本地
    res_video_detail=requests.get(mp4_url)
    with open('./video/%s.mp4'%video_id,'wb') as f:
        for line in res_video_detail.iter_content(1024):
            f.write(line)


# 单线程下载,速度不快,全是io操作,开启多线程能够显著提高速度---》使用多线程全站下载视频
# 线程池整站爬取


# 不能播放的地址
# https://video.pearvideo.com/mp4/third/20220314/1652060493892-10097838-231626-hd.mp4
# https://video.pearvideo.com/mp4/third/20220314/    cont-1754713     -10097838-231626-hd.mp4

# mp4_url='https://video.pearvideo.com/mp4/third/20220314/      1652060493892   -10097838-231626-hd.mp4'
# mp4_url=mp4_url.replace(mp4_url.split('/')[-1].split('-')[0],'cont-%s'%video_id)
复制代码

 

posted @   椰子皮0oo0  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
1
点击右上角即可分享
微信分享提示