点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!

不知道大家有没有遇到过“访问频率太高”这样的网站提示,我们需要等待一段时间或者输入一个验证码才能解封,但这样的情况之后还是会出现。出现这个现象的原因就是我们所要爬取的网页采取了反爬虫的措施,比如当某个ip单位时间请求网页次数过多时,服务器会拒绝服务,这种情况就是由于访问频率引起的封ip,这种情况靠解封不能很好的解决,所以我们就想到了伪装本机ip去请求网页,也就是我们今天要讲的使用代理ip。

目前网上有许多代理ip,有免费的也有付费的,例如西刺代理等,免费的虽然不用花钱但有效的代理很少且不稳定,付费的可能会好一点,不过今天我只爬取免费的代理并将检测是否可用,将可用ip存入MongoDB,方便下次取出。

运行平台:Windows

Python版本:Python3.6

IDE: Sublime Text

其他:Chrome浏览器

简述流程为:

步骤1:了解requests代理如何使用

步骤2:从代理网页爬取到ip和端口

步骤3:检测爬取到的ip是否可用

步骤4:将爬取的可用代理存入MongoDB

步骤5:从存入可用ip的数据库里随机抽取一个ip,测试成功后返回

对于requests来说,代理的设置比较简单,只需要传入proxies参数即可。

不过需要注意的是,这里我是在本机安装了抓包工具Fiddler,并用它在本地端口8888创建了一个HTTP代理服务(用Chrome插件SwitchyOmega),即代理服务为:127.0.0.1:8888,我们只要设置好这个代理,就可以成功将本机ip切换成代理软件连接的服务器ip了。

  1. import requests

  2. proxy = '127.0.0.1:8888'

  3. proxies = {

  4.    'http':'http://' + proxy,

  5.    'https':'http://' + proxy

  6. }

  7. try:

  8.    response = requests.get('http://httpbin.org/get',proxies=proxies)

  9.    print(response.text)

  10. except requests.exceptions.ConnectionError as e:

  11.    print('Error',e.args)

这里我是用来http://httpbin.org/get作为测试网站,我们访问该网页可以得到请求的有关信息,其中origin字段就是客户端ip,我们可以根据返回的结果判断代理是否成功。返回结果如下:

  1. {

  2.    "args":{},

  3.    "headers":{

  4.        "Accept":"*/*",

  5.        "Accept-Encoding":"gzip, deflate",

  6.        "Connection":"close",

  7.        "Host":"httpbin.org",

  8.        "User-Agent":"python-requests/2.18.4"

  9.    },

  10.    "origin":"xx.xxx.xxx.xxx",

  11.    "url":"http://httpbin.org/get"

  12. }

接下来我们便开始爬取代理IP,首先我们打开Chrome浏览器查看网页,并找到ip和端口元素的信息。

可以看到,代理IP以表格存储ip地址及其相关信息,所以我们用BeautifulSoup提取时很方便便能提取出相关信息,但是我们需要注意的是,爬取的ip很有可能出现重复的现象,尤其是我们同时爬取多个代理网页又存储到同一数组中时,所以我们可以使用集合来去除重复的ip。

将要爬取页数的ip爬取好后存入数组,然后再对其中的ip逐一测试。

这里就用到了上面提到的requests设置代理的方法,我们使用http://httpbin.org/ip作为测试网站,它可以直接返回我们的ip地址,测试通过后再存入MomgoDB数据库。

连接数据库然后指定数据库和集合,再将数据插入就OK了。

最后运行查看一下结果吧

运行了一段时间后,难得看到一连三个测试通过,赶紧截图保存一下,事实上是,毕竟是免费代理,有效的还是很少的,并且存活时间确实很短,不过,爬取的量大,还是能找到可用的,我们只是用作练习的话,还是勉强够用的。现在看看数据库里存储的吧。

因为爬取的页数不多,加上有效ip也少,再加上我没怎么爬,所以现在数据库里的ip并不多,不过也算是将这些ip给存了下来。现在就来看看怎么随机取出来吧。

由于担心放入数据库一段时间后ip会失效,所以取出前我重新进行了一次测试,如果成功再返回ip,不成功的话就直接将其移出数据库。

这样我们需要使用代理的时候,就能通过数据库随时取出来了。

总的代码如下:

  1. import random

  2. import requests

  3. import time

  4. import pymongo

  5. from bs4 import BeautifulSoup

  6. # 爬取代理的URL地址,选择的是西刺代理

  7. url_ip = "http://www.xicidaili.com/nt/"

  8. # 设定等待时间

  9. set_timeout = 5

  10. # 爬取代理的页数,2表示爬取2页的ip地址

  11. num = 2

  12. # 代理的使用次数

  13. count_time = 5

  14. # 构造headers

  15. headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}

  16. # 测试ip的URL

  17. url_for_test = 'http://httpbin.org/ip'

  18. def scrawl_xici_ip(num):

  19.    '''

  20.    爬取代理ip地址

  21.    '''  

  22.    ip_list = []

  23.    for num_page in range(1,num):

  24.        url = url_ip + str(num_page)

  25.        response = requests.get(url,headers=headers)

  26.        if response.status_code == 200:

  27.            content = response.text

  28.            soup = BeautifulSoup(content,'lxml')

  29.            trs = soup.find_all('tr')

  30.            for i in range(1,len(trs)):

  31.                tr = trs[i]

  32.                tds = tr.find_all('td')      

  33.                ip_item = tds[1].text + ':' + tds[2].text

  34.                # print(ip_item)

  35.                ip_list.append(ip_item)

  36.                ip_set = set(ip_list) # 去掉可能重复的ip

  37.                ip_list = list(ip_set)

  38.            time.sleep(count_time) # 等待5秒

  39.    return ip_list

  40. def ip_test(url_for_test,ip_info):

  41.    '''

  42.    测试爬取到的ip,测试成功则存入MongoDB

  43.    '''

  44.    for ip_for_test in ip_info:

  45.        # 设置代理

  46.        proxies = {

  47.            'http': 'http://' + ip_for_test,

  48.            'https': 'http://' + ip_for_test,

  49.            }

  50.        print(proxies)

  51.        try:

  52.            response = requests.get(url_for_test,headers=headers,proxies=proxies,timeout=10)

  53.            if response.status_code == 200:

  54.                ip = {'ip':ip_for_test}

  55.                print(response.text)

  56.                print('测试通过')

  57.                write_to_MongoDB(ip)    

  58.        except Exception as e:

  59.            print(e)

  60.            continue

  61. def write_to_MongoDB(proxies):

  62.    '''

  63.    将测试通过的ip存入MongoDB

  64.    '''

  65.    client = pymongo.MongoClient(host='localhost',port=27017)

  66.    db = client.PROXY

  67.    collection = db.proxies

  68.    result = collection.insert(proxies)

  69.    print(result)

  70.    print('存储MongoDB成功')

  71. def get_random_ip():

  72.    '''

  73.    随机取出一个ip

  74.    '''

  75.    client = pymongo.MongoClient(host='localhost',port=27017)

  76.    db = client.PROXY

  77.    collection = db.proxies

  78.    items = collection.find()

  79.    length = items.count()

  80.    ind = random.randint(0,length-1)

  81.    useful_proxy = items[ind]['ip'].replace(' ','')

  82.    proxy = {

  83.        'http': 'http://' + useful_proxy,

  84.        'https': 'http://' + useful_proxy,

  85.        }  

  86.    response = requests.get(url_for_test,headers=headers,proxies=proxy,timeout=10)

  87.    if response.status_code == 200:

  88.        return useful_proxy

  89.    else:

  90.        print('此{ip}已失效'.format(useful_proxy))

  91.        collection.remove(useful_proxy)

  92.        print('已经从MongoDB移除')

  93.        get_random_ip()

  94. def main():

  95.    ip_info = []

  96.    ip_info = scrawl_xici_ip(2)

  97.    sucess_proxy = ip_test(url_for_test,ip_info)

  98.    finally_ip = get_random_ip()

  99.    print('取出的ip为:' + finally_ip)

  100. if __name__ == '__main__':

  101.    main()

  • zhihu.com/people/hdmi-blog

  • 程序员大咖整理发布,转载请联系作者获得授权

【点击成为源码大神】

用Python爬虫抓取免费代理IP相关推荐

  1. 第11篇- 抓取免费代理IP并搭建自己的代理IP池

    提前声明:该专栏涉及的所有案例均为学习使用,如有侵权,请联系本人删帖! 文章目录 一.前言 二.了解代理IP 三.抓取代理ip网站 四.完整代码 一.前言 使用代理IP原因:对于我们数据抓取来说,由于 ...

  2. 简单爬虫-爬取免费代理ip

    环境:python3.6 主要用到模块:requests,PyQuery 代码比较简单,不做过多解释了 #!usr/bin/python # -*- coding: utf-8 -*- import ...

  3. Python爬虫:爬取免费代理ip

    之前写的几个爬虫都只能爬取到少量的信息,这是由于一个ip频繁地访问网站,会被认定为非正常的爬虫从而被屏蔽,这时候就需要使用代理ip来访问网站了,具体方法就是在发送request时添加一个proxy参数 ...

  4. 多线程爬取免费代理ip池 (给我爬)

    多线程爬取免费代理ip池 (给我爬) 文章目录 多线程爬取免费代理ip池 (给我爬) 安装的库 IP 隐藏 代理ip 多线程爬取 读入代理ip 写入代理ip 验证代理ip 解析网页得到代理ip 获取网 ...

  5. Python学习教程:Python爬虫抓取技术的门道

    Python学习教程:Python爬虫抓取技术的门道 web是一个开放的平台,这也奠定了web从90年代初诞生直至今日将近30年来蓬勃的发展.然而,正所谓成也萧何败也萧何,开放的特性.搜索引擎以及简单 ...

  6. 如何用python爬股票数据_python爬虫股票数据,如何用python 爬虫抓取金融数据

    Q1:如何用python 爬虫抓取金融数据 获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为 ...

  7. python爬虫抓取网站技巧总结

    不知道为啥要说是黑幕了??哈哈哈-..以后再理解吧 python爬虫抓取网站的一些总结技巧 学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛 ...

  8. python 爬虫抓取心得分享

    /** author: insun title:python 爬虫抓取心得分享 blog:http://yxmhero1989.blog.163.com/blog/static/11215795620 ...

  9. Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

最新文章

  1. 并发编程基础篇——第一章(并发相关基础概念理解)
  2. mess组网 中继_取代中继/子母路由 堪称最上乘的Mesh组网方式了解下
  3. 为什么Jedis操作后要主动归还?
  4. 字节、半字、字对齐方式
  5. 【网络通信与信息安全】之深入分析一个TCP连接可以发多少个HTTP请求相关问题
  6. win7系统电脑自动重启解决方法
  7. 【转载】广告系统架构解密
  8. Kotlin学习笔记19 阶段复习1
  9. 计算机二级省份,【计算机二级】这些省份发布报名时间!调整前的最后一次考试!...
  10. lightgbm过去版本安装包_谨慎更新华为EMUI10.1版本
  11. C# 编译或者解释?
  12. 2022年大厂中秋礼盒大赏,卷的就是创意!
  13. Androidx介绍及迁移
  14. 拼多多关键搜索、商品列表接口、商品详情接口
  15. 说透APP稳定性测试
  16. MCE公司:免疫治疗新课题——好心情,要保持!
  17. 渗透测试原理与基本进程
  18. 索尼Xperia S_4.0一键ROOT工具┇_┇免解锁┇_┇一分钟ROOT┇_┇
  19. EAN13条形码绘制(Delphi版)
  20. 相机视野拉伸,设置相机的Field Of View改变视野的大小

热门文章

  1. 给定数组,每个元素代表一个木头的长度,木头可以任意截断, 从这堆木头中截出至少k个相同长度为m的木块,已知k,求max(m)
  2. 1.新电脑开荒(拯救者R9000p)
  3. Loadrunner如何使用谷歌浏览器录制脚本
  4. 高级重命名工具(Advanced Renamer)3.85中文绿色便携商业版
  5. FAQ_05_查看 android 设备 ip
  6. ps性能打不开的解决方法
  7. 将音频格式wav格式转为g711u,g711a及g723
  8. uni-app使用支付宝小程序开发者工具开发钉钉小程序
  9. 由浅入深玩转华为WLAN—13 华为胖AP的常见配置
  10. 微信是通过哪个国家的服务器,安道尔到底是什么地方?为什么2000万人的微信地址都选在安道尔?...