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())