国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python爬蟲,如何在代理的IP被封后立刻換下一個IP繼續(xù)任務?

這篇具有很好參考價值的文章主要介紹了python爬蟲,如何在代理的IP被封后立刻換下一個IP繼續(xù)任務?。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

在實際的爬蟲應用中,爬蟲程序經(jīng)常會通過代理服務器來進行網(wǎng)絡訪問,以避免訪問過于頻繁而受到網(wǎng)站服務器的限制。但是,代理服務器的IP地址也可能被目標網(wǎng)站限制,導致無法正常訪問。這時候,我們需要在代理IP被封后立刻換下一個IP繼續(xù)任務,以保證爬蟲的正常運行。

本文將介紹在Python中如何實現(xiàn)代理IP的動態(tài)切換,并給出相關的代碼案例。在講解具體實現(xiàn)方法之前,我們先了解一下代理服務器的基本原理。

python爬蟲,如何在代理的IP被封后立刻換下一個IP繼續(xù)任務?,python,爬蟲,tcp/ip,開發(fā)語言,1024程序員節(jié),網(wǎng)絡協(xié)議

一、 代理服務器的工作原理

代理服務器是一種在客戶端與服務器之間進行轉發(fā)的服務器。當客戶端向服務器發(fā)起網(wǎng)絡請求時,代理服務器會先接收這個請求,然后再將請求轉發(fā)給目標服務器,最后將目標服務器返回的響應結果再轉發(fā)給客戶端。代理服務器在這個過程中扮演了中間人的角色,可以對客戶端和服務器之間的通信進行攔截和修改。

代理服務器對爬蟲程序的作用主要體現(xiàn)在以下兩個方面:

  1. 隱藏客戶端的真實IP地址,保護客戶端的隱私和安全;
  2. 分散客戶端的網(wǎng)絡訪問,降低被目標服務器封禁的風險。

代理服務器有多種工作模式,其中最常用的模式是HTTP代理。HTTP代理是基于HTTP協(xié)議的代理模式,客戶端的HTTP請求會先被發(fā)送到代理服務器上,然后再由代理服務器轉發(fā)給目標服務器,例如以下代碼:

import requests

proxies = {
? ? 'http': 'http://127.0.0.1:8080', ?# HTTP代理服務器地址和端口
? ? 'https': 'http://127.0.0.1:8080' ?# HTTPS代理服務器地址和端口
}

response = requests.get("http://www.example.com", proxies=proxies)

在這個例子中,我們使用了requests庫來發(fā)送HTTP請求,其中proxies參數(shù)指定了HTTP代理服務器的地址和端口。需要注意的是,這里使用的代理服務器是本機上的一個HTTP代理服務器,如果要使用其他代理服務器,需要替換IP地址和端口號。

為了實現(xiàn)代理IP的動態(tài)切換,我們需要了解如何使用Python來自動獲取可用的代理IP列表,并在IP被封后自動切換到下一個可用的IP。接下來,我們將詳細介紹這個過程。

二、獲取可用的代理IP列表

獲取可用的代理IP列表有多種方法,其中一種常用的方法是從代理IP網(wǎng)站上爬取代理IP信息。代理IP網(wǎng)站上通常會提供免費的代理IP列表,我們只需要對其進行爬取和驗證即可得到可用的代理IP列表。

以下是一個實現(xiàn)自動獲取代理IP列表的示例代碼:

import requests
from bs4 import BeautifulSoup
import time

def get_proxy_list():
? ? # 獲取代理IP列表的URL
? ? url = "http://www.example.com/proxy_list.html"
? ? # 發(fā)送請求獲取頁面內(nèi)容
? ? response = requests.get(url)
? ? soup = BeautifulSoup(response.text, 'html.parser')
? ? # 解析HTML頁面,獲取代理IP列表
? ? proxy_list = []
? ? for tr in soup.find_all('tr'):
? ? ? ? tds = tr.find_all('td')
? ? ? ? if len(tds) == 2:
? ? ? ? ? ? ip = tds[0].get_text()
? ? ? ? ? ? port = tds[1].get_text()
? ? ? ? ? ? proxy = '{}:{}'.format(ip, port)
? ? ? ? ? ? proxy_list.append(proxy)
? ? return proxy_list

def test_proxy(proxy):
? ? # 測試代理IP的可用性
? ? try:
? ? ? ? proxies = {
? ? ? ? ? ? 'http': 'http://{}'.format(proxy),
? ? ? ? ? ? 'https': 'https://{}'.format(proxy)
? ? ? ? }
? ? ? ? response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
? ? ? ? if response.status_code == 200:
? ? ? ? ? ? return True
? ? except:
? ? ? ? return False

def get_available_proxies(proxy_list):
? ? # 獲取可用的代理IP列表
? ? available_proxies = []
? ? for proxy in proxy_list:
? ? ? ? if test_proxy(proxy):
? ? ? ? ? ? available_proxies.append(proxy)
? ? return available_proxies

if __name__ == '__main__':
? ? proxy_list = get_proxy_list()
? ? available_proxies = get_available_proxies(proxy_list)
? ? print('Available proxies: {}'.format(available_proxies))

在這個示例代碼中,我們首先定義了一個get_proxy_list函數(shù),用于從網(wǎng)站上獲取代理IP列表。該函數(shù)通過requests庫發(fā)送HTTP請求,然后使用BeautifulSoup庫解析HTML頁面,獲取代理IP列表。

接下來,我們定義了一個test_proxy函數(shù),用于測試代理IP的可用性。該函數(shù)使用requests庫發(fā)送HTTP請求,如果請求成功返回了200狀態(tài)碼,則認為該代理IP可用。

最后,我們定義了一個get_available_proxies函數(shù),用于獲取可用的代理IP列表。該函數(shù)遍歷原始代理IP列表,依次測試每個代理IP的可用性,將可用的代理IP添加到新的列表中。

注意,在測試代理IP的可用性時,我們需要設置一個較短的超時時間,以避免因為等待時間過長而浪費時間。此外,由于測試代理IP的過程很可能會失敗,因此我們還需要添加異常處理邏輯,確保程序不會因為一個代理IP的失效而停止運行。

三、實現(xiàn)代理IP的動態(tài)切換

在獲取可用的代理IP列表后,我們需要實現(xiàn)代理IP的動態(tài)切換。具體思路是,在向目標服務器發(fā)送HTTP請求前,先從代理IP列表中選取一個可用的代理IP,如果該代理IP不能正常工作,則切換到下一個可用的代理IP,直到找到能正常工作的代理IP為止。

以下是一個實現(xiàn)代理IP的動態(tài)切換的示例代碼:

import requests
from bs4 import BeautifulSoup
import random
import time

# 全局變量,代理IP列表
PROXY_LIST = []

def get_proxy_list():
? ? # 獲取代理IP列表的URL
? ? url = "http://www.example.com/proxy_list.html"
? ? # 發(fā)送請求獲取頁面內(nèi)容
? ? response = requests.get(url)
? ? soup = BeautifulSoup(response.text, 'html.parser')
? ? # 解析HTML頁面,獲取代理IP列表
? ? proxy_list = []
? ? for tr in soup.find_all('tr'):
? ? ? ? tds = tr.find_all('td')
? ? ? ? if len(tds) == 2:
? ? ? ? ? ? ip = tds[0].get_text()
? ? ? ? ? ? port = tds[1].get_text()
? ? ? ? ? ? proxy = '{}:{}'.format(ip, port)
? ? ? ? ? ? proxy_list.append(proxy)
? ? return proxy_list

def test_proxy(proxy):
? ? # 測試代理IP的可用性
? ? try:
? ? ? ? proxies = {
? ? ? ? ? ? 'http': 'http://{}'.format(proxy),
? ? ? ? ? ? 'https': 'https://{}'.format(proxy)
? ? ? ? }
? ? ? ? response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
? ? ? ? if response.status_code == 200:
? ? ? ? ? ? return True
? ? except:
? ? ? ? return False

def get_available_proxies(proxy_list):
? ? # 獲取可用的代理IP列表
? ? available_proxies = []
? ? for proxy in proxy_list:
? ? ? ? if test_proxy(proxy):
? ? ? ? ? ? available_proxies.append(proxy)
? ? return available_proxies

def get_random_proxy():
? ? # 獲取隨機的代理IP
? ? global PROXY_LIST
? ? if not PROXY_LIST:
? ? ? ? # 第一次使用時,先獲取可用的代理IP列表
? ? ? ? proxy_list = get_proxy_list()
? ? ? ? PROXY_LIST = get_available_proxies(proxy_list)
? ? if not PROXY_LIST:
? ? ? ? # 如果沒有可用的代理IP,等待一段時間后重試
? ? ? ? time.sleep(60)
? ? ? ? proxy_list = get_proxy_list()
? ? ? ? PROXY_LIST = get_available_proxies(proxy_list)
? ? return random.choice(PROXY_LIST)

def make_request(url):
? ? # 發(fā)送HTTP請求
? ? while True:
? ? ? ? # 從代理IP列表中隨機選擇一個IP
? ? ? ? proxy =

get_random_proxy()
? ? ? ? proxies = {
? ? ? ? ? ? 'http': 'http://{}'.format(proxy),
? ? ? ? ? ? 'https': 'https://{}'.format(proxy)
? ? ? ? }
? ? ? ? try:
? ? ? ? ? ? # 發(fā)送HTTP請求
? ? ? ? ? ? response = requests.get(url, proxies=proxies, timeout=5)
? ? ? ? ? ? if response.status_code == 200:
? ? ? ? ? ? ? ? return response
? ? ? ? except:
? ? ? ? ? ? # 如果代理IP失效,從列表中移除該IP
? ? ? ? ? ? PROXY_LIST.remove(proxy)

if __name__ == '__main__':
? ? url = 'http://www.example.com'
? ? response = make_request(url)
? ? print(response.text)

在這個示例代碼中,我們定義了一個全局變量PROXY_LIST,用于保存可用的代理IP列表。首先,我們定義了一個get_random_proxy函數(shù),用于從代理IP列表中隨機選擇一個代理IP,并在需要時動態(tài)更新可用的代理IP列表。

接下來,我們定義了一個make_request函數(shù),用于發(fā)送HTTP請求。該函數(shù)在調(diào)用get_random_proxy函數(shù)獲取代理IP后,使用requests庫發(fā)送HTTP請求,并在請求成功后返回響應結果。如果請求失敗,則說明代理IP失效,需要從可用的代理IP列表中移除該代理IP,并重新選擇一個代理IP進行請求。

最后,在程序的主函數(shù)中,我們定義了一個URL地址,并調(diào)用make_request函數(shù)發(fā)送HTTP請求。如果請求成功,則輸出響應內(nèi)容。

至此,我們已經(jīng)完成了代理IP的動態(tài)切換功能的實現(xiàn)。接下來,我們對上述代碼進行修改,加入一些必要的異常處理邏輯和日志記錄功能。

四、異常處理和日志記錄

在實際的爬蟲應用中,我們經(jīng)常會遇到各種意外情況,例如代理IP失效、網(wǎng)絡連接超時、目標網(wǎng)站返回錯誤響應等。為了保證程序的穩(wěn)定性和可靠性,我們需要對這些情況進行合理的異常處理和日志記錄。

以下是一個加入異常處理和日志記錄的示例代碼:

import requests
from requests.exceptions import ProxyError, Timeout, ConnectionError
from bs4 import BeautifulSoup
import random
import time
import logging

# 全局變量,代理IP列表
PROXY_LIST = []

def init_logging():
? ? # 初始化日志記錄器
? ? logger = logging.getLogger()
? ? logger.setLevel(logging.INFO)
? ? formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
? ? handler = logging.FileHandler('proxy.log')
? ? handler.setFormatter(formatter)
? ? logger.addHandler(handler)
? ? return logger

def get_proxy_list():
? ? # 獲取代理IP列表的URL
? ? url = "http://www.example.com/proxy_list.html"
? ? # 發(fā)送請求獲取頁面內(nèi)容
? ? response = requests.get(url)
? ? soup = BeautifulSoup(response.text, 'html.parser')
? ? # 解析HTML頁面,獲取代理IP列表
? ? proxy_list = []
? ? for tr in soup.find_all('tr'):
? ? ? ? tds = tr.find_all('td')
? ? ? ? if len(tds) == 2:
? ? ? ? ? ? ip = tds[0].get_text()
? ? ? ? ? ? port = tds[1].get_text()
? ? ? ? ? ? proxy = '{}:{}'.format(ip, port)
? ? ? ? ? ? proxy_list.append(proxy)
? ? return proxy_list

def test_proxy(proxy):
? ? # 測試代理IP的可用性
? ? try:
? ? ? ? proxies = {
? ? ? ? ? ? 'http': 'http://{}'.format(proxy),
? ? ? ? ? ? 'https': 'https://{}'.format(proxy)
? ? ? ? }
? ? ? ? response = requests.get('http://www.baidu.com', proxies=proxies, timeout=5)
? ? ? ? if response.status_code == 200:
? ? ? ? ? ? return True
? ? except:
? ? ? ? return False

def get_available_proxies(proxy_list):
? ? # 獲取可用的代理IP列表
? ? available_proxies = []
? ? for proxy in proxy_list:
? ? ? ? if test_proxy(proxy):
? ? ? ? ? ? available_proxies.append(proxy)
? ? return available_proxies

def get_random_proxy():
? ? # 獲取隨機的代理IP
? ? global PROXY_LIST
? ? if not PROXY_LIST:
? ? ? ? # 第一次使用時,先獲取可用的代理IP列表
? ? ? ? proxy_list = get_proxy_list()
? ? ? ? PROXY_LIST = get_available_proxies(proxy_list)
? ? if not PROXY_LIST:
? ? ? ? # 如果沒有可用的代理IP,等待一段時間后重試
? ? ? ? time.sleep(60)
? ? ? ? proxy_list = get_proxy_list()
? ? ? ? PROXY_LIST = get_available_proxies(proxy_list)
? ? return random.choice(PROXY_LIST)

def make_request(url):
? ? # 發(fā)送HTTP請求
? ? while True:
? ? ? ? # 從代理IP列表中隨機選擇一個IP
? ? ? ? proxy = get_random_proxy()
? ? ? ? proxies = {
? ? ? ? ? ? 'http': 'http://{}'.format(proxy),
? ? ? ? ? ? 'https': 'https://{}'.format(proxy)
? ? ? ? }
? ? ? ? try:
? ? ? ? ? ? # 發(fā)送HTTP請求
? ? ? ? ? ? response = requests.get(url, proxies=proxies, timeout=5)
? ? ? ? ? ? if response.status_code == 200:
? ? ? ? ? ? ? ? return response
? ? ? ? except ProxyError as e:
? ? ? ? ? ? # 代理服務器錯誤,從列表中移除該IP
? ? ? ? ? ? PROXY_LIST.remove(proxy)
? ? ? ? ? ? logging.warning('ProxyError: {}'.format(str(e)))
? ? ? ? except Timeout as e:
? ? ? ? ? ? # 超時錯誤,重試
? ? ? ? ? ? logging.warning('Timeout: {}'.format(str(e)))
? ? ? ? except ConnectionError as e:
? ? ? ? ? ? # 連接錯誤,重試
? ? ? ? ? ? logging.warning('ConnectionError: {}'.format(str(e)))
? ? ? ? except Exception as e:
? ? ? ? ? ? # 其他未知錯誤,重試
? ? ? ? ? ? logging.warning('Exception: {}'.format(str(e)))

if __name__ == '__main__':
? ? init_logging()
? ? url = 'http://www.example.com'
? ? response = make_request(url)
? ? print(response.text)

在這個示例代碼中,我們首先引入了requests.exceptions模塊和logging模塊。requests.exceptions模塊提供了一些常見的網(wǎng)絡請求異常類型,我們可以通過捕獲這些異常類型來實現(xiàn)異常處理。logging模塊則提供了一個日志記錄器,我們可以使用它來記錄程序運行時的異常和錯誤信息。

接下來,在程序的主函數(shù)中,我們調(diào)用了一個init_logging函數(shù),用于初始化日志記錄器。該函數(shù)設置了日志記錄器的級別、格式和輸出文件,并返回一個記錄器實例。

最后,在make_request函數(shù)中,我們通過try-except語句對網(wǎng)絡請求中可能出現(xiàn)的異常進行了捕獲和處理。例如,如果代理服務器返回了錯誤碼,我們將該代理IP從列表中移除,并記錄警告日志。如果發(fā)生超時錯誤、連接錯誤或其他未知錯誤,我們直接記錄警告日志,并在下一次循環(huán)中重試。

至此,我們已經(jīng)完成了對代理IP的動態(tài)切換功能的實現(xiàn),并加入了必要的異常處理和日志記錄功能。

總結

為了實現(xiàn)在代理IP被封后立即切換到下一個IP,我們可以在爬蟲程序中加入一個代理IP池,定時從可用的代理IP列表中隨機選擇一個IP,并發(fā)送HTTP請求。如果請求失敗,我們可以將失敗的代理IP從列表中移除,并在下一次選擇IP時避開此IP。同時,我們需要加入必要的異常處理和日志記錄功能,以保證程序的穩(wěn)定性和可靠性。這樣,即使某個代理IP被封,我們也能夠及時切換到下一個可用的IP,繼續(xù)執(zhí)行爬蟲任務。文章來源地址http://www.zghlxwxcb.cn/news/detail-739089.html

到了這里,關于python爬蟲,如何在代理的IP被封后立刻換下一個IP繼續(xù)任務?的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 如何選擇適合爬蟲的代理IP

    在互聯(lián)網(wǎng)上,每個設備都需要通過IP地址來標識其位置。 當一個網(wǎng)站被訪問時,它可以記錄下訪問者的IP地址。 如果一個程序試圖通過一個固定的IP地址來訪問一個網(wǎng)站,那么該網(wǎng)站就可以通過IP地址識別出該程序的位置。因此,代理IP地址就是通過一個中轉站來訪問網(wǎng)站,從

    2024年02月15日
    瀏覽(17)
  • python爬蟲-代理ip理解

    python爬蟲-代理ip理解

    目錄 1、為什么使用代理IP 2、代理IP 3、IP池 4、代理分類: 5、python中使用代理IP 6、如何找可以使用的代理IP 7、拿到IP后,測試IP的有效性 8、擴展理解正向代理和反向代理 1、為什么使用代理IP 就是為了防止ip被封禁,提高爬蟲的效率和穩(wěn)定;? 反反爬使用代理ip是非常必要的

    2024年02月02日
    瀏覽(24)
  • 【Python爬蟲筆記】爬蟲代理IP與訪問控制

    【Python爬蟲筆記】爬蟲代理IP與訪問控制

    一、前言 在進行網(wǎng)絡爬蟲的開發(fā)過程中,有許多限制因素阻礙著爬蟲程序的正常運行,其中最主要的一點就是反爬蟲機制。為了防止爬蟲程序在短時間內(nèi)大量地請求同一個網(wǎng)站,網(wǎng)站管理者會使用一些方式進行限制。這時候,代理IP就是解決方案之一。 本文主要介紹如何在爬

    2024年02月09日
    瀏覽(22)
  • R語言rvest爬蟲如何設置ip代理?

    R語言rvest爬蟲如何設置ip代理?

    在R語言中使用rvest進行網(wǎng)絡爬蟲時,可以使用代理服務器來隱藏真實IP地址。有一些R包可以幫助爬蟲中設置代理,其中一個常用的包是 httr 。以下是一個簡單的例子,演示如何在rvest中設置IP代理 一、獲取代理IP并提取 二、詳情設置 library(httr) library(rvest) # 設置代理服務器地址

    2024年01月23日
    瀏覽(22)
  • 【Python爬蟲實戰(zhàn)】爬蟲封你ip就不會了?ip代理池安排上

    【Python爬蟲實戰(zhàn)】爬蟲封你ip就不會了?ip代理池安排上

    前言 在進行網(wǎng)絡爬取時,使用代理是經(jīng)常遇到的問題。由于某些網(wǎng)站的限制,我們可能會被封禁或者頻繁訪問時會遇到訪問速度變慢等問題。因此,我們需要使用代理池來避免這些問題。本文將為大家介紹如何使用IP代理池進行爬蟲,并帶有代碼和案例。 1. 什么是IP代理池

    2024年02月08日
    瀏覽(21)
  • Python爬蟲實戰(zhàn)(二):爬取快代理構建代理IP池

    Python爬蟲實戰(zhàn)(二):爬取快代理構建代理IP池

    博主開始更新爬蟲實戰(zhàn)教程了, 期待你的關注!??! 第一篇:Python爬蟲實戰(zhàn)(一):翻頁爬取數(shù)據(jù)存入SqlServer 第二篇:Python爬蟲實戰(zhàn)(二):爬取快代理構建代理IP池 點贊收藏博主更有創(chuàng)作動力喲,以后常更?。。?使用爬蟲時,大部分網(wǎng)站都有一定的反爬措施,有些網(wǎng)站會

    2024年02月11日
    瀏覽(31)
  • 代理ip的使用方法——Python爬蟲

    代理ip的使用方法——Python爬蟲

    本文內(nèi)容:代理ip使用原理,如何在自己的爬蟲里設置代理ip,如何知道代理ip有沒有生效,沒生效的話是哪里出了問題,個人使用的代理ip(付費)。 目錄 代理ip原理 ? ? ? 輸入網(wǎng)址后發(fā)生了什么呢? ? ? ? 代理ip做了什么呢? ? ? ? 為什么要用代理呢? ?爬蟲代碼中使用代

    2024年02月05日
    瀏覽(22)
  • Python 網(wǎng)頁爬蟲原理及代理 IP 使用

    Python 網(wǎng)頁爬蟲原理及代理 IP 使用

    目錄 前言 一、Python 網(wǎng)頁爬蟲原理 二、Python 網(wǎng)頁爬蟲案例 步驟1:分析網(wǎng)頁 步驟2:提取數(shù)據(jù) 步驟3:存儲數(shù)據(jù) 三、使用代理 IP 四、總結 前言 隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)絡上的信息量變得越來越龐大。對于數(shù)據(jù)分析人員和研究人員來說,獲取這些數(shù)據(jù)是一項重要的任務。Python

    2024年02月09日
    瀏覽(29)
  • Python 爬蟲使用代理 IP 的正確方法

    代理 IP 是爬蟲中非常常用的方法,可以避免因為頻繁請求而被封禁。下面是 Python 爬蟲使用代理 IP 的正確方法: 1. 選擇可靠的代理 IP 供應商,購買或者免費使用代理 IP 列表。 2. 在爬蟲中使用第三方庫 requests ,并在 requests.get() 或 requests.post() 請求時添加代理 IP 參數(shù),例如:

    2024年02月11日
    瀏覽(34)
  • java爬蟲(jsoup)如何設置HTTP代理ip爬數(shù)據(jù)

    java爬蟲(jsoup)如何設置HTTP代理ip爬數(shù)據(jù)

    目錄 前言 什么是HTTP代理IP 使用Jsoup設置HTTP代理IP的步驟 1. 導入Jsoup依賴 2. 創(chuàng)建HttpProxy類 3. 設置代理服務器 4. 使用Jsoup進行爬取 結論 在Java中使用Jsoup進行網(wǎng)絡爬蟲操作時,有時需要使用HTTP代理IP來爬取數(shù)據(jù)。本文將介紹如何使用Jsoup設置HTTP代理IP進行爬取,并提供相關代碼

    2024年01月21日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包