记录时间 : 2020/08/05 前言 :常用反爬方法设置headers,需要在headers的中设置Referer的值,Referer的值是个网址。网址可能会用到加密、转换等方法获得。 摘要 : 这次记录的是百度百科网
记录时间 : 2020/08/05
前言 :常用反爬方法设置headers,需要在headers的中设置Referer的值,Referer的值是个网址。网址可能会用到加密、转换等方法获得。
摘要 : 这次记录的是百度百科网址转换方法之一。
测试包括 : 魑、 *、$、listen()、9527
预想: 此次内容适用中文字符、符号
【特殊字符请前先自行测试】
内容记录
- 构想
1. 英文和中文转为十六进制(UTF-8)
2. 左数开始加“%”,然后每两位加“%” - 代码
# 字符串先变十六进制再每两位插入百分号
def urlFrame_One():
for name in chinese:
# name为字符串,按照指定的 encoding 将字符串转换为字节序列
namestr = bytes(name, 'UTF-8')
# hex() 函数用于将10进制整数转换成16进制
namehex = namestr.hex()
# text存十六进制字符串
text = ""
# i存字符串长度
i = len(namehex)
for n in range(i // 2):
# str存放截取字符串,建议从后往前截取字符
str = namehex[i - 2 * (n + 1): i - 2 * n]
# 将str从后往前串接
text = "%" + str + text
print("https://baike.baidu.com/item/" + text)
if __name__ == '__main__':
urlFrame_One()https://baike.baidu.com/item/%e9%ad%91
https://baike.baidu.com/item/%2a
https://baike.baidu.com/item/%24
# 字符串先变十六进制再每两位插入百分号
def urlFrame_Two():
# 生成 iter 迭代器
a = iter(chinese)
while True:
try:
namebytes = bytes(next(a), 'UTF-8')
# print(namebytes)
namehex = namebytes.hex()
i = len(namehex)
# generator 生成器
# g is generator type
# next(g) is str type
g = ("%" + namehex[2 * (n - 1):2 * n] for n in range(1, i // 2 + 1))
# b = ("%" + str(next(g)) + str() for n in range(i // 2))
print("https://baike.baidu.com/item/" + ''.join(list(g)))
# StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况
except StopIteration:
sys.exit()
if __name__ == '__main__':
urlFrame_Two()
输出
https://baike.baidu.com/item/%e9%ad%91https://baike.baidu.com/item/%2a
https://baike.baidu.com/item/%24
验证:将网址copy到浏览器
报错记录
报错代码TypeError: 'float' object cannot be interpreted as an integer 报错原因Python2 中整数 / 整数 = 整数,Python3 中整数 / 整数 = 浮点,整数 // 整数 = 整数