03-爬虫基本库-requests库

requests库
Requests:让HTTP服务人类
虽然python的标准库中urllib模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人感觉不太好,而Requests宣传是"HTTP for Humans",说明使用起来更简洁方便
Requests是用python语言编写,基于urllib,但是它比urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求

注意:requests库不是python自带的标准库,需要安装

pip install requests

 

一、请求(get和post)

 1.get请求(不带参数的请求)一般情况下,只从服务器获取数据下来,并不会对服务器资源产生任何影响的时候会使用get请求

# 发送GET请求

import requests
# 导入伪造User-Agent库
from fake_useragent import UserAgent

url = "https://www.baidu.com/"

# 添加请求头
user_agent = UserAgent()
headers = {
    "User-Agent":user_agent.chrome
}

response = requests.get(url,headers=headers)
content = response.content.decode("utf-8")
# print(content)

# 打印状态码
print("打印状态码:",response.status_code)
# 打印真实url
print("打印真实url:",response.url)

 2.get请求(带params参数的请求)一般情况下,只从服务器获取数据下来,并不会对服务器资源产生任何影响的时候会使用get请求

params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()或者quote()进行编码

# 实例:百度贴吧搜索指定内容

import requests
# 导入伪造User-Agent库
from fake_useragent import UserAgent

# url = "https://tieba.baidu.com/f?kw=尚学堂&ie=utf-8"
url = "https://tieba.baidu.com/f?"
content = input("请输入要查询的贴吧内容:")

# params参数
args = {
    "ie":"utf-8",
    "kw":content
}

# 添加请求头
user_agent = UserAgent()
headers = {
    "User-Agent":user_agent.chrome
}

response = requests.get(url,headers=headers,params=args)
# 查询响应内容(response.text是字符串类型,response.content是bytes类型)
print("查询响应内容:",type(response.text))
print("查询响应内容:",type(response.content))
print("查询响应内容:",type(response.content.decode("utf-8")))

# 打印状态码
print("\n打印状态码:",response.status_code)
# 真实的url地址
print("\n真实的url地址:",response.url)

3.post请求:向服务器发送数据(登录)、上传文件等,会对服务器资源产生影响的时候,会使用post请求

# 发送post请求,模拟登录百度贴吧

import requests
from fake_useragent import UserAgent

post_url = "https://passport.baidu.com/v2/api/?login"

# 表单数据
data = {
    "username":"15798017910",
    "password":"N4PAmFUaOXj2AMO2qJZDwkD978E0MR17PmjZL5A5Av+YKIIzTEgvCP+hL+omCHwEr9I/fdQpJtJW3eKti6zew33UCu+nFOcDrlnhBAfeIp3moV/ACdJlgj8jq6h8jsY2LCZEiiPd4eqYHPGvpJW/3rzsST1ILn9GAMtc93zY//U=",
}

# 请求头
user_agent = UserAgent()
headers = {
    "User-Agent":user_agent.chrome
}

#requests库,不需要再把data进行encode编码
response = requests.post(post_url,headers=headers,data=data)
print(response)

 

二、代理IP(ProxyHandler处理器,解决封ip问题)

requests库使用代理IP
使用requests添加代理也非常简单,只要在请求的方法中(比如get或者post)传递proxies参数就可以了

 

ProxyHandler处理器(解决封ip问题)

代理原理:在请求目的网站之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目前的网站的数据后,再转发给我们的代码

很多网站会检测某一时间某个IP的访问次数(通过流量统计,系统日志等),如果访问的次数多的不像正常人,它会禁止这个IP的访问
http://httpbin.org :查看http请求的一些参数

1.查看客户端向服务端发送的User-Agent:

http://httpbin.org/user-agent

2.查看客户端向服务端发送的IP地址:

http://httpbin.org/ip

 

目前我们常用的代理:至流科技

http://www.zhuzhaiip.com/

# 代理ip测试(requests库)
# 代理的原理:在请求目的网络之前,先请求代理服务器,然后让代理服务器去请求目的网站,代理服务器拿到目的网站的数据后,再转发给我们的代码
# 我们这里使用至流科技来购买代理ip,http://www.zhuzhaiip.com/#/index

import requests
from lxml import etree
from fake_useragent import UserAgent

url = "http://httpbin.org/ip"

user_agent = UserAgent()
headers = {
    "User-Agent":user_agent.chrome
}

# 对获取到的数据进行处理
def get_deal_ip(data):
    ip = data[0].replace("\n","").strip().split('"')[3]
    return ip

# 1.没有使用代理
response = requests.get(url,headers=headers)
data = response.content.decode("utf-8")
# 使用xpath提取ip内容
data_content = etree.HTML(data)
data_ip = data_content.xpath("//body//text()")
ip = get_deal_ip(data_ip)
print("没有使用代理时IP为:",ip)


# 2.使用代理
# 通过proxies参数设置代理
proxies={
    "http":"222.186.180.115:37358"
}

# 使用代理IP进行访问
response = requests.get(url,headers=headers,proxies=proxies)
data = response.content.decode("utf-8")
# 使用xpath提取ip内容
data_content = etree.HTML(data)
data_ip = data_content.xpath("//body//text()")
ip = get_deal_ip(data_ip)
print("正在使用代理时IP为:",ip)

三、Cookie

什么是cookie:
是指某些网站为了辨别用户身份、进行跟踪二存储再用户本地终端上的数据,cookie存储的数据量有限,不同的游览器有不同的存储大小,但一般不超过4KB。因此使用cookie只能存储一些小量的数据

当一个用户user对服务器进行请求时:
1>第一次请求,服务器发现没有id,分配给用户user一个id = 1
2>第二次请求,用户user带上cookie中的id = 1, 服务器看到id是1,取出1的信息

cookie的格式
Set-Cookie:NAME=VALUE;Expires/Max-age=DATE;Path=PATH;Domain=DOMAIN_NAME;SECURE

参数意义
NAME:cookie的名字
VALUE:cookie的值
Expires:cookie的过期时间
Path:cookie作用的路径
Domain:cookie作用的域名
SECURE:是否只在https协议下起作用

Request Headers请求头的Cookie,它表示的是http请求报文通过Cookie字段通知我们的服务端(给服务端通知的数据)
Response Headers响应头的Set-Cookie,它指的是http响应报文通过Set-Cookie通知我们的客户端,需要保存的cookie数据(通知客户端保存数据)

 

在爬虫时,爬取一些需要登录认证的网页,如何解决使用cookie模拟登录

1.第一种解决方案,用浏览器访问,将浏览器中Request Headers请求头的Cookie信息保存下来,放到我们的请求头

2.第二种解决方法:使用requests库给我们提供的session对象

session对象
对比前面的urllib库中opener发送多个请求,我们的requests库中也有session达到共享cookie的目的
使用requests库给我们提供的session对象,也可以达到共享cookie的目的


注意:这里的session不是web开发中的那个session,这个地方只是一个会话的对象而已

# 案例2.使用session模拟登录百度贴吧

import requests
from fake_useragent import UserAgent

# 1.登录
post_url = "https://passport.baidu.com/v2/api/?login"

user_agent = UserAgent()
headers = {
    "User-Agent":user_agent.chrome,
    "Host":"passport.baidu.com",
}

post_data = {
    "username":"15798017910",
    "password":"Esj2VjQqdmaXe5Ldxx3VdzN7Hlb837TfTG05zQoooahlv9lISjSc3/nfWfc2lngE7L1vmQ76zprJFbb5MALoobdpN5NU8hk0Bv51TdpVuTICv+J3uZv6oXya6b+3FfjqJQmsun4yfRlp3Yl0yiA33HMx5/BFhK+FD9a27xpamlg="
}

# 创建一个会话对象
session = requests.session()
# 使用会话对象,发送一个post请求
session.post(post_url,headers= headers,data=post_data)

# 注意:这里是完成了第一次请求,session保存了第一次输入账户密码的cookie数据


# 2.访问个人页面(使用session保存的cookie信息访问个人页面)
url = "http://tieba.baidu.com/"

resp = session.get(url,headers=headers)
print(resp.content.decode("utf-8"))

处理不信任的SSL证书
对于那些已经被信任的SSL证书的网站,比如https://www.baidu.com/ ,那么使用requests直接就可以返回正常的返回响应

import requests

# 访问一个不被信任的网站
url = "https://inv-veri.chinatax.gov.cn/"
resp = requests.get(url,verify=False)
print(resp.content.decode())

 

posted @ 2021-03-04 15:00  马铃薯1  阅读(196)  评论(0编辑  收藏  举报