Python網(wǎng)絡(luò)爬蟲--Scrapy使用IP代理池

自動更新IP池

寫個自動獲取IP的類proxies.py,執(zhí)行一下把獲取的IP保存到txt文件中去:

代碼

# *-* coding:utf-8 *-*  
import requests  
from bs4 import BeautifulSoup  
import lxml  
from multiprocessing import Process, Queue  
import random  
import json  
import time  
import requests  
  
class Proxies(object):  
  
  
    """docstring for Proxies"""  
    def __init__(self, page=3):  
        self.proxies = []  
        self.verify_pro = []  
        self.page = page  
        self.headers = {  
        'Accept': '*/*',  
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',  
        'Accept-Encoding': 'gzip, deflate, sdch',  
        'Accept-Language': 'zh-CN,zh;q=0.8'  
        }  
        self.get_proxies()  
        self.get_proxies_nn()  
  
    def get_proxies(self):  
        page = random.randint(1,10)  
        page_stop = page + self.page  
        while page < page_stop:  
            url = 'http://www.xicidaili.com/nt/%d' % page  
            html = requests.get(url, headers=self.headers).content  
            soup = BeautifulSoup(html, 'lxml')  
            ip_list = soup.find(id='ip_list')  
            for odd in ip_list.find_all(class_='odd'):  
                protocol = odd.find_all('td')[5].get_text().lower()+'://'  
                self.proxies.append(protocol + ':'.join([x.get_text() for x in odd.find_all('td')[1:3]]))  
            page += 1  
  
    def get_proxies_nn(self):  
        page = random.randint(1,10)  
        page_stop = page + self.page  
        while page < page_stop:  
            url = 'http://www.xicidaili.com/nn/%d' % page  
            html = requests.get(url, headers=self.headers).content  
            soup = BeautifulSoup(html, 'lxml')  
            ip_list = soup.find(id='ip_list')  
            for odd in ip_list.find_all(class_='odd'):  
                protocol = odd.find_all('td')[5].get_text().lower() + '://'  
                self.proxies.append(protocol + ':'.join([x.get_text() for x in odd.find_all('td')[1:3]]))  
            page += 1  
  
    def verify_proxies(self):  
        # 沒驗證的代理  
        old_queue = Queue()  
        # 驗證后的代理  
        new_queue = Queue()  
        print ('verify proxy........')  
        works = []  
        for _ in range(15):  
            works.append(Process(target=self.verify_one_proxy, args=(old_queue,new_queue)))  
        for work in works:  
            work.start()  
        for proxy in self.proxies:  
            old_queue.put(proxy)  
        for work in works:  
            old_queue.put(0)  
        for work in works:  
            work.join()  
        self.proxies = []  
        while 1:  
            try:  
                self.proxies.append(new_queue.get(timeout=1))  
            except:  
                break  
        print ('verify_proxies done!')  
  
  
    def verify_one_proxy(self, old_queue, new_queue):  
        while 1:  
            proxy = old_queue.get()  
            if proxy == 0:break  
            protocol = 'https' if 'https' in proxy else 'http'  
            proxies = {protocol: proxy}  
            try:  
                if requests.get('http://www.baidu.com', proxies=proxies, timeout=2).status_code == 200:  
                    print ('success %s' % proxy)  
                    new_queue.put(proxy)  
            except:  
                print ('fail %s' % proxy)  
  
  
if __name__ == '__main__':  
    a = Proxies()  
    a.verify_proxies()  
    print (a.proxies)  
    proxie = a.proxies   
    with open('proxies.txt', 'a') as f:  
       for proxy in proxie:  
             f.write(proxy+'\n')  

執(zhí)行一下:

python  proxies.py

這些有效的IP就會保存到proxies.txt文件中去

image.png

修改中間件middlewares.py的內(nèi)容為如下:

import random  
import scrapy  
from scrapy import log  
  
  
# logger = logging.getLogger()  
  
class ProxyMiddleWare(object):  
    """docstring for ProxyMiddleWare"""  
    def process_request(self,request, spider):  
        '''對request對象加上proxy'''  
        proxy = self.get_random_proxy()  
        print("this is request ip:"+proxy)  
        request.meta['proxy'] = proxy   
  
  
    def process_response(self, request, response, spider):  
        '''對返回的response處理'''  
        # 如果返回的response狀態(tài)不是200,重新生成當前request對象  
        if response.status != 200:  
            proxy = self.get_random_proxy()  
            print("this is response ip:"+proxy)  
            # 對當前reque加上代理  
            request.meta['proxy'] = proxy   
            return request  
        return response  
  
    def get_random_proxy(self):  
        '''隨機從文件中讀取proxy'''  
        while 1:  
            with open('你保存的\proxies.txt', 'r') as f:  
                proxies = f.readlines()  
            if proxies:  
                break  
            else:  
                time.sleep(1)  
        proxy = random.choice(proxies).strip()  
        return proxy  

修改下settings文件

DOWNLOADER_MIDDLEWARES = {  

     'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware':None,  
     'myproxies.middlewares.ProxyMiddleWare':125,  
     'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware':None  
}  

這里的myproxies是工程的名字,middlewares是py文件的名,ProxyMiddleWare是類的名字

或者利用crawlera神器(收費)--------自行百度

土豪自然隨意唆缴,直接淘寶買一些代理IP就好跛璧,穩(wěn)定也不是特別貴

Github 搜索 proxy ip會發(fā)現(xiàn)更多

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市燕偶,隨后出現(xiàn)的幾起案子侵浸,更是在濱河造成了極大的恐慌旺韭,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掏觉,死亡現(xiàn)場離奇詭異区端,居然都是意外死亡,警方通過查閱死者的電腦和手機澳腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門织盼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酱塔,你說我怎么就攤上這事沥邻。” “怎么了羊娃?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵唐全,是天一觀的道長。 經(jīng)常有香客問我蕊玷,道長邮利,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任垃帅,我火速辦了婚禮延届,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘贸诚。我一直安慰自己方庭,他們只是感情好,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布酱固。 她就那樣靜靜地躺著二鳄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媒怯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天髓窜,我揣著相機與錄音扇苞,去河邊找鬼欺殿。 笑死,一個胖子當著我的面吹牛鳖敷,可吹牛的內(nèi)容都是我干的脖苏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼定踱,長吁一口氣:“原來是場噩夢啊……” “哼棍潘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起崖媚,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤亦歉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后畅哑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肴楷,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年荠呐,在試婚紗的時候發(fā)現(xiàn)自己被綠了赛蔫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泥张,死狀恐怖呵恢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情媚创,我是刑警寧澤渗钉,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站筝野,受9級特大地震影響晌姚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜歇竟,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一挥唠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧焕议,春花似錦宝磨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至别瞭,卻和暖如春窿祥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝙寨。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怀各。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像贝奇,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子靠胜,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容