Python搭建自己IP代理池的方法實現
IP代理是什么:
ip就是訪問網頁數據服務器位置信息,每一個主機或者網絡都有一個自己IP信息
為什么要使用代理ip:
因為在向互聯網發(fā)送請求中,網頁端會識別客戶端是真實用戶還是爬蟲程序,在今天以互聯網為主導的世界中,數據一種資源,誰能得到更多有效的數據,誰就能在今天互聯網世界斗爭中獲得先機,所以網頁是不愿意把數據作為開源分享給其他互聯網運營公司的,它會創(chuàng)造出許許多多的反制措施來避免自己的數據被其他競爭對手(或利益相關的其他服務商),但又不得不為了創(chuàng)造更高的經濟價值,來以非常有限的隧道中讓正常真實用戶訪問它的網頁,所以IP作為訪問者的唯一標識,自然而然成為互聯網公司鑒別真實非爬蟲用戶的一種手段。
如果你設置的程序訪問時間過快(行為異常)超過了正常人訪問的時間(行為),被訪問的網頁就會判定你是一個爬蟲程序,對你的IP進行封禁(一般為5-15分鐘,不會超過12小時)。
所以作為爬蟲工作者為了獲取互聯網中的數據,通過以更換ip的方式來再一次訪問該網頁。
因此由于市場需求,網絡上出現許多以”為爬蟲工作者提供ip地址“的互聯網公司。
這類互聯網公司為爬蟲職業(yè)學習者,提供了一些免費IP信息以供學習,在真實項目獲取免費IP信息的方式是不被建議的,作者期望你能通過付費的方式來獲取更多高質量的IP資源。
作者作為python爬蟲初學者賴給大家講述一下,如何搭建自己IP代理池,IP代理池聽名聞義,其實就是裝載了許許多多的高質量IP資源,以供學習者和工作人員及時的更換IP避免對項目產生不可挽回的損失。
作為爬蟲學習者,我們應該較其他行業(yè)人員應具有爬蟲技術,通過爬蟲來獲取更多IP數據。
對IP代理提供商發(fā)起訪問請求:(本次IP資源的提供商為:”云代理“)
import time
import requests
import parsel
#新建一個列表用來存儲完整ip數據
proxies_list = []
for page in range(1,8):
print(f"===========正在爬取第{page}====================")
time.sleep(1)
url = 'http://www.ip3366.net/free/?stype=1&page={page_turn}'.format(page_turn=page) #服務器獲取數據
#瀏覽器的身份標識
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
#指定一個編碼 = 獲取一個編碼
response.encoding = response.apparent_encoding
html_data = response.text將web服務器返回頁面數據進行解析:本次采用xpath解析
#3.數據解析 使用xpath 方法,xpath專門用于解析html頁面
selector = parsel.Selector(html_data) #轉換數據類型
# print(selector)
trs = selector.xpath('//table/tbody/tr')
# print(trs)
#將拼接好的完整地址保存在一個名為proxies_list的列表中
#遍歷每一個tr標簽
for tr in trs:
ip = tr.xpath('./td[1]/text()').get()
adr = tr.xpath('./td[2]/text()').get()
# print(ip,adr)
將獲取的數據拼接起來:因為完整ip地址需要加上 http:// 或者 https://
proxies_dict = {
#字符串的拼接
"http":"http://"+ip+":"+adr,
"https":"https://"+ip+":"+adr,
}
將獲取的完整的IP信息存儲起來
proxies_list.append(proxies_dict)
第二大部分:將獲取到IP數據檢測一下是否可用,避免在爬蟲項目中項目浪費太多的時間,來檢測ip的可用性。
免費IP幾乎百分之九十不可用,所以作為爬蟲工作者建議你購買付費數據
定義一個函數用來檢測數據是否可用:
def check_ip(proxies_list):
""" 代理檢測"""
#將高質量可用代理存儲起來
can_user= []
for proxie in proxies_list:
#發(fā)送一個請求以便得到該代理的狀態(tài)碼
try:
response = proxie.get(url='https://www.baidu.com',proxies=proxie,timeout=2)
if response.status_code == 200: #如果該IP訪問百度后,返回的狀態(tài)碼為200時,說明該地阿里可以使用
#將該代理保存起來
can_user.append(proxie)
except:
print('當前代理:',proxie,'請求時間過長不可用')
#如果代理可用則執(zhí)行else中的語句
else:
print('當前代理:', proxie, '可以使用')
return can_user這里我要說的重點是:
response.status_code == 200
通過向特定的網頁發(fā)起get請求,以返回狀態(tài)碼來檢測該IP數據是否正常可用,如果在有限的時間中它返回的狀態(tài)碼為200說明該IP數據是正??捎玫?。
通過方法的調用來讓該檢測代碼段運行起來:
can_user = check_ip(proxies_list)
print('可以使用的代理:',can_user)
print('可以使用的代理數量為:',len(can_user))
這里我要說的是:通過check_ip()方法調用并且向該方法傳遞一個參數”proxies_list“,該參數是我們定義的用來存儲在ip提供商那里爬取全部IP數據,通過調用該方法,并且將未進行識別的ip數據傳入。讓檢測程序代碼段運行起來,獲取可供使用IP數據
文章的最后,我要說的是,希望大家能感激每一位資源的提供者,只有消費才會產生價值,帶動市場,我們應該尊重勞動者的辛苦勞作。
完整代碼段:
#建立步驟:
'''
爬取提供免費代理的網站數據(ip地址 端口號,地址信息)
1.尋找數據地址
2.發(fā)送請求
3.需要的數據(頁面解析保存下來),或者不需要的數據(剔除)
4.需要的數據保存(IP地址,端口,拼接https://)
'''
import time
import requests
# 安裝parsel時報錯,經過排查應該是鏡像源的問題(網絡上說是盡量使用國內鏡像源,國外網速不行,我使用的就是阿里云的鏡像)應該是阿里云的鏡像不行,我換了一個豆瓣的鏡像源
#具體使用辦法在安裝包的后面添加上,通過那個鏡像源:pip install parsel -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 把”庫包名“換成你要安裝的包的名稱即可;
import parsel
#使用代理:
#定義一個函數:
def check_ip(proxies_list):
""" 代理檢測"""
#將高質量可用代理存儲起來
can_user= []
for proxie in proxies_list:
#發(fā)送一個請求以便得到該代理的狀態(tài)碼
try:
response = proxie.get(url='https://www.baidu.com',proxies=proxie,timeout=2)
if response.status_code == 200: #如果該IP訪問百度后,返回的狀態(tài)碼為200時,說明該地阿里可以使用
#將該代理保存起來
can_user.append(proxie)
except:
print('當前代理:',proxie,'請求時間過長不可用')
#如果代理可用則執(zhí)行else中的語句
else:
print('當前代理:', proxie, '可以使用')
return can_user
#1.尋找數據的地址
proxies_list = []
for page in range(1,8):
print(f"===========正在爬取第{page}====================")
time.sleep(1)
url = 'http://www.ip3366.net/free/?stype=1&page={page_turn}'.format(page_turn=page) #服務器獲取數據
#瀏覽器的身份標識
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36'
}
response = requests.get(url=url,headers=headers)
#指定一個編碼 = 獲取一個編碼
response.encoding = response.apparent_encoding
html_data = response.text
#3.數據解析 使用xpath 方法,xpath專門用于解析html頁面
selector = parsel.Selector(html_data) #轉換數據類型
# print(selector)
trs = selector.xpath('//table/tbody/tr')
# print(trs)
#將拼接好的完整地址保存在一個名為proxies_list的列表中
#遍歷每一個tr標簽
for tr in trs:
ip = tr.xpath('./td[1]/text()').get()
adr = tr.xpath('./td[2]/text()').get()
# print(ip,adr)
proxies_dict = {
#字符串的拼接
"http":"http://"+ip+":"+adr,
"https":"https://"+ip+":"+adr,
}
proxies_list.append(proxies_dict)
print('獲取成功',proxies_dict)
#break 次break是為了檢測第一頁數據返回是否正常,其實我獲取的所有免費代理
print(proxies_list)
print('獲取的代理數據為:',len(proxies_list))
# proxies_list.append(proxies_dict)
print('==========================正在檢測代理======================')
can_user = check_ip(proxies_list)
print('可以使用的代理:',can_user)
print('可以使用的代理數量為:',len(can_user))到此這篇關于Python搭建自己IP代理池的方法實現的文章就介紹到這了,更多相關Python搭建IP代理池內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Sklearn調優(yōu)之網格搜索與隨機搜索原理詳細分析
這篇文章主要介紹了Sklearn調優(yōu)之網格搜索與隨機搜索原理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-02-02
在Python中使用matplotlib模塊繪制數據圖的示例
這篇文章主要介紹了在Python中使用matplotlib模塊繪制數據圖的示例,matplotlib模塊經常被用來實現數據的可視化,需要的朋友可以參考下2015-05-05

