python 爬蟲 ip池怎麼做,有什麼思路?

N叔談資料採集發表於2023-03-01

python 爬蟲 ip池怎麼做,有什麼思路?


對於HTTP代理池的維護,可以從以下幾個方面入手:


1.驗證HTTP代理的可用性


可以透過requests庫向目標網站傳送請求,判斷HTTP代理是否能夠成功返回響應。如果返回成功,則說明HTTP代理可用,否則說明HTTP代理已失效。可以在程式碼中設定超時時間,避免長時間等待無響應的HTTP代理。

import requests
def check_proxy(proxy):
    try:
        response = requests.get(url, proxies=proxy, timeout=3)
        if response.status_code == 200:
            return Trueexcept:
        passreturn False


2.更新HTTP代理池


可以透過定期爬取HTTP代理網站或者購買付費HTTP代理服務來獲取新的HTTP代理。可以使用requests庫向HTTP代理網站傳送請求,獲取HTML頁面,並使用BeautifulSoup庫解析HTML頁面,從而獲取HTTP代理資訊。透過一定的篩選規則,可以將新獲取的HTTP代理加入到HTTP代理池中。

import requests
from bs4 import BeautifulSoup
def get_proxies():
    url = '
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    table = soup.find('table', {'id': 'ip_list'})
    tr_list = table.find_all('tr')
    proxies = []
    for tr in tr_list[1:]:
        td_list = tr.find_all('td')
        ip = td_list[1].text
        port = td_list[2].text
        protocol = td_list[5].text.lower()
        proxy = '{}://{}:{}'.format(protocol, ip, port)
        proxies.append(proxy)
    return proxies


3.維護HTTP代理的質量


可以透過一些指標來衡量HTTP代理的質量,比如連線速度、響應時間、訪問成功率等。可以定時對HTTP代理進行評估,篩選出質量較好的IP,並從HTTP代理池中刪除質量較差的IP。

import requests
from multiprocessing import Pool
from functools import partial
def check_proxy_quality(proxy):
    try:
        response = requests.get(url, proxies=proxy, timeout=3)
        if response.status_code == 200:
            return True, response.elapsed.total_seconds()
    except:
        passreturn False, Nonedef evaluate_proxies(proxies):
    pool = Pool(processes=8)
    results = pool.map(partial(check_proxy_quality), proxies)
    pool.close()
    pool.join()
    quality_proxies = []
    for proxy, result in zip(proxies, results):
        is_valid, response_time = result
        if is_valid:
            quality_proxies.append((proxy, response_time))
    return quality_proxies


4.監控HTTP代理的使用情況


對於監控HTTP代理的使用情況,一種比較簡單的方法是記錄每個HTTP代理的使用次數和成功率,以便及時發現哪些HTTP代理不再可用或者質量較差。


可以使用Python內建的shelve模組,將HTTP代理的使用情況儲存在一個本地檔案中。shelve模組可以提供類似字典的資料儲存方式,方便快捷地讀取和寫入資料。


以下是一個簡單的示例程式碼:

import shelve
class ProxyManager:
    def __init__(self, filename='proxies.db'):
        self.filename = filename
        self.proxies = shelve.open(filename, writeback=True)
        if not self.proxies.get('used_proxies'):
            self.proxies['used_proxies'] = {}
    def mark_as_used(self, proxy):
        if proxy in self.proxies:
            self.proxies[proxy]['used_times'] += 1
            self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times']
        else:
            self.proxies[proxy] = {'used_times': 1, 'success_times': 0, 'success_rate': 0}
        self.proxies['used_proxies'][proxy] = True
    def mark_as_success(self, proxy):
        if proxy in self.proxies:
            self.proxies[proxy]['success_times'] += 1
            self.proxies[proxy]['success_rate'] = self.proxies[proxy]['success_times'] / self.proxies[proxy]['used_times']
        else:
            self.proxies[proxy] = {'used_times': 1, 'success_times': 1, 'success_rate': 1}
        self.proxies['used_proxies'][proxy] = True
    def is_used(self, proxy):
        return self.proxies['used_proxies'].get(proxy)
    def close(self):
        self.proxies.close()


在使用HTTP代理進行網路請求時,可以先檢查該HTTP代理是否已被使用過。如果該HTTP代理已被使用過,則不再使用該HTTP代理。如果該HTTP代理未被使用過,則使用該HTTP代理進行網路請求,並在請求成功或失敗後,更新該HTTP代理的使用情況。


以下是一個簡單的示例程式碼:

def get_page(url, proxy_manager):
    for i in range(3):
        proxy = get_proxy(proxy_manager)
        if proxy:
            try:
                response = requests.get(url, proxies={'http': proxy, 'https': proxy}, timeout=3)
                if response.status_code == 200:
                    proxy_manager.mark_as_success(proxy)
                    return response.text
            except:
                pass
            proxy_manager.mark_as_used(proxy)
    return None
def get_proxy(proxy_manager):
    proxies = list(proxy_manager.proxies.keys())
    for proxy in proxies:
        if not proxy_manager.is_used(proxy):
            return proxy
    return None


需要注意的是,shelve模組的寫入操作可能比較耗時,如果HTTP代理池較大,可以考慮每隔一段時間將HTTP代理使用情況儲存在本地檔案中,以提高效能。同時,如果HTTP代理池中存在較多已失效的HTTP代理,證明這個池子的IP可用率已經極低了,還是會更建議大傢伙使用優質廠商提供的HTTP代理。


正常情況下,很多人會說隨著經濟下行,能有使用的就已經不錯了, 還談什麼腳踏車,且不談免費的HTTP代理的連通性,實際上只要選對HTTP代理,採購的成本也會在我們的承受範圍內的。例如,此前我們蒐集了這幾家的動態共享HTTP代理:

注:動態短效代理有按時和按量之分,都已經幾種彙總了:


HTTP代理型別

分類

代表廠商

白名單數

基礎套餐

(元/月)

平均IP單價

(元/IP)

動態短效HTTP代理

按時計費

以IP通道為增量

青果網路

256

29

0.0006

小象代理

5

109

0.0050

以每日IP量為增量

巨量代理

5

155

0.0049

豌豆代理

5

300

0.0025

訊代理

1

210

0.0583

品易代理

20

120

0.0070

芝麻代理

5

360

0.0182

按量計費

/

青果網路

256

30

0.0030

豌豆代理

5

200

0.0200

小象代理

5

100

0.0100

巨量代理

5

75

0.0140

品易代理

20

100

0.0100

芝麻代理

5

420

0.0420

拿青果網路來說,29一個月,均攤到每天也就1塊錢,差不多是一瓶水的價格了。從業務結果的表現而言,也算可圈可點:

python 爬蟲 ip池怎麼做,有什麼思路?


當然,我們選擇HTTP代理廠商都是基於各自業務的場景需求,不同場景所需的HTTP代理產品也不同,但各位可以測試了看看,所有的產品都要最紅應用到自身,才能知道效果如何。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70025002/viewspace-2937638/,如需轉載,請註明出處,否則將追究法律責任。

相關文章