python爬蟲(chóng)構(gòu)建代理ip池抓取數(shù)據(jù)庫(kù)的示例代碼
爬蟲(chóng)的小伙伴,肯定經(jīng)常遇到ip被封的情況,而現(xiàn)在網(wǎng)絡(luò)上的代理ip免費(fèi)的已經(jīng)很難找了,那么現(xiàn)在就用python的requests庫(kù)從爬取代理ip,創(chuàng)建一個(gè)ip代理池,以備使用。
本代碼包括ip的爬取,檢測(cè)是否可用,可用保存,通過(guò)函數(shù)get_proxies可以獲得ip,如:{'HTTPS': '106.12.7.54:8118'}
下面放上源代碼,并詳細(xì)注釋:
import requests from lxml import etree from requests.packages import urllib3 import random, time urllib3.disable_warnings() def spider(pages, max_change_porxies_times=300): """ 抓取 XiciDaili.com 的 http類型-代理ip-和端口號(hào) 將所有抓取的ip存入 raw_ips.csv 待處理, 可用 check_proxies() 檢查爬取到的代理ip是否可用 ----- :param pages:要抓取多少頁(yè) :return:無(wú)返回 """ s = requests.session() s.trust_env = False s.verify = False urls =com/nn/{}' proxies = {} try_times = 0 for i in range(pages): url = urls.format(i + 1) s.headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', 'Accept-Encoding': 'gzip, deflate, br', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Referer': urls.format(i if i > 0 else ''), 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36'} while True: content = s.get(url, headers=s.headers, proxies=proxies) time.sleep(random.uniform(1.5, 4)) # 每讀取一次頁(yè)面暫停一會(huì),否則會(huì)被封 if content.status_code == 503: # 如果503則ip被封,就更換ip proxies = get_proxies() try_times += 1 print(f'第{str(try_times):0>3s}次變更,當(dāng)前{proxies}') if try_times > max_change_porxies_times: print('超過(guò)最大嘗試次數(shù),連接失敗!') return -1 continue else: break # 如果返回碼是200 ,就跳出while循環(huán),對(duì)爬取的頁(yè)面進(jìn)行處理 print(f'正在抓取第{i+1}頁(yè)數(shù)據(jù),共{pages}頁(yè)') for j in range(2, 102): # 用簡(jiǎn)單的xpath提取http,host和port tree = etree.HTML(content.text) http = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[6]/text()')[0] host = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[2]/text()')[0] port = tree.xpath(f'//table[@id="ip_list"]/tr[{j}]/td[3]/text()')[0] check_proxies(http, host, port) # 檢查提取的代理ip是否可用 def check_proxies(http, host, port, test_url='http://www.baidu.com'): """ 檢測(cè)給定的ip信息是否可用 根據(jù)http,host,port組成proxies,對(duì)test_url進(jìn)行連接測(cè)試,如果通過(guò),則保存在 ips_pool.csv 中 :param http: 傳輸協(xié)議類型 :param host: 主機(jī) :param port: 端口號(hào) :param test_url: 測(cè)試ip :return: None """ proxies = {http: host + ':' + port} try: res = requests.get(test_url, proxies=proxies, timeout=2) if res.status_code == 200: print(f'{proxies}檢測(cè)通過(guò)') with open('ips_pool.csv', 'a+') as f: f.write(','.join([http, host, port]) + '\n') except Exception as e: # 檢測(cè)不通過(guò),就不保存,別讓報(bào)錯(cuò)打斷程序 print(e) def check_local_ip(fn, test_url): """ 檢查存放在本地ip池的代理ip是否可用 通過(guò)讀取fn內(nèi)容,加載每一條ip對(duì)test_url進(jìn)行連接測(cè)試,鏈接成功則儲(chǔ)存在 ips_pool.csv 文件中 :param fn: filename,儲(chǔ)存代理ip的文件名 :param test_url: 要進(jìn)行測(cè)試的ip :return: None """ with open(fn, 'r') as f: datas = f.readlines() ip_pools = [] for data in datas: # time.sleep(1) ip_msg = data.strip().split(',') http = ip_msg[0] host = ip_msg[1] port = ip_msg[2] proxies = {http: host + ':' + port} try: res = requests.get(test_url, proxies=proxies, timeout=2) if res.status_code == 200: ip_pools.append(data) print(f'{proxies}檢測(cè)通過(guò)') with open('ips_pool.csv', 'a+') as f: f.write(','.join([http, host, port]) + '\n') except Exception as e: print(e) continue def get_proxies(ip_pool_name='ips_pool.csv'): """ 從ip池獲得一個(gè)隨機(jī)的代理ip :param ip_pool_name: str,存放ip池的文件名, :return: 返回一個(gè)proxies字典,形如:{'HTTPS': '106.12.7.54:8118'} """ with open(ip_pool_name, 'r') as f: datas = f.readlines() ran_num = random.choice(datas) ip = ran_num.strip().split(',') proxies = {ip[0]: ip[1] + ':' + ip[2]} return proxies if __name__ == '__main__': t1 = time.time() spider(pages=3400) t2 = time.time() print('抓取完畢,時(shí)間:', t2 - t1) # check_local_ip('raw_ips.csv','http://www.baidu.com')
以上就是python爬蟲(chóng)構(gòu)建代理ip池抓取數(shù)據(jù)庫(kù)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于python爬蟲(chóng)構(gòu)建代理ip池的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python實(shí)現(xiàn)從url中提取域名的幾種方法
這篇文章主要介紹了Python實(shí)現(xiàn)從url中提取域名的幾種方法,本文給出了3種方法實(shí)現(xiàn)在URL中提取域名的需求,需要的朋友可以參考下2014-09-09python中cv2.projectPoints的用法小結(jié)
這篇文章主要介紹了python中cv2.projectPoints的用法,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12Python基于checksum計(jì)算文件是否相同的方法
這篇文章主要介紹了Python基于checksum計(jì)算文件是否相同的方法,涉及Python針對(duì)二進(jìn)制文件的讀取與判定技巧,需要的朋友可以參考下2015-07-07python自動(dòng)化測(cè)試之破解圖文驗(yàn)證碼
這篇文章介紹了python自動(dòng)化測(cè)試之破解圖文驗(yàn)證碼的解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07深入理解python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法
這篇文章主要介紹了python?生成器、迭代器、動(dòng)態(tài)新增屬性及方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04Python線程池thread?pool創(chuàng)建使用及實(shí)例代碼分享
這篇文章主要介紹了Python線程池(thread?pool)創(chuàng)建使用及實(shí)例代碼分享,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-06-06python 爬取吉首大學(xué)網(wǎng)站成績(jī)單
python簡(jiǎn)單爬蟲(chóng),爬取吉首大學(xué)成績(jī)單,學(xué)校的成績(jī)單居然不支持導(dǎo)出,太坑了,算個(gè)績(jī)點(diǎn)居然還要手打,我吐了.花2個(gè)多小時(shí)寫(xiě)了此python程序來(lái)生成可方便求和平均的Excel文件,幫助JSU學(xué)子脫離手算煩惱...2021-06-06Selenium 安裝和簡(jiǎn)單使用的實(shí)現(xiàn)
這篇文章主要介紹了Selenium 安裝和簡(jiǎn)單使用的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12