(爬虫)Python爬虫03(隐藏)

目录:

一、模拟浏览器访问

二、延迟提交时间

三、使用代理

一、模拟浏览器访问

因为爬虫会给服务器带来太大的工作压力,所以好多服务器是将爬虫拒之门外的,那么我们如何让服务器觉得是人类在访问,而非是代码爬虫呢?实现代码如下:

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

猜你喜欢

转载自www.cnblogs.com/hwh000/p/12466499.html