Python爬虫入门 ~ 爬虫相关概念(四)

112 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第15天,点击查看活动详情

编解码

简介

由于计算机是美国人发明的,最早只有127个字符被编码到计算机里(大小写字母、数字和一些符号),这个编码表被称为ASCII编码。

但是要处理中文一个字节显然是不够的,至少需要两个字节,还不能和ASCII编码冲突,所以中国定制了GB2312编码来把中文编码进去。

不单单中国,全世界很多国家都有一套自己的编码,各国有各国的标准,数量一多冲突不可避免的就出现了,在多语言混合的文本中经常都会出现乱码现象。因此Unicode应运而生,把所有语言都统一到一套编码里,解决乱码问题。

案例说明 在前面的案例中,我们并没有添加过参数,没想到一添加参数就报错了 image.png

这是由于ASCII码并不包含中文,我们输入的中文它转换不了导致的异常。我们需要自己将中文参数转换成Unicode编码。

get请求方式

quote()

该函数可以将字符串转换为Unicode编码,再将其拼接到url后面即可。 image.png

import urllib.request

url = 'https://www.baidu.com/s?wd='

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}

param = urllib.request.quote('稀土掘金')

request = urllib.request.Request(url=url + param, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())

image.png

urlencode()

上面的函数是转换一个参数的,如果我们有多个参数需要修改,那就得用另一个函数来实现了。

import urllib.request

url = 'https://www.baidu.com/s?wd='

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}

data = {
    'wd': '稀土掘金',
    'xitu': 'juejin'
}

param = urllib.parse.urlencode(data)

request = urllib.request.Request(url=url + param, headers=headers)
response = urllib.request.urlopen(request)
print(response.read().decode())

image.png

image.png

post请求方式

在请求中,不单单有get请求方式,还有post请求方式,类似于百度翻译,提交的请求就是post类型的,因此我们需要掌握post请求方式的传参格式。

post请求中,数据data是不拼接在url后面的,它保存在请求体中,同时,还需要对其进行编码操作,不能直接存放进去。

import urllib.request
import urllib.parse

url = 'https://fanyi.baidu.com/sug'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
param = {
    'kw': 'spider'
}

data = urllib.parse.urlencode(param).encode('utf-8')
request = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(request)
print(response.read().decode())

image.png

但是从效果来看,好像还是不行啊,里面还有一些看不出的编码是吧?不要急,从结构上来看,返回的数据像是一个字典对象,我们来打印一下类型看一下

image.png

它的类型是字符串类型的,那么我们使用json将它转换一下吧。

import urllib.request
import urllib.parse
import json

url = 'https://fanyi.baidu.com/sug'

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36'
}
param = {
    'kw': 'spider'
}

data = urllib.parse.urlencode(param).encode('utf-8')
request = urllib.request.Request(url, data, headers)
response = urllib.request.urlopen(request)

dict = json.loads(response.read().decode())
print(dict)

image.png

转换之后效果出来了,是我们翻译的内容

image.png