目录:
一, 模拟浏览器访问
二, 延迟提交时间
三, 使用代理
一, 模拟浏览器访问
因为爬虫会给服务器带来太大的工作压力, 所以好多服务器是将爬虫拒之门外的, 那么我们如何让服务器觉得是人类在访问, 而非是代码爬虫呢? 实现代码如下:
- import urllib.request #引入请求依赖
- import urllib.parse #引入解析依赖
- import JSON #引入 JSON 依赖
- while 1:
- #将输入内容存为变量
- content = input("请输入需要翻译的内容:")
- #将链接 Request URL 存储为变量, 便于使用
- url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
- #将表单 From Data 赋值给字典 data
- data = {}
- data["i"] = content #将表单中 i 的值换为变量 content(自己输入的内容)
- data["from"] = "AUTO"
- data["to"] = "AUTO"
- data["smartresult"] = "dict"
- data["client"] = "fanyideskweb"
- data["salt"] = "15838472422107"
- data["sign"] = "85a1e803f3f0d04882d66c8cca808347"
- data["ts"] = "1583847242210"
- data["bv"] = "d6c3cd962e29b66abe48fcb8f4dd7f7d"
- data["doctype"] = "json"
- data["version"] = "2.1"
- data["keyfrom"] = "fanyi.web"
- data["action"] = "FY_BY_CLICKBUTTION"
- #将 data 编码为 url 的形式, 且将 Unicode 硬编码为 utf-8 的形式, 存储到 data_utf8 变量中
- data_utf8 = urllib.parse.urlencode(data).encode("utf-8")
- #********************************* 较 Python02 博客的增加处 *********************************
- #让服务器认为这是一个浏览器在访问, 而非代码爬虫 (如果不自定义 User-Agent, 在爬虫时会是代码的有关信息, 而非客户端的基本信息)
- #自定义 Request Headers 中的 User-Agent, 存储到字典 head 中 (如果 Request Headers 和 User-Agent 不知道是什么, 请查看本人的上篇博客 (爬虫)Python02(实战))
- head = {}
- head["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
- #********************************* 较 Python02 博客的修改处 *********************************
- #根据 url,data_utf8,head 获取请求对象 (urlopen 不能自动转化带 head 的, 所以要用 Request 去获取请求对象了)
- req = urllib.request.Request(url,data_utf8,head)
- #通过 url 和 data_utf8 获得应答对象, data_utf8 将会以 POST 形式被提交
- response = urllib.request.urlopen(req)
- '''
- #注意: 也可以将上边的增加处和修改处全部去掉, 换成如下代码效果和原理是一模一样的:
- req = urllib.request.Request(url,data_utf8)
- req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
- response = urllib.request.urlopen(req)
- '''
- #将读取的 utf-8 编码的文件解码回 Unicode 编码形式
- HTML = response.read().decode("utf-8")
- print("****** 返回的原始数据 ******")
- #打印输出 (观察会发现: 返回的是 JSON 结构)
- print(HTML)
- #用 JSON 载入字符串 (观察发现是一个字典)
- target = JSON.loads(HTML)
- #打印输出字典中的指定值 (即翻译结果)
- print("****** 显示处理后的结果 ******")
- print("翻译结果:%s" % (target["translateResult"][0][0]["tgt"]))
- View Code
二, 延迟提交时间
因为人类访问不会像爬虫那样特别频繁访问请求, 所以服务器会判断同一 IP 如果访问过于频繁, 会判定为是代码爬虫, 爬虫同样会被拒之门外, 为了让代码爬虫更像是人类在访问, 我们可以延迟提交时间, 实现代码如下 (注意: 只在文件开头和结尾处做了两行添加):
- import urllib.request #引入请求依赖
- import urllib.parse #引入解析依赖
- import JSON #引入 JSON 轻量级数据依赖
- #********************************* 较 一, 模拟浏览器访问 增加处 *********************************
- import time #引入时间处理依赖
- while 1:
- #将输入内容存为变量
- content = input("请输入需要翻译的内容 (输入 exit 退出程序):")
- #********************************* 较 一, 模拟浏览器访问 增加处 *********************************
- #判断是否要退出程序
- if content == "exit":
- print("退出成功!")
- break
- #将链接 Request URL 存储为变量, 便于使用
- url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
- #将表单 From Data 赋值给字典 data
- data = {}
- data["i"] = content #将表单中 i 的值换为变量 content(自己输入的内容)
- data["from"] = "AUTO"
- data["to"] = "AUTO"
- data["smartresult"] = "dict"
- data["client"] = "fanyideskweb"
- data["salt"] = "15838472422107"
- data["sign"] = "85a1e803f3f0d04882d66c8cca808347"
- data["ts"] = "1583847242210"
- data["bv"] = "d6c3cd962e29b66abe48fcb8f4dd7f7d"
- data["doctype"] = "json"
- data["version"] = "2.1"
- data["keyfrom"] = "fanyi.web"
- data["action"] = "FY_BY_CLICKBUTTION"
- #将 data 编码为 url 的形式, 且将 Unicode 硬编码为 utf-8 的形式, 存储到 data_utf8 变量中
- data_utf8 = urllib.parse.urlencode(data).encode("utf-8")
- #让服务器认为这是一个浏览器在访问, 而非代码爬虫 (如果不自定义 User-Agent, 在爬虫时会是代码的有关信息, 而非客户端的基本信息)
- #自定义 Request Headers 中的 User-Agent, 存储到字典 head 中 (如果 Request Headers 和 User-Agent 不知道是什么, 请查看本人的上篇博客 (爬虫)Python02(实战))
- head = {}
- head["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
- #根据 url,data_utf8,head 获取请求对象 (urlopen 不能自动转化带 head 的, 所以要用 Request 去获取请求对象了)
- req = urllib.request.Request(url,data_utf8,head)
- #通过 url 和 data_utf8 获得应答对象, data_utf8 将会以 POST 形式被提交
- response = urllib.request.urlopen(req)
- '''
- #注意: 也可以将上边的增加处和修改处全部去掉, 换成如下代码效果和原理是一模一样的:
- req = urllib.request.Request(url,data_utf8)
- req.add_header("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36")
- response = urllib.request.urlopen(req)
- '''
- #将读取的 utf-8 编码的文件解码回 Unicode 编码形式
- HTML = response.read().decode("utf-8")
- print("****** 返回的原始数据 ******")
- #打印输出 (观察会发现: 返回的是 JSON 结构)
- print(HTML)
- #用 JSON 载入字符串 (观察发现是一个字典)
- target = JSON.loads(HTML)
- #打印输出字典中的指定值 (即翻译结果)
- print("****** 显示处理后的结果 ******")
- print("翻译结果:%s" % (target["translateResult"][0][0]["tgt"]))
- #********************************* 较 一, 模拟浏览器访问 增加处 *********************************
- #让程序睡 2 秒, 让远端服务器更觉得是人类使用客户端在访问, 而非代码爬虫
- time.sleep(2)
- View Code
三, 使用代理
由于使用延迟提交时间的方法爬虫效率太低, 那么可以使用另一种方式 -- 代理, 实现代码如下:
未完待续...
本博客参考:
零基础入门学习 Python https://www.bilibili.com/video/av4050443?p=56
来源: http://www.bubuko.com/infodetail-3457402.html