[day 2]爬虫

一. Http和Https协议

1.http协议

概念:就是服务端和客户端进行数据交互的一种形式

2.常用请求头信息

User_agent : 请求载体的身份标识

Connection : 请求完毕后,是断开连接还是保持连接

3.常用请求头信息

Content_Type : 服务器响应回客户端的数据类型

4.https协议

安全的http协议(安全的超文本传输协议)

5.加密方式

对称密钥加密 :  客户端会指定加密方式,最后将密钥和密文一起发送给服务器,服务器在根据密钥解密

非对称密钥加密 : 服务器端设置加密方式,将加密方式发送给客户端,客户端拿到该加密方式后,会对数据进行加密,将密文发送给服务端,服务器端进行解密,设计两把钥匙(私钥,共钥,一开始服务器端制定好的加密方式成为公钥,客户端拿到公钥对即将发送给服务端的数据进行加密,加密完毕后,将密文发送给服务器,服务器用私钥对密文进行解密),这样避免密文和密钥同时发送给客户端

隐患 :通信速度慢, 公钥可能被拦截,篡改,导致客户端加密方式改变,服务端不能解密

证书密钥加密 : 改善公钥被拦截篡改,加入了证书认证机构,服务器端会先将公钥发送给证书认证机构,机构对公钥进行数字签名,如果客户端拿到的公钥没有数字签名,则公钥不被认可,否则,对数据进行加密

https采用的加密方式为证书密钥加密

二.requests

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)

你可能感兴趣的:(python爬虫,爬虫,python)