1. 程式人生 > >小白也能做的IP代理池,好久沒更新了,不知道你們想看什麽呢!

小白也能做的IP代理池,好久沒更新了,不知道你們想看什麽呢!

不知道 一個 pytho 爬取 save 包含著 異步處理 使用方法 gen

IP代理池制作

GitHub主頁:

https://github.com/hfldqwe/

使用工具:

ip代理抓取: requests

後臺搭建: Django+Redis

代理檢測:
ip地址查詢:http://ip.chinaz.com/
這個網站提供的接口:http://ip.chinaz.com/getip.aspx

代理抓取地址:
西刺代理:http://www.xicidaili.com/nn/ + num


設計思路

  • 爬取代理ip,獲取如下信息:

    • IP地址
    • 端口
    • 服務器地址
    • 類型
    • 是否匿名
    • 類型
    • 存活時間
    • 驗證時間
  • 分別在Redis中和ip查詢接口中,驗證代理,成功則計算過期時間,並進行分類。

  • 將狀態,類型,過期時間分別寫入Redis。

達成目標

  • 每隔15分鐘進行爬取
  • ip代理自動去重
  • 提供Python的調用的接口,和http接口
  • 保證代理的高可用,在每次調用的時候驗證代理可靠性

使用方法:

在後臺運行ip_proxies.py這個文件,每隔十五分鐘更新代理

在文件中導入或者繼承ip_proxies.py中的AgentIpPool模塊,有以下幾個方法:

  • get_one(type)

    • type可以是 "http" 或者 "https",隨機返回一個可用的代理,格式是:127.0.0.1:8000
  • get_all(type)
    • 和上面是一樣的,只是返回所有的而已,但是測試發現有一點問題

以下是可以重寫修改的方法

  • save_ip(ip_dict)

    • 給一個ip字典作為參數,進行分類保存
    • 返回一個
  • get_ip(num)

    • 給一個頁數
    • 返回一個集合,滅每個元素是一個元組,記錄著代理的信息
  • verify_http(ip,port,timeout=3)

    • 三個參數,返回一個布爾值
    • 用來驗證代理是否可用,同樣有verify_https(self,ip,port,timeout=3)用來驗證https代理是否可用
  • filter_in_web(ip_set)

    • 參數是一個由包含著ip信息的元組組成的集合
    • 調用了verify_http和verify_https判斷代理是否可用
  • filter_one(able_ip,func)

    • 用來取出代理時候進行的驗證
    • able_ip是從redis中取出的ip,func是使用這個方法的方法,也就是在get_one中就是get_one,在get_all中就是get_all
  • filter_all(able_ip,func)

    • 同上
    • able_ip是上面所說的able_ip組成的集合
  • write_pool()
    • 對之前的一個封裝,這裏也是最需要改進的地方。

缺陷:

缺陷很明顯,以下幾個地方需要改進:

  • 異步處理:這個沒有做異步,為什麽呢?因為我還不是很熟練,後面要加上去,這樣就可以直接調用就行了,不用在後臺運行。另外在進行爬取和驗證的時候就不需要阻塞了

  • 模塊之間的邏輯:不是很清晰,需要改進邏輯方面的問題,感覺現在寫的東西還是太死了,還是沒有學會解耦合的思想

小白也能做的IP代理池,好久沒更新了,不知道你們想看什麽呢!