Python搭建自己IP代理池的方法實(shí)現(xiàn)
IP代理是什么:
ip就是訪(fǎng)問(wèn)網(wǎng)頁(yè)數(shù)據(jù)服務(wù)器位置信息,每一個(gè)主機(jī)或者網(wǎng)絡(luò)都有一個(gè)自己IP信息
為什么要使用代理ip:
因?yàn)樵谙蚧ヂ?lián)網(wǎng)發(fā)送請(qǐng)求中,網(wǎng)頁(yè)端會(huì)識(shí)別客戶(hù)端是真實(shí)用戶(hù)還是爬蟲(chóng)程序,在今天以互聯(lián)網(wǎng)為主導(dǎo)的世界中,數(shù)據(jù)一種資源,誰(shuí)能得到更多有效的數(shù)據(jù),誰(shuí)就能在今天互聯(lián)網(wǎng)世界斗爭(zhēng)中獲得先機(jī),所以網(wǎng)頁(yè)是不愿意把數(shù)據(jù)作為開(kāi)源分享給其他互聯(lián)網(wǎng)運(yùn)營(yíng)公司的,它會(huì)創(chuàng)造出許許多多的反制措施來(lái)避免自己的數(shù)據(jù)被其他競(jìng)爭(zhēng)對(duì)手(或利益相關(guān)的其他服務(wù)商),但又不得不為了創(chuàng)造更高的經(jīng)濟(jì)價(jià)值,來(lái)以非常有限的隧道中讓正常真實(shí)用戶(hù)訪(fǎng)問(wèn)它的網(wǎng)頁(yè),所以IP作為訪(fǎng)問(wèn)者的唯一標(biāo)識(shí),自然而然成為互聯(lián)網(wǎng)公司鑒別真實(shí)非爬蟲(chóng)用戶(hù)的一種手段。
如果你設(shè)置的程序訪(fǎng)問(wèn)時(shí)間過(guò)快(行為異常)超過(guò)了正常人訪(fǎng)問(wèn)的時(shí)間(行為),被訪(fǎng)問(wèn)的網(wǎng)頁(yè)就會(huì)判定你是一個(gè)爬蟲(chóng)程序,對(duì)你的IP進(jìn)行封禁(一般為5-15分鐘,不會(huì)超過(guò)12小時(shí))。
所以作為爬蟲(chóng)工作者為了獲取互聯(lián)網(wǎng)中的數(shù)據(jù),通過(guò)以更換ip的方式來(lái)再一次訪(fǎng)問(wèn)該網(wǎng)頁(yè)。
因此由于市場(chǎng)需求,網(wǎng)絡(luò)上出現(xiàn)許多以”為爬蟲(chóng)工作者提供ip地址“的互聯(lián)網(wǎng)公司。
這類(lèi)互聯(lián)網(wǎng)公司為爬蟲(chóng)職業(yè)學(xué)習(xí)者,提供了一些免費(fèi)IP信息以供學(xué)習(xí),在真實(shí)項(xiàng)目獲取免費(fèi)IP信息的方式是不被建議的,作者期望你能通過(guò)付費(fèi)的方式來(lái)獲取更多高質(zhì)量的IP資源。
作者作為python爬蟲(chóng)初學(xué)者賴(lài)給大家講述一下,如何搭建自己IP代理池,IP代理池聽(tīng)名聞義,其實(shí)就是裝載了許許多多的高質(zhì)量IP資源,以供學(xué)習(xí)者和工作人員及時(shí)的更換IP避免對(duì)項(xiàng)目產(chǎn)生不可挽回的損失。
作為爬蟲(chóng)學(xué)習(xí)者,我們應(yīng)該較其他行業(yè)人員應(yīng)具有爬蟲(chóng)技術(shù),通過(guò)爬蟲(chóng)來(lái)獲取更多IP數(shù)據(jù)。
對(duì)IP代理提供商發(fā)起訪(fǎng)問(wèn)請(qǐng)求:(本次IP資源的提供商為:”云代理“)
import time
import requests
import parsel
#新建一個(gè)列表用來(lái)存儲(chǔ)完整ip數(shù)據(jù)
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) #服務(wù)器獲取數(shù)據(jù)
#瀏覽器的身份標(biāo)識(shí)
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)
#指定一個(gè)編碼 = 獲取一個(gè)編碼
response.encoding = response.apparent_encoding
html_data = response.text將web服務(wù)器返回頁(yè)面數(shù)據(jù)進(jìn)行解析:本次采用xpath解析
#3.數(shù)據(jù)解析 使用xpath 方法,xpath專(zhuān)門(mén)用于解析html頁(yè)面
selector = parsel.Selector(html_data) #轉(zhuǎn)換數(shù)據(jù)類(lèi)型
# print(selector)
trs = selector.xpath('//table/tbody/tr')
# print(trs)
#將拼接好的完整地址保存在一個(gè)名為proxies_list的列表中
#遍歷每一個(gè)tr標(biāo)簽
for tr in trs:
ip = tr.xpath('./td[1]/text()').get()
adr = tr.xpath('./td[2]/text()').get()
# print(ip,adr)
將獲取的數(shù)據(jù)拼接起來(lái):因?yàn)橥暾鹖p地址需要加上 http:// 或者 https://
proxies_dict = {
#字符串的拼接
"http":"http://"+ip+":"+adr,
"https":"https://"+ip+":"+adr,
}
將獲取的完整的IP信息存儲(chǔ)起來(lái)
proxies_list.append(proxies_dict)
第二大部分:將獲取到IP數(shù)據(jù)檢測(cè)一下是否可用,避免在爬蟲(chóng)項(xiàng)目中項(xiàng)目浪費(fèi)太多的時(shí)間,來(lái)檢測(cè)ip的可用性。
免費(fèi)IP幾乎百分之九十不可用,所以作為爬蟲(chóng)工作者建議你購(gòu)買(mǎi)付費(fèi)數(shù)據(jù)
定義一個(gè)函數(shù)用來(lái)檢測(cè)數(shù)據(jù)是否可用:
def check_ip(proxies_list):
""" 代理檢測(cè)"""
#將高質(zhì)量可用代理存儲(chǔ)起來(lái)
can_user= []
for proxie in proxies_list:
#發(fā)送一個(gè)請(qǐng)求以便得到該代理的狀態(tài)碼
try:
response = proxie.get(url='https://www.baidu.com',proxies=proxie,timeout=2)
if response.status_code == 200: #如果該IP訪(fǎng)問(wèn)百度后,返回的狀態(tài)碼為200時(shí),說(shuō)明該地阿里可以使用
#將該代理保存起來(lái)
can_user.append(proxie)
except:
print('當(dāng)前代理:',proxie,'請(qǐng)求時(shí)間過(guò)長(zhǎng)不可用')
#如果代理可用則執(zhí)行else中的語(yǔ)句
else:
print('當(dāng)前代理:', proxie, '可以使用')
return can_user這里我要說(shuō)的重點(diǎn)是:
response.status_code == 200
通過(guò)向特定的網(wǎng)頁(yè)發(fā)起get請(qǐng)求,以返回狀態(tài)碼來(lái)檢測(cè)該IP數(shù)據(jù)是否正??捎?,如果在有限的時(shí)間中它返回的狀態(tài)碼為200說(shuō)明該IP數(shù)據(jù)是正??捎玫?。
通過(guò)方法的調(diào)用來(lái)讓該檢測(cè)代碼段運(yùn)行起來(lái):
can_user = check_ip(proxies_list)
print('可以使用的代理:',can_user)
print('可以使用的代理數(shù)量為:',len(can_user))
這里我要說(shuō)的是:通過(guò)check_ip()方法調(diào)用并且向該方法傳遞一個(gè)參數(shù)”proxies_list“,該參數(shù)是我們定義的用來(lái)存儲(chǔ)在ip提供商那里爬取全部IP數(shù)據(jù),通過(guò)調(diào)用該方法,并且將未進(jìn)行識(shí)別的ip數(shù)據(jù)傳入。讓檢測(cè)程序代碼段運(yùn)行起來(lái),獲取可供使用IP數(shù)據(jù)
文章的最后,我要說(shuō)的是,希望大家能感激每一位資源的提供者,只有消費(fèi)才會(huì)產(chǎn)生價(jià)值,帶動(dòng)市場(chǎng),我們應(yīng)該尊重勞動(dòng)者的辛苦勞作。
完整代碼段:
#建立步驟:
'''
爬取提供免費(fèi)代理的網(wǎng)站數(shù)據(jù)(ip地址 端口號(hào),地址信息)
1.尋找數(shù)據(jù)地址
2.發(fā)送請(qǐng)求
3.需要的數(shù)據(jù)(頁(yè)面解析保存下來(lái)),或者不需要的數(shù)據(jù)(剔除)
4.需要的數(shù)據(jù)保存(IP地址,端口,拼接https://)
'''
import time
import requests
# 安裝parsel時(shí)報(bào)錯(cuò),經(jīng)過(guò)排查應(yīng)該是鏡像源的問(wèn)題(網(wǎng)絡(luò)上說(shuō)是盡量使用國(guó)內(nèi)鏡像源,國(guó)外網(wǎng)速不行,我使用的就是阿里云的鏡像)應(yīng)該是阿里云的鏡像不行,我換了一個(gè)豆瓣的鏡像源
#具體使用辦法在安裝包的后面添加上,通過(guò)那個(gè)鏡像源:pip install parsel -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 把”庫(kù)包名“換成你要安裝的包的名稱(chēng)即可;
import parsel
#使用代理:
#定義一個(gè)函數(shù):
def check_ip(proxies_list):
""" 代理檢測(cè)"""
#將高質(zhì)量可用代理存儲(chǔ)起來(lái)
can_user= []
for proxie in proxies_list:
#發(fā)送一個(gè)請(qǐng)求以便得到該代理的狀態(tài)碼
try:
response = proxie.get(url='https://www.baidu.com',proxies=proxie,timeout=2)
if response.status_code == 200: #如果該IP訪(fǎng)問(wèn)百度后,返回的狀態(tài)碼為200時(shí),說(shuō)明該地阿里可以使用
#將該代理保存起來(lái)
can_user.append(proxie)
except:
print('當(dāng)前代理:',proxie,'請(qǐng)求時(shí)間過(guò)長(zhǎng)不可用')
#如果代理可用則執(zhí)行else中的語(yǔ)句
else:
print('當(dāng)前代理:', proxie, '可以使用')
return can_user
#1.尋找數(shù)據(jù)的地址
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) #服務(wù)器獲取數(shù)據(jù)
#瀏覽器的身份標(biāo)識(shí)
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)
#指定一個(gè)編碼 = 獲取一個(gè)編碼
response.encoding = response.apparent_encoding
html_data = response.text
#3.數(shù)據(jù)解析 使用xpath 方法,xpath專(zhuān)門(mén)用于解析html頁(yè)面
selector = parsel.Selector(html_data) #轉(zhuǎn)換數(shù)據(jù)類(lèi)型
# print(selector)
trs = selector.xpath('//table/tbody/tr')
# print(trs)
#將拼接好的完整地址保存在一個(gè)名為proxies_list的列表中
#遍歷每一個(gè)tr標(biāo)簽
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是為了檢測(cè)第一頁(yè)數(shù)據(jù)返回是否正常,其實(shí)我獲取的所有免費(fèi)代理
print(proxies_list)
print('獲取的代理數(shù)據(jù)為:',len(proxies_list))
# proxies_list.append(proxies_dict)
print('==========================正在檢測(cè)代理======================')
can_user = check_ip(proxies_list)
print('可以使用的代理:',can_user)
print('可以使用的代理數(shù)量為:',len(can_user))到此這篇關(guān)于Python搭建自己IP代理池的方法實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python搭建IP代理池內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python socket.error: [Errno 98] Address already in use的原因和解決
這篇文章主要介紹了Python socket.error: [Errno 98] Address already in use的原因和解決方法,在Python的socket編程中可能會(huì)經(jīng)常遇到這個(gè)問(wèn)題,需要的朋友可以參考下2014-08-08
解讀python如何實(shí)現(xiàn)決策樹(shù)算法
在本篇文章里我們給讀者們分享了關(guān)于python如何實(shí)現(xiàn)決策樹(shù)算法的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們參考下。2018-10-10
Python動(dòng)刷新12306火車(chē)票的代碼(附源碼)
這篇文章主要介紹了Python動(dòng)刷新12306火車(chē)票的完整代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2018-01-01
python類(lèi)中super()和__init__()的區(qū)別
這篇文章主要介紹了python類(lèi)中super()和__init__()的區(qū)別,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
如何解決Pycharm運(yùn)行報(bào)錯(cuò)No Python interpreter selected
這篇文章主要介紹了如何解決Pycharm運(yùn)行時(shí)No Python interpreter selected問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
pycharm中import呈現(xiàn)灰色原因的解決方法
這篇文章主要介紹了pycharm中import呈現(xiàn)灰色原因的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
python基礎(chǔ)教程之分支、循環(huán)簡(jiǎn)單用法
這篇文章主要介紹了python基礎(chǔ)教程之分支、循環(huán)簡(jiǎn)單用法,結(jié)合實(shí)例形式分析了Python分支及循環(huán)語(yǔ)句的簡(jiǎn)單使用方法,需要的朋友可以參考下2016-06-06
Python使用requests庫(kù)發(fā)送請(qǐng)求的示例代碼
與原生的urllib庫(kù)相比,requests庫(kù)提供了更簡(jiǎn)潔、易于理解和使用的API,使發(fā)送HTTP請(qǐng)求變得更加直觀和高效,所以本文給大家介紹了Python如何使用requests庫(kù)發(fā)送請(qǐng)求,需要的朋友可以參考下2024-03-03

