IP代理池的維護

IP代理池的維護可以分爲以下幾步:

1.存儲模塊:負責存儲抓取下來的代理。一般比較高效方便的存儲方式是使用Redis的Sorted Set,有序集合。

2.獲取模塊:需要定時在各大代理網站抓取代理。此模塊儘量從不同來源獲取代理,儘量抓取高匿代理,抓取成功後將可用代理保存到數據庫中。

3.檢測模塊:需要定時檢測數據庫中的代理,這裏需要設置一個檢測鏈接,最好是抓取那個網站就檢測那個網站,這樣更有針對性。如果要做一個通用型的代理,那可以設置百度等鏈接來檢測。我們還需要標識每一個代理的狀態,如設置分數標識,100分代表可用,分數越少代表越不可用。新獲取的代理檢測一次分數設置爲10分,如果代理可用,我們可以將分數立即設置成100分,不可用則減1分,到0分時移除代理。

4.接口模塊:需要用API來提供對外服務的接口。比較安全的獲取數據庫數據的方式是提供一個Web API接口,通過訪問接口拿到可用代理。另外,由於可用代理可能有多個,那麼我們可以設置一個隨機返回某個可用代理的接口,這樣就能保證每個可用代理都可以獲取到,實現負載均衡。

以下是獲取模塊從西刺代理獲取第一頁ip的代碼(如有錯誤請指出)

from faker import Faker  #faker庫可以用來獲取隨機UA,還有其他比如隨機地址、隨機姓名都可以
import requests
from bs4 import BeautifulSoup
from lxml import etree

dict={}
f = Faker(local='zh-CN')
ua = f.user_agent()
headers = {
    'User-Agent':ua
    }   

def xicidaili():
    start_url = 'http://www.xicidaili.com'
    html = requests.get(start_url,headers= headers)
    soup = BeautifulSoup(html.text,'lxml')
    td = soup.find('table',{'id':'ip_list'})
    trs = td.find_all('tr')[2:22]
    
    for i in trs:
        ip = i.find_all('td')[1].text
        port = i.find_all('td')[2].text
        dict[ip]=port
    print(dict)
    return dict  #最後生成的是字典格式,如:{'114.218.138.145':'8118'}

if __name__ == '__main__':
    xicidaili()

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章