zoukankan      html  css  js  c++  java
  • 爬虫关于ip管理池的应用

    在爬虫的时候经常会遇到一个问题就是ip被封,由于ip对网站的短时间大量请求,让网站将我们的ip暂时封掉。这样我们就无法全部爬取自己想要的内容。

    这里百度了一下解决办法,很多人都提到了ip代理管理池的问题,其大致思想就是在一些网站上找一些免费的ip代理,然后将他们放入一个列表中,这样我们就可以用这些免费的ip代理来不断更换,每当一个ip被封后我们就用代码调用下一个ip代理,直到我们爬完我们想要的数据。

    大致思路如下:(这里我用Python来讲)

      1.访问一个国内免费ip代理的网站(注意要获取高匿的ip),这里我们以网站有代理(http://www.youdaili.net/)为例,进入后找到http代理点击进入,然后点击列表中最新日期的免费代理,就可以看到很多最新的免费ip代理

      2.用Python的BeautifulSoup解析这个页面,从页面中获取所有的ip地址及端口号,组合(ip:port的形式)起来存入一个列表中,

      3.获得了所有的ip后,接下来我么要验证这些ip能不能用,因为免费的ip代理大部分都是不能用的,所以我们就要从这些在网页上爬取的ip进行检查,去掉那些不能用的,具体方法是(注意一点Python中代理参数的格式是proxy=  {'http':'http://ip:port'}):首先我们将ip配置为Python中代理参数的默认格式,然后我们用urllib.request.ProxyHandler方法将proxy传入,接着用urllib.request.build.opener和urllib.request.install_opener()一次处理,代理参数就配置好了,然后我们以百度为测试网站,测试看看我们的代理ip能不能,用urllib.request.urlopen()如果能返回则证明可用反之不能用。能用的话我们就添加到一个新的列表中加一保存

      注:出入讲解的缘故,一下代码只爬取的免费代理网站上面的首页所有ip和port,至于翻页什么的大家应该可以自己搞定

    代码如下:

     

    import urllib.request
    from bs4 import BeautifulSoup
    #访问免费ip代理网址:http://www.youdaili.net/Daili/http/29381.html,处理得到所有的ip
    def htmlParser(url):
        iplist=[]
        #设置头部
        user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
        headers = {"User-Agent": user_agent}
        req = urllib.request.Request(url, headers=headers)
        #获取页面html
        html=urllib.request.urlopen(req).read()
        soup=BeautifulSoup(html,'html.parser')
        datas=soup.find("div",{"class":"content"}).findAll("p")
        for data in datas:
            ip=data.get_text().split("@")[0]
            iplist.apend(ip)
        return iplist
    
    
    #检测ip是否可用
    def confirm_ip(ip):
        #配置proxy
        proxy={'http':'http://%s'%ip}
        proxy_handler=urllib.request.ProxyHandler(proxy)
        proxy=urllib.request.bulid_handler(proxy_handler)
        urllib.request.install_handler(proxy)
    
        #用百度首页检测代理ip
        test_url="http://www.baidu.com"
        user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
        headers = {"User-Agent": user_agent}
        req = urllib.request.Request(test_url, headers=headers)
    
        try:
            response=urllib.request.urlopen(req)
            content=response.read()
            #获取到内容
            if content:
                print("its a right ip")
                return ip
            #没有获取到
            else:
                return None
        #访问错误
        except urllib.request.URLError as e:
            print(e.reason)
            return None
    
    trueIp=[]
    url="http://www.youdaili.net/Daili/http/29381.html"
    iplist=htmlParse(url)
    for ip in iplist;
        if confirm_ip(ip)!=None:
           trueIp.append(ip)
    
    print(trueIp)
    

    好了内容就是这么都,有不妥的地方欢迎大家交流.(吐槽一下:博客园编辑器好垃圾,第一次徒手在自带的编辑器上写,写完了看到下面一个换色,一点所有代码不见了!产品经理把这个功能改一下吧!加个提醒也行啊!!)

  • 相关阅读:
    Android 单元测试
    Android 读取和保存文件(手机内置存储器)
    Android 检查是否安装SD卡
    Android 检测网络是否可用
    Android 获取网络链接类型
    Android 中如何使用动画
    Ubuntu 下对ADT 添加别名(alias)
    Docker 配置固定IP及桥接的实现方法(转载)
    macOS下通过docker在局域网成功访问mysql5.6数据库
    MySQL 8.0 Docker使用注解
  • 原文地址:https://www.cnblogs.com/wenyi1992/p/6290644.html
Copyright © 2011-2022 走看看