• 1 网络爬虫_设置代理服务器


    书目参考:精通Python网络爬虫和Python3网络爬虫实战。
    这里只给出正确的代码。

    首先,代理服务器ip的网址是:http://www.xicidaili.com/。这里面有大量的失效IP地址。

    其次, http://httpbin.org/get或者https开通的网址可以对是否设置成功进行验证。

    实际代码如下:

    # -*- coding: utf-8 -*-
    """
    Created on Wed Jul 11 15:54:09 2018
    
    @author: a
    """
    
    #设置正确的代理服务器
    from urllib.error import URLError
    def use_proxy(proxy_addr,url):
        import urllib.request
        #proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr,"https":"https://"+proxy_addr})
        proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr})
        headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400")
    opener=urllib.request.build_opener(proxy)
        opener.addheaders=[headers]
        #print (opener.open(url).getheaders())
        #print (opener.open(url).info())   
        try:
            response=opener.open(url)
            data=response.read().decode('utf-8')
            print(data) 
        except URLError as e:
            print("出现异常")
            print(e.reason)
        return data
    #获取本机ip地址
    import socket
    hostname = socket.gethostname()
    ip = socket.gethostbyname(hostname)
    print ("本机电脑名:",hostname)
    print ("本机Ip:",ip)
    proxy_addr="101.236.35.98:8866"
    data=use_proxy(proxy_addr,"http://httpbin.org/get")
    #print (data)
    print (len(data))
    

    #也可以opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)

    #也可以注册opener。

           urllib.request.install_opener(opener)

                response=urllib.request.urlopen(url)

    为了确定是否使用的是代理服务器的ip地址,可以将目标url设为: http://httpbin.org/get因为该服务器的response会专门返回客户端使用的ip地址。可以看到:

    runfile('G:/精通python网络爬虫/6 代理服务器设置_2.py', wdir='G:/精通python网络爬虫')

    本机电脑名: DESKTOP-090FKDS

    本机Ip: 192.168.8.100

    {"args":{},"headers":{"Accept-Encoding":"identity","Cache-Control":"max-age=259200","Connection":"close","Host":"httpbin.org","User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400"},"origin":"101.236.35.98","url":"http://httpbin.org/get"}

    352

    几个错误

    第一个错误

    Python3网络爬虫实战书中的错误是:设置Proxyhandler的时候使用的是:

    #proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr,"https":"https://"+proxy_addr})

    即将http和https都设置了。但是这样总是会出现各种问题。

    其中,http://www.xicidaili.com/对于各种类型的代理IP是有严格分类的。如果访问http的网址,就用国内http代理IP即可。

    第二个错误

    写代码的时候没有注意,反复open(url)就会导致报错。

        print (opener.open(url).getheaders())

        print (opener.open(url).info())  

        data=opener.open(url).read().decode('utf-8')

        print(data)

        return data

    第三个错误

    如果设置的代理是http类型的,访问的是https的网址。这个时候,代理是不起任何作用的。比如,有效的http代理服务器ip是:102.236.35.98:8866。这个时候,你随便改动IP,使用下面的代码,都能正常跑通。

    def use_proxy(proxy_addr,url):
        import urllib.request
        proxy=urllib.request.ProxyHandler({"http":"http://"+proxy_addr})
        print (proxy_addr)
        headers=("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5193.400 QQBrowser/10.0.1066.400")
        opener=urllib.request.build_opener(proxy)
        opener.addheaders=[headers]                                                                                                                                                                                                                                                   
        data=opener.open(url).read().decode('utf-8')
        print (data)
        return data
    #获取本机ip地址
    import socket
    hostname = socket.gethostname()
    ip = socket.gethostbyname(hostname)
    print ("本机电脑名:",hostname)
    print ("本机Ip:",ip)
    #proxy_addr="101.236.35.98:8866"
    proxy_addr="104.236.35.98:8866"#随便改动ip地址。
    data=use_proxy(proxy_addr,"https://www.baidu.com")
    #print (data)
    print (len(data))
    

    为了验证一下ip地址没有起到任何作用。我们修改url为:https://httpbin.org/get

    因为这个url的response是客户端的ip地址,可以看到结果如下:

    可以看到本机的ip是192.168.8.100,设置的代理服务器的ip是

    104.236.35.98:8866,而服务器端记录的客户端的ip地址是:117.61.138.21.
    你继续改动代理服务器的ip地址:可以看到,服务器端记录的客户端ip地址仍然是:117.61.138.21

    为什么117.61.138.21和我的本机ip不一样呢。

    这是因为我的电脑连接的是wifi热点。所以服务器实际记录的客户端ip地址就不是我的电脑显示的。

  • 相关阅读:
    小谢第18问:如何让element-ui的弹出框每次显示的时候初始化,重新加载元素?
    小谢第7问:js前端如何实现大文件分片上传、上传进度、终止上传以及删除服务器文件?
    小谢第36问:elemet
    小谢第35问:已经 git commit 的代码怎么回退到本地
    小谢第34问:vue中路由传参params 和 query区别
    小谢第33问:获取对象所有的属性值
    小谢第32问:git 可视化管理工具
    小谢第31问:git拉取所有分支
    小谢第30问:get拼接字符串常用接口含义
    小谢第29问:Vue项目打包部署到服务器上,调接口就报js,css 文件404
  • 原文地址:https://www.cnblogs.com/xiaojieshisilang/p/9296968.html
Copyright © 2020-2023  润新知