回顾,上节课学了什么?
http协议和https协议
反爬机制
反反爬策略
robots . txt协议
常用请求头信息:
User-Agent:请求载体的身份标识
Connection:请求完毕后,是断开连接还是保持连接
常用响应头信息:
Content-Type:服务器响应回客户端的数据类型加密方式:
对称秘钥加密
非对称秘钥加密
证书秘钥加密(https采用)
目录
1.requests模块简介
requests模块: python中原生的一 款基于网络请求的模块,功能非常强大,简单便捷,效率极高。
作用:模拟浏览器发请求。
2.requests模块安装
(1)终端窗口安装
pip install requests
(2)直接pycharm包管理器安装
3.步骤:
(1)指定网址url
(2)发起请求
(3)获取响应数据
(4)持久化存储,os库读写文件
4.代码API
#发起请求,获取响应数据
response=requests.get(url)
response:返回的响应对象
url:字符串格式的网址
5应用:
1.简单爬取百度首页面
#1.1
import requests # (1)指定网址url url="https://baidu.com" # (2)发起请求 # (3)获取响应数据 r=requests.get(url=url) # (4)持久化存储,os库读写文件 text=r.content.decode('utf-8')#,注意编码格式 with open("./baidu.html","w",encoding="utf-8") as f: f.write(text) f.close()
结果:
2.爬取指定搜狗词条
URL参数
1.使您将用户提供的信息从浏览器传递到服务器。当服务器收到请求,而且参数被追加到请求的 URL 上时,服务器在将请求的页提供给浏览器之前,向参数提供对请求页的访问。
2.每个网站的参数都由自己的后端程序师定义
3.参数在网址后面以问号 (?) 开始 并采用 name=value. 如果存在多个 URL 参数,则参数之间用 & 符隔开。
4.服务器将参数临时存储在内存中
response=requests.get(url,params,headers)
param:字典格式的URL参数
headers:字典字典格式的请求头
(1)通过搜狗搜索csdn - 搜狗搜索可以看到URL查询参数
所以我们要写query参数等于我们需要查询的条件
注意:爬取百度搜索框会出现百度安全验证问题界面,由于经检查发现你是程序输入
(2)UA伪装
UA:.User-Agent(请求载体的身份标识)
UA伪装:门户网站的服务器会检测对应请求的载体身份标识.如果检测到请求的载体身份标识为某一款浏览说明该请求是个正常的请求,但是如果检测到请求的载体身份标识不是基于某款浏览器的则表示该共为不正常的请求(爬虫)
通过按下F12打开控制台我们可以看到这次请求的User-Agent请求头,将这次请求头复制就行
火狐浏览器的查看步骤:
(3)举例
#1.2
import requests # (1)指定网址url url="http://www.sogou.com/web" #动态获取搜索关键词,封装成字典格式 kw=input("Key Words:") #UA伪装 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0", } params={ "query":kw } # (2)发起请求 # (3)获取响应数据 r=requests.get(url=url,params=params,headers=headers) # (4)持久化存储,os库读写文件 text=r.content.decode('utf-8')#,注意编码格式 with open(kw+".html","w",encoding="utf-8") as f: f.write(text) f.close()
3.破解百度翻译(局部动态界面刷新的网页)
#post动态传参请求
response=requests.post(url,data,headers)
data:post传送的数据
(1)通过百度翻译页面百度翻译-200种语言互译、沟通全世界!可以看出,每次翻译不同内容的时候,主要地址没有变化,所以可以推导出它是一个局部动态界面刷新的网页,当你输入单词的时候,下面翻译会立马出现改变,是由于它发送了Ajax请求(常用get,post)
(2)通过抓包工具F12打开控制台,找到相对应的请求,即携带我们写的参数的那个特殊请求
可以从响应数据文件中看到我们的翻译果然是这个请求过程得到的
(3)然后查看这次请求的一些其他URL参数
(4)举例
#1.3
import requests import json#处理json格式数据 #(1)指定网址url,在请求信息中查到 url="https://fanyi.baidu.com/sug" #(2)动态获取翻译关键词,封装成字典格式 kw=input("翻译:") #(3)UA伪装 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0", } data={ "kw":kw } #(4)发起请求,获取响应数据 r=requests.post(url=url,data=data,headers=headers) #(5)获取响应数据,确定返回数据为json格式,使用.json()函数返回obj类型 dic_obj=r.json() #(6)持久化存储,json库处理json格式 print(dic_obj) with open(kw+".json","w",encoding="utf-8") as f: json.dump(dic_obj,fp=f,ensure_ascii=False)
结果:
控制台:
json文件:
4.获取豆瓣电影排行榜数据
(1)一直往下翻豆瓣电影排行榜网页豆瓣电影分类排行榜 - 剧情片的时候,滚动条会从最下面突然变成中间,而网站没有变,说明发送了Ajax请求获得了电影的数据,来局部动态刷新。
(2)通过F12抓包工具来找到此处请求
(3)找到我们需要的响应数据,仔细查看该次请求, 发现是get请求
地址的 ?符号后面的蓝色部分就是get携带的URL参数
查看响应数据类型是json类型
(4)举例:
#1.4
import requests import json#处理json格式数据 #(1)指定网址url,在请求信息中查到 url="https://movie.douban.com/j/chart/top_list" #(2)动态获取类型关键词,封装成字典格式 kw=input("类型:") #(3)UA伪装 headers={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:105.0) Gecko/20100101 Firefox/105.0", } params={ "type":kw,#排行榜类型 "interval_id":"100:90", "action":"", "start":"1",#第几部开始取 "limit":"20",#取几个 } #(4)发起请求,获取响应数据 r=requests.get(url=url,params=params,headers=headers) #(5)获取响应数据,确定返回数据为json格式,使用.json()函数返回obj类型 dic_obj=r.json() #(6)持久化存储,json库处理json格式 print(dic_obj) with open(kw+".json","w",encoding="utf-8") as f: json.dump(dic_obj,fp=f,ensure_ascii=False)
结果:
总结,这节课你学到了什么?
response=requests.get(url,params,headers)
response=requests.post(url,data,headers)
URL参数
UA伪装
F12抓包工具的爬取Ajax局部页面的请求
json数据格式的保存