【安全合规】python爬虫从0到1 -关于get/post请求 编解码的问题

简介: python爬虫从0到1 -关于get/post请求 编解码的问题

解码

编码的由来:计算机只能计算和识别二进制,必须让计算机识别文字,才能和计算机进行交互,彼此也才能通过计算机通信。由此,有了ASCII编码的诞生,它起始于50年代后期,在1967年定案,是最初美国国家标准,供不同计算机在相互通信时用作共同遵守的西文字符编码标准。

ASCII编码: 八位二进制最多可以表示的十进制数字范围是,0000 0000 ~ 1111 1111 = 0 ~ 255 ,一共256个不同数字。ASCII编码就是将常用的英文字符和符号,与256个数字逐一对应起来形成的对应表。由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码;后来又扩展了128个,称为扩展ASCII码。例如:十进制33对应叹号!,65对应大写A,83对应大写S,97对应小写a,这样我们输入字符,计算机转换成十进制,再转换成二进制,就可以通过计算机计算或传输。

字节: 中英文都需要断句才能明确含义,二进制也一样。一串二进制数字,没有规定开头结尾,是无法准确识别转换成十进制,从而对应编码找出对应字符的。

编码集的演变:

由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,比如大写字母A的编码是65,小写字母z的编码是122。但是要处理中文显然一个字节是不够的, 至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_ _JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。因此,Unicode应运而生。Unicode把所有语言都统一到- 套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。现代操作系统和大多数编程语言都直接支持Unicode。

(一)get请求方式image.png

1.1 urllib.parse.quote()

将汉字变为Unicode编码

eg:在百度上搜易烊千玺,它的url地址为https://www.baidu.com/s?wd=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA,而参数易烊千玺的Unicode编码就是%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA。若以中文形式爬取该网页源码,则会报错如下图:

image.png而urllib.parse.quote()方法正是为了解决此问题而生。


语法如下:


image.png

例:


import urllib.request
import urllib.parse
# https://www.baidu.com/s?wd=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA
url = 'https://www.baidu.com/s?wd='
name = urllib.parse.quote('易烊千玺')
print(name)

运行结果:


image.png


这里可以看出已经将汉字转变为了Unicode编码格式!

下面我们来看实例(获取百度搜索易烊千玺的网页源码):


import urllib.request
import urllib.parse
# https://www.baidu.com/s?wd=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA
url = 'https://www.baidu.com/s?wd='
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3880.400 QQBrowser/10.8.4554.400'
}  # 获取ua标识
 # 将易烊千玺变为Unicode编码形式。
name = urllib.parse.quote('易烊千玺')
# 合并url
url = url + name
# 定制请求对象
request = urllib.request.Request(url = url , headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应内容
content = response.read().decode('utf-8')
# 打印数据
print(content)


运行结果:


image.png


1.2 urllib.parse.urlencode()

为了更方便快捷的解决url中多个参数的问题。urllib.parse.urlencode() 可以将字典里的各个数据使用与的连接符来合并,并且转换为Unicode编码格式。

例如:


import urllib.parse
# https://www.baidu.com/s?wd=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA&sex=%E7%94%B7
url = 'https://www.baidu.com/s?wd=易烊千玺&sex=男'
data = {
    'wd':'易烊千玺',
    'sex':'男'
}
a = urllib.parse.urlencode(data)
print(a)


运行结果:


image.png下面我们来看下实例(爬取百度搜索易烊千玺(wd=“易烊千玺”&sex=“男”)):


import urllib.request
import urllib.parse
# https://www.baidu.com/s?wd=%E6%98%93%E7%83%8A%E5%8D%83%E7%8E%BA&sex=%E7%94%B7
url = 'https://www.baidu.com/s?'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3880.400 QQBrowser/10.8.4554.400'
}
data = {
    'wd':'易烊千玺',
    'sex':'男'
}
a = urllib.parse.urlencode(data)
url = url + a
#  定制请求对象
request = urllib.request.Request(url = url , headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应数据
content = response.read().decode('utf8')
# 打印数据
print(content)


运行结果:


image.png


(二) post请求方式image.png


注意事项:

post请求需要的是字节型,一定要进行编码。
编码之后必须调用encode方法
参数是放在请求对象定制的方法中

# post 请求的参数一定要进行编码
data = urllib.parse.urlencode(data).encode('utf8')


实例1(百度翻译):



image.png

import urllib.request
import urllib.parse
import json
url = 'https://fanyi.baidu.com/sug'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3880.400 QQBrowser/10.8.4554.400'
}
data = {
    'kw':'spider'
}
# post 请求的参数一定要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')
# post 的请求参数是不会拼接在url后面的,而是放在请求对象的参数中
request = urllib.request.Request(url = url ,data = data ,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
content = response.read().decode('utf8')
# 将字符串转变为json类型
obj = json.loads(content)
print(obj)


运行结果:


image.png



实例2(百度翻译之详细翻译):

image.png在这里可以看出案例1和案例2 两者的差距,在这里我们将可以了解到反爬虫的第二个策略(Cookie反爬)


image.png


代码如下:


import urllib.request
import urllib.parse
import json
url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'
headers = {
    'Cookie': 'PSTM=1644824903; BAIDUID=DC45D78727F6132FA71DB5361C5EB5EB:FG=1; BIDUPSID=77208210F2997672227A0629541168C4; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; APPGUIDE_10_0_2=1; __yjs_duid=1_e35e59a720afcbb8f04f6ab3797ae51b1645353651180; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1645358868,1645358877,1645359198,1645359479; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1645359479; ab_sr=1.0.1_Njc3NTRlMGI4YmNhNWNmNjE2N2JiZmFhYmY1Y2ExZWVmMmI0ZDYxNzQ1OTVhMWFhNmJhOTEwYjViZjc1ZmQ1NjVkYzA4MGNmMjA3NmRmN2NhYzY4ZjA3Y2I3MTcyZmQxZTYwMDRhN2JlYzk2ODFiM2VkYjBlZDA4Y2NiMzhiM2VkYjhiNmE2NTA3NTA5ODNiMzRiZmY2ZjgxNTZhMWY4Ng==; H_PS_PSSID=31254_26350; BDRCVFR[Zrmb_XaMrqn]=pdg3iqubLhtTvqMULR8mvqV; BA_HECTOR=2kag2g018k0g0k8hq71h14ci10r'
}
data = {
    'from': 'en',
    'to': 'zh',
    'query': 'location',
    'transtype': 'realtime',
    'simple_means_flag': '3',
    'sign': '475759.237918',
    'token': '574523c4a4f070313720caee427fc860',
    'domain': 'common'
}
data = urllib.parse.urlencode(data).encode('utf-8')
# 定制请求对象
request = urllib.request.Request(url = url ,data = data ,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 返回响应数据
content = response.read().decode('utf-8')
# 将字符串类型转换为json类型
obj = json.loads(content)
print(obj)


运行结果:


image.png


以上就是get请求和post请求的全部内容了。有什么不足的地方可以在评论区提哦,希望大家可以多多关注我,期待后续!!

相关文章
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
89 6
|
3月前
|
数据采集
Haskell爬虫:连接管理与HTTP请求性能
Haskell爬虫:连接管理与HTTP请求性能
|
4月前
|
数据采集 存储 搜索推荐
打造个性化网页爬虫:从零开始的Python教程
【8月更文挑战第31天】在数字信息的海洋中,网页爬虫是一艘能够自动搜集网络数据的神奇船只。本文将引导你启航,用Python语言建造属于你自己的网页爬虫。我们将一起探索如何从无到有,一步步构建一个能够抓取、解析并存储网页数据的基础爬虫。文章不仅分享代码,更带你理解背后的逻辑,让你能在遇到问题时自行找到解决方案。无论你是编程新手还是有一定基础的开发者,这篇文章都会为你打开一扇通往数据世界的新窗。
|
2月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
202 66
|
1月前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
1月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
65 4
|
2月前
|
数据采集 JavaScript 前端开发
JavaScript逆向爬虫——使用Python模拟执行JavaScript
JavaScript逆向爬虫——使用Python模拟执行JavaScript
37 2
|
3月前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
73 3
|
3月前
|
数据采集 API 开发者
🚀告别网络爬虫小白!urllib与requests联手,Python网络请求实战全攻略
在网络的广阔世界里,Python凭借其简洁的语法和强大的库支持,成为开发网络爬虫的首选语言。本文将通过实战案例,带你探索urllib和requests两大神器的魅力。urllib作为Python内置库,虽API稍显繁琐,但有助于理解HTTP请求本质;requests则简化了请求流程,使开发者更专注于业务逻辑。从基本的网页内容抓取到处理Cookies与Session,我们将逐一剖析,助你从爬虫新手成长为高手。
73 1
|
3月前
|
数据采集 机器学习/深度学习 搜索推荐
Python爬虫技术基础与应用场景详解
本文介绍了爬虫技术的基本概念、原理及应用场景,包括数据收集、价格监测、竞品分析和搜索引擎优化等。通过一个实战案例展示了如何使用Python爬取电商网站的商品信息。强调了在使用爬虫技术时需遵守法律法规和道德规范,确保数据抓取的合法性和合规性。