1.http协议
概念:就是服务端和客户端进行数据交互的一种形式
2.常用请求头信息
User_agent : 请求载体的身份标识
Connection : 请求完毕后,是断开连接还是保持连接
3.常用请求头信息
Content_Type : 服务器响应回客户端的数据类型
4.https协议
安全的http协议(安全的超文本传输协议)
5.加密方式
对称密钥加密 : 客户端会指定加密方式,最后将密钥和密文一起发送给服务器,服务器在根据密钥解密
非对称密钥加密 : 服务器端设置加密方式,将加密方式发送给客户端,客户端拿到该加密方式后,会对数据进行加密,将密文发送给服务端,服务器端进行解密,设计两把钥匙(私钥,共钥,一开始服务器端制定好的加密方式成为公钥,客户端拿到公钥对即将发送给服务端的数据进行加密,加密完毕后,将密文发送给服务器,服务器用私钥对密文进行解密),这样避免密文和密钥同时发送给客户端
隐患 :通信速度慢, 公钥可能被拦截,篡改,导致客户端加密方式改变,服务端不能解密
证书密钥加密 : 改善公钥被拦截篡改,加入了证书认证机构,服务器端会先将公钥发送给证书认证机构,机构对公钥进行数字签名,如果客户端拿到的公钥没有数字签名,则公钥不被认可,否则,对数据进行加密
https采用的加密方式为证书密钥加密
1.requests模块
-urllib模块 : 比较老,可以用requests代替,主要用requests
- requests模块
requests模块 : python中原生的一款基于网络请求的模块,功能非常强大,简单便捷,效率极高
作用 : 模拟浏览器发送请求
如何使用 : (requests模块的编码流程)
- 指定 URL
- 发起请求
- 获取相应的数据
- 持久化存储
环境安装
pip install inquests
实战编码
- 需求 : 爬取搜狗首页的页面数据
#爬取搜狗首页的页面数据
import requests
#指定rul
url = ' https://www.sogou.com'
#step_1 发起请求
#step_2 get方法会返回一个响应对象 response接受
response = requests.get(url=url)
#step_3获取响应数据 text返回的是字符串形式的相应数据
page_text = response.text
print(page_text)
#step_4 持久化存储
with open ('./sougou.html','w',encoding='utf-8',)as fp:
fp.write(page_text)
print("爬取数据结束! ! !")
实战巩固
- 需求 : 爬取搜狗指定词条对应的搜索结果页面(简易的网页采集器)
- UA检测
- UA伪装
#UA : User_Agent {请求载体的身份标识}
#UA检测: 门户网站的服务器会检测对应请求的载体身份标识,如果检测到请求的载体身份标识为某一款浏览器
#说明该请求是一个正常的请求,但是检测到请求的载体身份标识不是基于某一款浏览器的,则表示不为正常的请求(爬虫),服务器端就会很有可能拒绝本次请求
#UA伪装 : 让爬虫对应的请求载体身份标识伪装为某一款浏览器
import requests
#UA伪装 : 将对应的user_angent封装到字典中
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
# url = 'https://sogou.com/web?query=张三'
url = 'https://sogou.com/web?'
#处理url携带的参数 : 封装到字典中中
kw = input("enter a word")
params ={
'query': kw
}
#对指定的rul发起的请求对应的url是携带参数的,并且请求过程中处理了参数 parames携带参数
response = requests.get(url=url,params=params,headers=headers)
page_text = response.text
print(page_text)
flieName = kw+'.html'
with open(flieName,'w',encoding='utf-8') as fp:
fp.write(page_text)
print(flieName,"保存成功! ! !")
- 需求 : 破解百度翻译
- Post请求(携带参数)
- 响应数据是一组json数据
- 页面局部刷新 : 阿贾克斯(Ajax)请求 XHR
- Content-Type: application/json 服务器端返回的数据类型
import json
import requests
#指定url
post_url = 'https://fanyi.baidu.com/sug'
#post请求参数处理(同get请求一致)
word = input("enter a word :")
data = {
'kw':word
}
#进行UA伪装
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
#请求发送
response = requests.post(url=post_url,data=data,headers=headers)
#获取响应数据:json方法返回的是obj(如果确认响应数据是json类型的,才可以使用json() )
dic_obj = response.json()
print(dic_obj)
#持久化存储
fileName = word+'.json'
fp = open(fileName,'w',encoding='utf-8')
json.dump(dic_obj,fp=fp,ensure_ascii=False)
ensure_ascii=False
: 这是一个可选的参数,用于指定是否将非 ASCII 字符转义为 Unicode 转义序列。当 ensure_ascii
设为 False
时,非 ASCII 字符将保留原样,而不会进行转义。这通常用于保留非 ASCII 字符在输出中的正确显示。
dump
: 这是 json
模块中的一个函数,用于将 Python 对象序列化为 JSON 格式并写入文件以上为将ensure_ascii设置为True的情况
以上为将ensure_ascii设置为False的情况
- 需求 : 爬取豆瓣网电影分类排行榜 https://movie.douban.com/中的电影详情数据
import requests
import json
url = 'https://movie.douban.com/j/chart/top_list'
parme ={
'type':'24',
'interval_id':'100:90',
'action':'',
'start':'0',#从库中第几部电影去取
'limit':'20',#一次取的最大数
}
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
response = requests.get(url=url,params=parme,headers=headers)
print(response)
list_data = response.json()
# #持久化存储
with open('douban.json','w',encoding='utf-8') as fp:
json.dump(list_data,fp=fp,ensure_ascii=False)
print("over! ! !")
- 需求 : 爬取肯德基餐厅查询http://www.kfc.com.cn/kfccad/index.aspx中指定地点的餐厅数据
import requests
url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx'
keyword = input("输入餐厅的名字: ")
data = {
'op': 'cname',
'cname': keyword,
'pageIndex': '1',
'pageSize': '10'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}
try:
response = requests.post(url=url, data=data, headers=headers)
response.raise_for_status()
print(response.text)
except requests.exceptions.RequestException as e:
print("发生请求异常:", e)