zoukankan      html  css  js  c++  java
  • (爬虫)Python爬虫03(隐藏)

    目录:

    一、模拟浏览器访问

    二、延迟提交时间

    三、使用代理

    四、相关资源及问题

    一、模拟浏览器访问

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

    import urllib.request  #引入请求依赖
    import urllib.parse    #引入解析依赖
    import json            #引入json依赖
    
    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")
        
        #*********************************较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)
        #访问 请求对象req,并返回 应答对象response 
        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)
        #访问 请求对象req,并返回 应答对象response 
        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

    三、使用代理

    由于使用延迟提交时间的方法爬虫效率太低,那么可以使用另一种方式——代理,实现代码如下:

    import urllib.request   #爬虫依赖
    import random           #导入随机抽取的依赖,用于从资源池中随机抽取代理
    
    
    #可以测试目前访问该网页的IP是什么(要用http类型的代理IP)
    url_1 = "http://httpbin.org/ip"
    
    
    #代理资源池(因为免费代理很不稳定,可以预先存储多个)
    iplist_1 = ["101.4.136.34:81","221.180.170.104:8080"]
    #显示从资源池中随机抽取到的IP地址
    ip = random.choice(iplist_1)
    print(ip)
    #设置http类型的代理IP
    proxy_support_1 = urllib.request.ProxyHandler({"http":ip})
    
    
    #定制自己的opener
    opener_1 = urllib.request.build_opener(proxy_support_1)
    #为定制的opener添加header(也可以在请求时再加header信息)
    opener_1.addheaders = [("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")]
    #安装opener(类似创建opener全局变量,以后在使用urlopen()时就默认使用该opener)
    urllib.request.install_opener(opener_1)
    """
    #调用opener(只在本次使用自定义的opener访问url)
    opener.open(url_1)
    """
    
    
    print("*********************************HTTP代理IP*********************************")
    response_1 = urllib.request.urlopen(url_1)
    html_1 = response_1.read ().decode("utf-8")
    print(html_1)
    
    
    """
    #与http代理ip实现原理相同(资源池之类实现代码及相关注释的就不再这里赘余了)
    
    #可以测试目前访问该网页的IP是什么(要用https类型的代理IP)
    url_2 = "https://www.ip.cn/"
    #https类型的带来IP
    proxy_support_2 = urllib.request.ProxyHandler({"https":"27.43.188.230:3000"})
    
    opener_2 = urllib.request.build_opener(proxy_support_2)
    opener_2.addheaders = [("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")]
    urllib.request.install_opener(opener_2)
    
    print("*********************************HTTPS代理IP*********************************")
    response_2 = urllib.request.urlopen(url_2)
    html_2 = response_2.read ().decode("utf-8")
    
    print(html_2)
    """
    View Code

    运行截图:

    四、相关资源及问题

    1、相关资源:免费代理的网站(要多试几个,毕竟是免费的嘛,你懂得~~)

    西刺免费代理IP  :  https://www.xicidaili.com/

    无忧代理           : http://www.data5u.com/

    全国代理IP         :  http://www.goubanjia.com/

     2、相关问题:

    (1)

    问题:在执行第三个示例:使用代理的代码时,有可能会报错,类似:  主机频繁拒绝;连接方在一段时间后没有正确答复或主机没有反应,连接尝试失败  等等这类的信息(基本上等的时间比较长的(8秒左右),差不多都会返回这类信息)

    解决办法:基本都是由于代理IP不好用,多换几个试试。

    (2)

    问题:返回的IP不是代理IP而是本机IP

    解决办法:多半是因为你的代理IP类型与访问网址的协议类型不匹配(HTTP类型的代理只能访问HTTP开头的网址,不可以访问HTTPS开头的网址;HTTPS类型的代理同理。所以一定要对应好类型)

     (3)

    注意:HTTP类型的免费代理还是比较好找到的,但是HTTPS类型的免费代理比较难试成功,就算试成功了也只能维持一小小小会儿。

    当然如果你们有好的免费代理IP资源可以留言呦!!!

    爬虫上一篇:(爬虫)Python爬虫02(实战)

    本博客参考:

    零基础入门学习Python        https://www.bilibili.com/video/av4050443?p=56

  • 相关阅读:
    mysql字符集和数据库引擎修改方法
    android 之GridView和ImageView教程
    把php代码保存到php文件实现方法
    extjs gridpanel 操作行 得到选中行的列
    SQL 分页
    vs 调试 慢 解决办法
    JS获取屏幕高度
    C#事件以及委托
    ExtJs 3.0 不兼容 IE9
    ASP.NET 获取客户端IP (无视代理)
  • 原文地址:https://www.cnblogs.com/hwh000/p/12466499.html
Copyright © 2011-2022 走看看