最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python爬虫进阶:爬取代理IP

    正文概述    2020-06-08   384

    Python爬虫进阶:爬取代理IP

    在我们爬虫的过程中,难免会遇到比较恶心的网站(安全性较高),来阻止我们的爬虫,跑着跑着,就断掉了!报错了啊!丢失连接之类的。幸幸苦苦的抓了半天又得从头来,心累啊!

    这就是网站的反爬虫在起作用了。

    一般来说我们会遇到网站反爬虫策略下面几点:

    限制IP访问频率,超过频率就断开连接。(这种方法解决办法就是,降低爬虫的速度在每个请求前面加上time.sleep;或者不停的更换代理IP,这样就绕过反爬虫机制啦!)

    后台对访问进行统计,如果单个userAgent访问超过阈值,予以封锁。(效果出奇的棒!不过误伤也超级大,一般站点不会使用,不过我们也考虑进去。

    还有针对于cookies的 (这个解决办法更简单,一般网站不会用)

    有些网站会监测你的IP,如果在某一时间段内,你的IP多次访问网页,就会封锁你的IP,过段时间再放出来。

    对于第一种限制IP的,我们怎么来防止这种反爬虫呢?(与本篇博客无关,只是想挑起大家的好奇心)

    对咯,就是用代理IP,OK,想要获取到代理IP,就要找到多个IP,所以我们今天先做第一步,把代理ip网站的所有IP给抓取下来;

    我这里找到的一个网站是http://www.66ip.cn/,个人感觉还不错,反正是用来练手,嘿嘿~~~

    步骤1、爬取整个网页

    我们的思路是:先把网页所有内容爬取下来,然后再提取我们需要的信息。

    首先按照惯例我们导入模块:

    # -*- coding:utf-8 -*-
    import bs4
    import urllib
    from bs4 import BeautifulSoup
    import urllib2

    我们写一个基本的请求网页并返回response的函数:

    # -*- coding:utf-8 -*-
    import bs4
    import urllib
    from bs4 import BeautifulSoup
    import urllib2
    #构造网页请求函数
    def gethtml(url):
        request = urllib2.Request(url)
        response = urllib2.urlopen(request)
        html = response.read()
        return html

    哈哈,简单吧!

    这只是基本的,其实学过爬虫的都知道,很多网站都都会拒绝非浏览器的请求的、怎么区分的呢?就是你发起的请求是否包含正常的User-Agent 这玩意儿长啥样儿?就下面这样(如果不一样 请按一下F5)

    Python爬虫进阶:爬取代理IP

    requests的请求的User-Agent 大概是这样 python-requests/2.3.0 CPython/2.6.6 Windows/7 这个不是正常的User-Agent、所以我们得自己造一个来欺骗服务器(requests又一个headers参数能帮助我们伪装成浏览器哦!不知道的小哥儿 一定是没有看官方文档!在这里request官方文档这样很不好诶!o(一︿一+)o),让他以为我们是真的浏览器。

    所以我们修改一下代码:

    # -*- coding:utf-8 -*-
    import bs4
    import urllib
    from bs4 import BeautifulSoup
    import urllib2
    #构造网页请求函数
    def gethtml(url):
        user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 
        Safari/537.36"
        headers = {"User-Agent":user_agent}
        request = urllib2.Request(url,headers = headers)
        response = urllib2.urlopen(request)
        html = response.read()
        return html

    好了,接下来就要写主函数了~~撸起袖子开干!!

    步骤2、打开网站,查看IP所处位置

    按F12

    Python爬虫进阶:爬取代理IP

    发现所有IP信息都在tr标签下的td节点中。OK,很好,非常好,非常方便~~

    现在我们要做的就是找到这个标签。

    先用BeautifulSoup解析网页

    sp = bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")
    trs = sp.find_all("tr")
    for tr in trs:  # tr是每一行
        for a in tr.children:
            # 发现a的编码方式是unicode,所以讲unicode转成utf-8字符串
            ip_val = a.string.encode('utf-8').strip()
            print ip_val

    好了,上面我们已经打印出来了td标签里面的所有内容。可是我们这里只想要IP怎么办呢??

    好办,我们来判断抓取到的数据是不是IP,大家都知道,IP是有四位整数,通过点(.)来分隔的。恩,找到规律后,我们来定义一个函数来判断IP。

    def is_invalid_ip4(ip):
        ip = ip.strip()
        # ip4格式:a.b.c.d
        its = [v for v in ip.split('.')]
        # .分数不对
        if len(its) != 4:
            return False
        # 值不是数字
        for v in its:
            if not v.isdigit():
                return False
        return True

    好了,我们来调用这个函数,修改上面的代码:

    #使用beautifulsoup来解析网页
    sp = bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")
    trs = sp.find_all("tr")
    #先定义一个空列表,用于存放爬取到的ip
    iplist = []
    for tr in trs:
        # tr是每一行
        for a in tr.children:
            # 发现a的编码方式是unicode,所以讲unicode转成utf-8字符串
            ip_val = a.string.encode('utf-8').strip()
            #调用判断有效ip函数
            if is_invalid_ip4(ip_val):
                iplist.append(ip_val)
                print ip_val
            #这里发现ip在tr的第一列,所以我们每次取到第一个数据后跳出
            break
    print '-'*32#我是分隔符

    好了,这样我们就吧爬取到的IP放进了iplist这个列表里。

    怎么样,很简单吧~~

    步骤3、整理代码

    那假如我们想要很多条IP怎么办,一页根本不够啊,OK,统统满足你——爬取多个网页的IP,就要不停的请求网页,那这个网址是变化的怎么办?

    好吧,我又帮你找到规律了,只需要将网址的index改变就可以了。好吧,

    完整代码:

    # -*- coding:utf-8 -*-
    import bs4
    import urllib
    from bs4 import BeautifulSoup
    import urllib2
    import requests
    # 网址:http://www.66ip.cn/index.html
    #这里看出每一页的网址由index下标表示,即index是几就代表第几页
    #我这里只爬取五个,你随意啊
    def main():
        #先定义一个空列表,用于存放爬取到的ip
        iplist = []
        for i in range(1,5):
            #构造url
            s = ".html"
            url = "http://www.66ip.cn/"
            #调用网页请求函数
            cur_url = url + str(i) + s
            html_doc = gethtml(cur_url)
            #使用beautifulsoup来解析网页
            sp = bs4.BeautifulSoup(html_doc,'html.parser',from_encoding="utf-8")
            trs = sp.find_all("tr")
            for tr in trs:
                # tr是每一行
                for a in tr.children:
                    #发现a的编码方式是unicode,所以讲unicode转成utf-8字符串
                    ip_val = a.string.encode('utf-8').strip()
                    #调用判断有效ip函数
                    if is_invalid_ip4(ip_val):
                        iplist.append(ip_val)
                        print ip_val
                    #这里发现ip在tr的第一列,所以我们每次取到第一个数据后跳出
                    break
            print '-'*32#我是分隔符
    def is_invalid_ip4(ip):
        ip = ip.strip()
        # ip4格式:a.b.c.d
        its = [v for v in ip.split('.')]
        # .分数不对
        if len(its) != 4:
            return False
        # 值不是数字
        for v in its:
            if not v.isdigit():
                return False
        return True
    #构造网页请求函数
    def gethtml(url):
        user_agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 
        Safari/537.36"
        headers = {"User-Agent":user_agent}
        request = urllib2.Request(url,headers = headers)
        response = urllib2.urlopen(request)
        html = response.read()
        return html
    if __name__ == "__main__":
        main()

    完美!!

    结果如下:

    Python爬虫进阶:爬取代理IP

    python学习网,免费的在线学习python平台,欢迎关注!

    本文转自:https://blog.csdn.net/MTbaby/article/details/75645602


    起源地下载网 » Python爬虫进阶:爬取代理IP

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元