目录:
一、模拟浏览器访问
二、延迟提交时间
三、使用代理
因为爬虫会给服务器带来太大的工作压力,所以好多服务器是将爬虫拒之门外的,那么我们如何让服务器觉得是人类在访问,而非是代码爬虫呢?实现代码如下:
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"]))
因为人类访问不会像爬虫那样特别频繁访问请求,所以服务器会判断同一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)
由于使用延迟提交时间的方法爬虫效率太低,那么可以使用另一种方式——代理,实现代码如下:
未完待续。。。
本博客参考:
零基础入门学习Python https://www.bilibili.com/video/av4050443?p=56
原文:https://www.cnblogs.com/hwh000/p/12466499.html