爬蟲關於ip管理池的應用


在爬蟲的時候經常會遇到一個問題就是ip被封,由於ip對網站的短時間大量請求,讓網站將我們的ip暫時封掉。這樣我們就無法全部爬取自己想要的內容。

這里百度了一下解決辦法,很多人都提到了ip代理管理池的問題,其大致思想就是在一些網站上找一些免費的ip代理,然后將他們放入一個列表中,這樣我們就可以用這些免費的ip代理來不斷更換,每當一個ip被封后我們就用代碼調用下一個ip代理,直到我們爬完我們想要的數據。

大致思路如下:(這里我用Python來講)

  1.訪問一個國內免費ip代理的網站(注意要獲取高匿的ip),這里我們以網站有代理(http://www.youdaili.net/)為例,進入后找到http代理點擊進入,然后點擊列表中最新日期的免費代理,就可以看到很多最新的免費ip代理

  2.用Python的BeautifulSoup解析這個頁面,從頁面中獲取所有的ip地址及端口號,組合(ip:port的形式)起來存入一個列表中,

  3.獲得了所有的ip后,接下來我么要驗證這些ip能不能用,因為免費的ip代理大部分都是不能用的,所以我們就要從這些在網頁上爬取的ip進行檢查,去掉那些不能用的,具體方法是(注意一點Python中代理參數的格式是proxy=  {'http':'http://ip:port'}):首先我們將ip配置為Python中代理參數的默認格式,然后我們用urllib.request.ProxyHandler方法將proxy傳入,接着用urllib.request.build.opener和urllib.request.install_opener()一次處理,代理參數就配置好了,然后我們以百度為測試網站,測試看看我們的代理ip能不能,用urllib.request.urlopen()如果能返回則證明可用反之不能用。能用的話我們就添加到一個新的列表中加一保存

  注:出入講解的緣故,一下代碼只爬取的免費代理網站上面的首頁所有ip和port,至於翻頁什么的大家應該可以自己搞定

代碼如下:

 

import urllib.request
from bs4 import BeautifulSoup
#訪問免費ip代理網址:http://www.youdaili.net/Daili/http/29381.html,處理得到所有的ip
def htmlParser(url):
    iplist=[]
    #設置頭部
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
    headers = {"User-Agent": user_agent}
    req = urllib.request.Request(url, headers=headers)
    #獲取頁面html
    html=urllib.request.urlopen(req).read()
    soup=BeautifulSoup(html,'html.parser')
    datas=soup.find("div",{"class":"content"}).findAll("p")
    for data in datas:
        ip=data.get_text().split("@")[0]
        iplist.apend(ip)
    return iplist


#檢測ip是否可用
def confirm_ip(ip):
    #配置proxy
    proxy={'http':'http://%s'%ip}
    proxy_handler=urllib.request.ProxyHandler(proxy)
    proxy=urllib.request.bulid_handler(proxy_handler)
    urllib.request.install_handler(proxy)

    #用百度首頁檢測代理ip
    test_url="http://www.baidu.com"
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'
    headers = {"User-Agent": user_agent}
    req = urllib.request.Request(test_url, headers=headers)

    try:
        response=urllib.request.urlopen(req)
        content=response.read()
        #獲取到內容
        if content:
            print("its a right ip")
            return ip
        #沒有獲取到
        else:
            return None
    #訪問錯誤
    except urllib.request.URLError as e:
        print(e.reason)
        return None

trueIp=[]
url="http://www.youdaili.net/Daili/http/29381.html"
iplist=htmlParse(url)
for ip in iplist;
    if confirm_ip(ip)!=None:
       trueIp.append(ip)

print(trueIp)

好了內容就是這么都,有不妥的地方歡迎大家交流.(吐槽一下:博客園編輯器好垃圾,第一次徒手在自帶的編輯器上寫,寫完了看到下面一個換色,一點所有代碼不見了!產品經理把這個功能改一下吧!加個提醒也行啊!!)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM