本节内容
模块的安装
----------------------- 基础用法 ---------------------
GET 用法, POST 用法
----------------------- 进阶用法 --------------------
cookie 处理, 代理 ip,session
一 模块安装:
1). 安装 requests 包还是很方便的, 电脑中有 python 环境, 打开 cmd, 输入 pip install requests 下载;
如果有同学使用 pycharm 的话, 选择 file-->setting-->Project interpreter-->右边 "+" 号点击 --->输入模块名 ---->选中下载.
2). requests 的作用, 特点, 以及使用流程
作用: 模拟用户使用浏览器上网
特点: 简单, 高效
使用流程:
指定 url;
发起请求(requests.get/post);
获取响应信息 / 数据(response);
持久化存储(保存 CSV,MySQL,txt 等);
二基本用法:
1). get(url,headers,params): 各用法
获取搜狗首页的页面数据:
- import requests #引包
- #1 指定 url
- url = 'https://www.sogou.com/'
- #2. 发起请求
- response = requests.get(url=url)
- #3 获取响应数据
- page_text = response.text #text 返回的是字符串类型的数据
- #持久化存储
- with open('./sogou.html','w',encoding='utf-8') as fp:
- fp.write(page_text)
- print('over!')
- #也可以直接打印
- print(page_text) #这就是服务器给我们返回的数据信息(response)
2). headers 的使用:
如果没有伪装 UA, 你发送的请求中的 UA 是一个爬虫标识; 而且现在大部分网站都是有 UA 检测 (反爬机制), 所以我们需要 UA 伪装(反反爬策略) 骗过网站,
我们可以打开网站, F12, 随意点击一个信息, 找到 Headers 这个标签, 翻到最下面有一个 User-Agent , 在 python 中我们需要对他进行构造.
python 中有一个随机生成 UserAgent 的包 ----fake-useragent, 它的安装方法也很简单, pip install fake-useragent.
3). 下面实现上面 headers 的构造:
- # 第一种方法
- #user-agent 放在字典中, 不光 useragent, 后面我们讲到的 cookie 等都需要放入
- import requests
- headers== {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) ApplewebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
- }
- #调用方法, get(传入了两个参数, url,headers)
- response = requests.get("http://www.baidu.com",headers=headers)
使用 fake-useragent 获取并构造 UA:
- import requests
- from fake_useragent import UserAgent
- ua = UserAgent()
- headers = {
- 'User-Agent': ua.random
- }
- url = '待爬网页的 url'
- resp = requests.get(url, headers=headers)
4). params 参数
我们使用一个例子来融合 headers 与 params, 还是以搜狗为例:
- import requests
- wd = input('enter a word:')
- url = 'https://www.sogou.com/web'
- #参数的封装
- param = {
- 'query':wd
- }
- #UA 伪装
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
- }
- response = requests.get(url=url,params=param,headers=headers)
- #手动修改响应数据的编码
- response.encoding = 'utf-8'
- page_text = response.text
- fileName = wd + '.html'
- with open(fileName,'w',encoding='utf-8') as fp:
- fp.write(page_text)
- print(fileName,'爬取成功!!!')
上面的例子可以看出, 如果需要将参数放在 url 中传递, 可以利用 params 参数 .
5)post 用法: 我们访问网站的时候, 有时候是需要提交数据给网页的, 如果提交的数据中没有网站所认证的信息, 那么网站将会返回给你错误或者其他信息.
最基本的 POST 请求:
1 response = requests.post("http://www.baidu.com/",data=data)
传入数据的之后就不需要使用 urlencode 进行编码了.
实例(实现百度翻译):
- import requests
- #破解百度翻译
- url = 'https://fanyi.baidu.com/sug'
- Word = input('enter a English word:')
- #请求参数的封装
- data = {
- 'kw':Word
- }
- #UA 伪装
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
- }
- response = requests.post(url=url,data=data,headers=headers)
- #text: 字符串 JSON(): 对象
- json_dict = response.JSON()
- print(json_dict)# 返回是一个 JSON 列表, 进行数据提取即可
现在大部分的网站都是通过动态加载 (Ajax) 该技术加载信息, 有的网站防止数据的泄露或者用户隐私安全, 会设置 JS,CSS 字体加密等等; 后面有机会在介绍. 再举个例子如下, 爬取肯德基餐厅位置:
- # 爬取任意城市对应的肯德基餐厅的位置信息
- #动态加载的数据
- city = input('enter a cityName:')
- url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
- #数据封装
- data = {
- "cname": "",
- "pid": "",
- "keyword": city,
- "pageIndex": "2",
- "pageSize": "10",
- }
- #UA 伪装
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
- }
- #返回的数据
- response = requests.post(url=url,headers=headers,data=data).text
- print(response)# 打印
有人会问怎么看我们需要传输什么参数呢? 我们打开网站币乎网站, 点击登录, 打开开发者模式(谷歌浏览器), 输入账号密码后, 在标签为 Network 中的 Headers 中最下面的 Request payload 中. 如图所示:
我们可以使用模拟参数进行登录(大部分网站进行加密); 在后面会讲解谷歌的一些操作以及加密的数据的解决方式, 这里暂时略过.
三 cookie, 代理 ip,session
(1). cookie 的介绍:
学习之前简单的了解一下 cookie 是做什么的, 有什么作用; 我们在百度上搜索一下, 会出来很多的关于 cookie 的介绍, 我截取了一段:
Cookie 的作用:
cookie 的用途是存储用户在特定网站上的密码和 ID. 另外, 也用于存储起始页的首选项. 在提供个人化查看的网站上, 将利用计算机硬驱上的少量空间来储存这些首选项. 这样, 每次登录该网站时, 浏览器将检查是否有 cookie. 如果有, 浏览器将此 cookie 随网页的请求一起发送给服务器 , 有一个基础的概念就行;
接下来我们获取一下 cookies:
- import requests
- #网址
- url ="http:///www.baidu.com"
- #返回响应
- response = requests.get(url)
- #获取请求网页的 cookies
- #打印出 cookies
- print(response.cookies)##RequestCookieJar 类型, 我们使用 items 方法将其转换成元组, 遍历美每个 cookie 的的名称跟值.
- #第一种方法
- for k,v in response.cookies.items():
- print(k +"="+ v)
- #第二种方法
- print(resp.cookies.get_dict())
我们也可以使用 cookie 来维持我们在网站上的登录状态, 以我学校的网站为例(可以自行找登录网站), 首先登录网站, 打开 F12, 进入 network 面板 ----headers 中, 将 cookies 复制下来放进我们构造的 headers 中;
- import requests
- headers = {
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3941.4 Safari/537.36",
- "Cookie": "JSESSIONID = 加密字符串"
- }
- r = requests.get(url,headers=headers)
- print(r.text)
运行以后就会发现返回来的信息中有登陆后的结果, 证明登录成功.
(2)session(会话维持):
多个请求之间是可以共享 cookie 的. 那么如果使用 requests, 也要达到共享 cookie 的目的, 那么可以使用 requests 库给我们提供的 session 对象. 注意, 这里的 session 不是 Web 开发中的那个 session, 这个地方只是一个会话的对象而已.
上面的解释可能有些抽象, 打个比方你在爬取一个网站, 第一次请求利用 post 登录了网站, 第二次想获取登录成功后的信息, 你再使用 get 方法请求个人信息页面, 你发现请求不到, 实际上上面的两个操作是打开了两个浏览器, 是完全不同的.
所以有需求就有解决方案, 这样我们就引出 session 对象, 它可以维持同一个会话, 也就是打开一个浏览器的新标签页; 这样就防止我们登陆后获取不到信息的烦恼.
以登录人人网为例, 使用 requests 来实现. 示例代码如下:
- import requests
- url = "http://www.renren.com/PLogin.do"
- data = {"email":"email",'password':"password"}
- headers = {
- 'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
- }
- # 登录
- session = requests.session()
- #提交参数信息
- session.post(url,data=data,headers=headers)
- # 访问大鹏个人中心
- resp = session.get('http://www.renren.com/880151247/profile')
- print(resp.text)
注: session 通常用于模拟登录成功后进行下一步操作.
(3). 代理 ip 的使用
代理 ip 的使用场合: 对于某些网站, 我们测试的时候请求几次可以获取网页内容, 但是当大规模且频繁的请求, 网站可能出现验证码, 或者跳到登录认证页面, 更有的会直接封掉客户端 IP, 导致一定的时间内无法访问.
为了防止这种情况的发生, 我们需要进行代理操作, 代理其实就是代理服务器, 代理网站的话自行百度一下.
代理的详情: https://www.kuaidaili.com/doc/wiki/
代理分为下面几种类型:
- 匿名度:
- 透明: 对方服务器可以知道你使用了代理, 并且也知道你的真实 IP
- 匿名: 对方服务器可以知道你使用了代理, 但不知道你的真实 IP
- 高匿: 对方服务器不知道你使用了代理, 更不知道你的真实 IP.
- 类型:
- http: 该类型的代理 ip 只可以发起 http 协议头对应的请求
- https: 该类型的代理 ip 只可以发起 https 协议头对应的请求
设置代理的方式:
- import requests
- proxies = {
- "http":"ip: 端口",
- "https":"ip: 端口",
- }
- requests.get(url,proxies=proxies)
总结:
requests 的 get 和 post 方法常用的参数:
- url
- headers
- data/params
- proxies
你可能看会了, 但是你敲了吗?
初学者
分享及成功
来源: https://www.cnblogs.com/xbhog/p/11778323.html