目 录
虽然Python的标准库urllib模块已经包含了平常我们使用的大多数功能,但它的API使用起来不够简洁、明晰。第三方Requests库更加符合Python的精神,Requests库宣传口号是”HTTP for Humans(让 HTTP 服务人类)“,代码简洁,使用更迅捷、方便。
学习参考:
中文文档:https://requests.readthedocs.io/zh_CN/latest/
Github:https://github.com/requests/requests
一、安装Requests第三方库
我用的是win10,Win+R输入cmd进入控制台,输入下面命令安装:
pip install requests
Python官方源安装特别慢,还经常失败,我以前安装PyQt5就是这样,无论如何都不成功。通过百度发现,国内镜像安装速度快、成功率高,安装时使用 -i 参数指定镜像地址:
pip install requests -i https://pypi.douban.com/simple/
- 可能是自己宽带的问题,通过测试,豆瓣安装最快。
- 安装第三方库国内镜像地址:
豆瓣:http://pypi.douban.com/simple/
阿里云:http://mirrors.aliyun.com/pypi/simple/
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
上面是临时使用镜像,也可以永久使用镜像源:
在win10系统中,打开用户目录,再打开你名字的用户(可能有人没有建立自己的用户帐号,那就直接打开Administrator目录),在其下建立pip子目录,再在pip目录下新建文件pip.ini,在其中输入如下内容、保存:
[global]
index-url = https://pypi.douban.com/simple/
[install]
trusted-host=mirrors.aliyun.com
二、 requests的主要方法
获取HTML网页的主要方法,对应于HTTP的GET:
requests.get()
获取HTML网页头信息的方法,对应于HTTP的HEAD:
requests.head()
向HTML网页提交POST请求的方法,对应于HTTP的POST:
requests.post()
向HTML网页提交PUT请求的方法,对应于HTTP的PUT:
requests.put()
向HTML网页提交局部修改请求,对应于HTTP的PATCH:
requests.patch()
向HTML页面提交删除请求,对应于HTTP的DELETE:
requests.delete()
- Python爬虫编程主要使用GET和POST。
三、GET请求
- get()方法
requests.get(url, params=None, **kwargs)
首先,必须导入requests模块:
import requests
1、基本get()请求
通过requests.get()发送最基本的get请求,建立Response对象:
import requests
response = requests.get('http://www.baidu.com/')
2、带参数get()请求:
通过requests.get()发送带有headers和查询参数的请求,可以指定header参数、params参数:
# -*- encoding: utf-8 -*-
import requests
# 定义参数字典
kw = {'wd': 'python'}
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 发送get请求
response = requests.get('http://www.baidu.com/s', params=kw, headers=headers)
#查看Response对象属性:
print(response.status_code) # 状态码 200
print(response.headers['content-type']) # 请求头 text/html
print(response.encoding) # 网页编码 'ISO-8859-1'
print(response.text) # 查看网页内容,自动解码Unicode格式
print(response.content) # 查看网页内容,返回bytes格式
# print(response.json()) # 如果是json格式
print(response.url) # 查看完整url
print(response.cookies) # 查看cookie
3、response.text属性和response.content属性的区别
在某些情况下来说,response.text 与 response.content 都是来获取response中的数据信息,效果看起来差不多。那么response.text 和 response.content 到底有哪些差别? 什么情况下该用 response.text 什么情况下该用 response.content ?
- 返回的数据类型不同:
a) response.text 返回的是一个 unicode 类型的文本数据
b) response.content 返回的是 bytes 类型的二进制数据
也就是说如果想取文本数据可以通过response.text 如果想取图片、文件,则可以通过 response.content
- 编码方式不同,response.content 返回的是二进制响应内容,修改编码方式:
-
response.content.decode('utf-8')
response.text 则是自动猜测网页编码,服务器不指定的话是根据网页的响应来猜测编码。修改编码方式:
response.encoding = 'utf-8'
代码示例:
# -*- coding: utf-8 -*-
import requests
response=requests.get('https://www.baidu.com/')
# print(response.cookies)
print(response.content.decode('utf-8'))
print('-'*30)
print(response.text)
四、POST请求
简言之,post请求就是向服务器提交数据。
- post()方法:
requests.post(url, data=None, json=None, **kwargs)
1、基本POST请求
response = resquests.post(url, data=data)
使用requests.post()方法,如果返回的是jaon数据,可以调用"requests.json()"方法将json字符串转换为字典或者是列表。
2、post请求实例
以拉钩网为例发送post请求。在浏览器(Google Chrome)打开拉钩网站,按F12进行网页分析,发现该网站要求post请求,需要传递表单参数first、pn、kd,示例如下:
# -*- encoding: utf-8 -*-
import requests
# 定义表单数据
data = {
'first': 'true',
'pn': '1',
'kd': 'python'
}
# 定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
url = 'https://www.lagou.com/jobs/positionAjax.json?needAddtionalResult=false'
# 发送post请求
response = resquests.post(url, data=data, headers=headers)
print(type(response.json()))
print(response.json()) # 调用json()方法
五、Request库使用代理
百度百科:代理服务器(Proxy Server)的功能是代理网络用户去取得网络信息。形象地说,它是网络信息的中转站,是个人网络和Internet服务商之间的中间代理机构,负责转发合法的网络信息,对转发进行控制和登记。
1、设置方法
requests.get(url,data=data,headers=headers,proxies=proxy)
在请求get()或post()方法中,传递"proxies="参数,参数可以是一个字符串,也可以是字典。
- 代理服务器有收费的,也有免费的,学习过程中可以使用免费的、高匿的,如果在工作上就要用收费的了,毕竟收费不高,且快速、稳定、高匿。
2、代理服务器设置示例
# -*- encoding: utf-8 -*-
import requests
from fake_useragent import UserAgent
url = 'https://nanning.anjuke.com/sale/p1/#filtersort' # 南宁安居客二手房第一页
# 定义代理IP字典,如果代理足够多,可从文件中读取
proxy = {
'http://': '113.120.38.24:9999',
'https://': '113.120.38.24:9999',
'http://': '110.243.28.67:9999',
'https://': '110.243.28.67:9999'
}
ua = UserAgent() # 自动生成请求头
headers = {'User-Agent': ua.random}
# 发送请求
response = requests.get(url, headers=headers, proxies=proxy)
text = response.text
print(text) # 查看内容
- 我在Python3.7、3.8设置代理时如果只是{‘http’: ‘113.120.38.24:9999’}就会报错,非常奇怪,必备是{‘http://’: ‘113.120.38.24:9999’}才行,不知道怎么回事。
六、Cookie
百度百科:Cookie 并不是它的原意“甜饼”的意思, 而是一个保存在客户机中的简单的文本文件, 这个文件与特定的 Web 文档关联在一起, 保存了该客户机访问这个Web 文档时的信息, 当客户机再次访问这个 Web 文档时这些信息可供该文档使用。
1、取得Cookie
1)打开浏览器,按F12,选择Network,输入目标网址,一般是选择刷出来的第一项,然后选Header,找到Cookie复制就行了;
2)代码获取:
# -*- encoding: utf-8 -*-
import requests
response = requests.get('http://www.baidu.com/')
cookie = response.cookies.get_dict()
print(cookie)
2、Session会话
如果要在多次请求中共享cookie,需要使用Session()方法建立会话、发送请求:
# -*- encoding: utf-8 -*-
import requests
url = 'http://www.renren.com/PLogin.do'
data = {'email': '542657258@qq.com', 'password': 'pythonspider'}
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
# 建立Session会话
session = requests.Session()
# 用Session对象发送请求
session.post(url,data=data, headers=headers)
#请求二级页面查看是否登录成功
response = session.get('http://www.renren.com/880151247/profile')
# 将源码保存到文件以便使用
with open('renren.html', 'w', encoding='utf-8') as f:
f.write(response.text)
- 处理不信任的SSL证书
非常简单,在请求时设置verify=False就行了:
response = requests.get(url,verify=False)
说明:本学习笔记根据晚上观看学习B站乐林贝斯发布的视频《Python爬虫】新手强烈推荐:Python爬虫教程,学爬虫这一套就够了》,白天学习CSDN博主【[数挖小飞飞]的《Python网络爬虫数据采集实战》博客所记录,非常感谢!
笔记系列:
Python3爬虫编程学习笔记(一)缘由
Python3爬虫编程学习笔记(二)爬虫原理
Python3爬虫编程学习笔记(三)学习urllib库基本用法