requests学习笔记

requests学习笔记

文章目录

  • requests学习笔记
    • 1. 基础
      • 请求方式:
      • 请求头
      • 请求体
    • 2. get请求
      • 2.1 传入params数据
      • 2.2 抓取二进制文件
      • 2.3 添加请求头
    • 3. Post请求
    • 4. 文件上传
    • 5. Cookie设置以及SSL证书验证
    • 6. 超时设置
    • 7.身份验证
    • 8. 代理设置
    • 9. Session维持
    • 9. 实战演示
      • 9.1 学习通登录
      • 9.2 (免费)代理的使用,并排除不可用的

1. 基础

首先下载requests包

pip install requests

请求方式:

  1. get

请求参数放在url后面

参数会被编码成二进制数据

  1. post

请求参数放在form Data表单数据

  1. 其他的请求方式HEAD,PUT,DELETE,OPTIONS

请求头

包含了请求时的头部信息,如user-agent,host,cookie等

请求体

请求时额外的数据,如表单提交的数据

import requests

req = requests.get("https://www.baidu.com/")
# 输入请求的url
print(req.url)
# 以文字形式输出,设置编码格式可以通过head标签内的charset=utf-8
req.encoding = 'utf-8'
print(req.text)
# 以二进制的形式输出
print(req.content)
# 返回响应的状态码
print(req.status_code)
# 返回请求头
print(req.headers)

2. get请求

2.1 传入params数据

我们在必应搜索时可以发现https://cn.bing.com/search**?q=Python**

后面传入了params内容,如果每次都需要我们人为的在网页后面添加,那么就显得太麻烦了,但是requests可以通过设置params的值的传入来修改

import requests

# 这个网页可以判断请求是否为get请求,如果是就会返回相应的请求信息
params = {
    'name': 'mike',
    'age': '20'
}
req = requests.get('https://www.httpbin.org/get', params=params)
print(req.text)
print(req.url)
'''
运行结果,可以看到params的内容已经传入,而且url也自动变成了https://www.httpbin.org/get?name=mike&age=20
{
  "args": {
    "age": "20", 
    "name": "mike"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-644fe045-75277fe35a3fe2af4af2f6b7"
  }, 
  "origin": "36.143.62.142", 
  "url": "https://www.httpbin.org/get?name=mike&age=20"
}

https://www.httpbin.org/get?name=mike&age=20
'''

2.2 抓取二进制文件

这里我们演示的是抓取logo图片,其他二进制文件也一样

import requests

'''
网页的图片 视频 音频等都是以二进制的形式存储,那么最快将其保存到本地的方法就是抓取二进制数据写入本地文件
'''
# 以CSDN的logo为例
req=requests.get('https://img-home.csdnimg.cn/images/20201124032511.png')
with open('logo.png','wb') as f:
    # 二进制数据用content
    f.write(req.content)

然后项目下的文件内就多了一个logo.png的文件

打开后可以看到图片已经被爬取下来了

requests学习笔记_第1张图片
requests学习笔记_第2张图片

2.3 添加请求头

某些网页在打开时会出现返回结果异常,导致网页抓取失败,很有可能是没有发送请求头

默认请求头 “User-Agent”: “python-requests/2.28.2”

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.64'
}
req = requests.get('https://www.baidu.com/',headers=headers)
# 打印出headers中的User-Agent值
print(req.request.headers['User-Agent'])

3. Post请求

相似于get请求,但是请求的内容是隐蔽的,不会让人直接看到

data={
    'name':'mike',
    'age':'20'
}
req=requests.post('https://www.httpbin.org/post',data=data)
print(req.text)
'''
运行结果
{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "age": "20", 
    "name": "mike"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "16", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-64508974-6097b14d2006be36054b4282"
  }, 
  "json": null, 
  "origin": "36.143.62.142", 
  "url": "https://www.httpbin.org/post"
}
'''

4. 文件上传

我们在一些有上传需求的网页时可以在新增file值

基于post请求

file = {
    'file': open('logo.png', 'rb')
}
req = requests.post('https://www.httpbin.org/post', files=file)
print(req.text)
'''
输出文件多了一个file,由于篇幅太长就不打印了
{
  "args": {}, 
  "data": "", 
  "files": {
    "file": "data:application/octet-stream;base64,iVBO……
  }, 
  "form": {}, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate, br", 
    "Content-Length": "8076", 
    "Content-Type": "multipart/form-data; boundary=24025866637ba27c97048c8ccf051d2b", 
    "Host": "www.httpbin.org", 
    "User-Agent": "python-requests/2.28.2", 
    "X-Amzn-Trace-Id": "Root=1-645089a9-69bc939f1bfcf5b72c1f044e"
  }, 
  "json": null, 
  "origin": "36.143.62.142", 
  "url": "https://www.httpbin.org/post"
}

'''

5. Cookie设置以及SSL证书验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnSqJXV4-1683002360002)(D:\我的坚果云\python学习\python爬虫\图片\QQ截图20230502120153.png)]

我们可以按f12进入开发者选项点击网络,在出现请求里点一个xhr类型的请求,就可以看到本地的cookie


SSL证书验证:

在出现这个错误时

requests.exceptions.SSLError: HTTPSConnectionPool(host=‘ssr3.scrape.center’, port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)’)))

需要使用

'''通过设置cookie模拟登录,会出现SSL证书错误
可以通过设置verify=True去使其不验证证书,但是会出现警告
可以通过urllib3.disable_warnings()去忽略警告
也可以指定本地证书去用作客户端的证书,这里就不展示了
'''
urllib3.disable_warnings()
headers = {
    'Cookie': '输入你的值'
}
req = requests.get('https://github.com/', headers=headers,verify=False)
print(req.text)

6. 超时设置

传入timeout参数

'''
对timeout的值进行赋值设置超时时会抛出异常--'Read timed out'
请求分为连接和读取两个过程
timeout可以传入元组(1,5)分别用作两个过程的值
'''
req=requests.get('https://www.baidu.com',timeout=0.01)

7.身份验证

首先导入from requests.auth import HTTPBasicAuth

这个可以实现登录功能

req = requests.get('https://ssr3.scrape.center/', auth=HTTPBasicAuth('admin', 'admin'), verify=False)
print(req.status_code)
print(req.text)

8. 代理设置

为什么使用代理*:
* 在多次请求同一个网站时*,会有可能出现一些验证码验证或者登录,甚至封ip,*为了解决这种情况我们可以使用代理

代理分为免费代理和付费代理,一般在网上可以找得到,具有时效性,付费代理只有你一个人使用比较稳定,免费代理可能就会有一些问题

proxies={
    'http':'http://112.250.107.37:1080',
    'https':'https://51.222.21.92:1080'
}
req = requests.get('',proxies=proxies)

我们在网上找到的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CaIqq4v-1683002360002)(D:\我的坚果云\python学习\python爬虫\图片\image-20230502121230491.png)]

可以看到有ip和port还有类型

因此我们的格式也是这样

‘类型’:‘类型://ip:port’

9. Session维持

使用https://www.httpbin.org/cookies来检测

**注意:**这个网页可能比较慢,请耐心多试几次

'''
我们在打开网页时,第一次请求可能打开了一个网页,第二次请求打开了不同的页面,这是因为两次请求的Session不同,
解决方法:
1. 设置Cookie 缺点:繁琐
'''
import requests

requests.get('https://www.httpbin.org/cookies/set/name/123')
req=requests.get('https://www.httpbin.org/cookies')
print(req.text)
'''
输出:
{
  "cookies": {}
}
可以发现这里的cookie并不能保存
'''
req1=requests.Session()
req1.get('https://www.httpbin.org/cookies/set/name/123')
req2=requests.get('https://www.httpbin.org/cookies')
print(req2.text)
'''
输出:
{
  "cookies": {
    "name": "123"
  }
}
'''

9. 实战演示

9.1 学习通登录

这里就出现网页对cookie的验证问题,因此仅仅靠 auth=HTTPBasicAuth(‘账号’, ‘密码’)是不够的,还要传入cookie值

import requests
from requests.auth import HTTPBasicAuth


headers = {
    'Cookie':'你的cookie'
}
req = requests.get('http://i.chaoxing.com/base?t=1619006147586', headers=headers,
                   auth=HTTPBasicAuth('账号', '密码'))
print(req.status_code)
print(req.text)

9.2 (免费)代理的使用,并排除不可用的

requests学习笔记_第3张图片

这是在这个网站上找到的内容,IP提取结果_免费代理IP_免费HTTP代理IP_SOCKS5代理服务器_优质IP代理_89免费代理IP (89ip.cn)

接下来我们要先爬取这些网页上的值,然后将其中不能使用的代理进行排除

import requests
from parsel import Selector

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.64'
}
req = requests.get('https://www.89ip.cn/tqdl.html?num=60&address=&kill_address=&port=&kill_port=&isp=')
selector = Selector(text=req.text)
items = selector.xpath('/html/body//div[3]/div[1]/div/div/text()')
i = 1
proxie = []
for item in items:
    print(i, item.get().strip())
    proxie.append(item.get().strip())
    i += 1
for i in proxie[:-2]:
    proxies = {
        'http': 'http://' + i,

    }
    print(proxies)
    try:
        r = requests.get('https://movie.douban.com/top250', headers=headers, proxies=proxies, timeout=1)
        print(r.status_code)
        if r.status_code != 200:
            proxie.remove(i)
    except:
        proxie.remove(i)
        print("failed:{}".format(i))

print(len(proxie))

你可能感兴趣的:(python爬虫,学习,笔记,python)