爬蟲(二)建立代理ip池


之前我們說網站反爬蟲的一個常用方法是檢測ip,限制訪問頻率。所以我們要通過設置代理ip的辦法繞過這個限制。有不少提供免費代理ip的網站,像https://www.xicidaili.com/nt/,我們可以從網站上拿到很多代理ip。但是這些ip並不是每個都能用的,或者說,沒幾個能用的。

 

我們可以用beautifulsoup分析網頁,然后處理,提取代理ip列表,也可以用正則表達式進行匹配。用正則表達式會快一些。ip_url就是https://www.xicidaili.com/nt/,random_hearder就是一個隨機獲得請求頭的函數。

def download_page(url):
    headers = random_header()
    data = requests.get(url, headers=headers)
    return data


def get_proxies(page_num, ip_url):
    available_ip = []
    for page in range(1,page_num):
        print("抓取第%d頁代理IP" %page)
        url = ip_url + str(page)
        r = download_page(url)
        r.encoding = 'utf-8'
        pattern = re.compile('<td class="country">.*?alt="Cn" />.*?</td>.*?<td>(.*?)</td>.*?<td>(.*?)</td>', re.S)
        ip_list = re.findall(pattern, r.text)
        for ip in ip_list:
            if test_ip(ip):
                print('%s:%s通過測試,添加進可用代理列表' %(ip[0],ip[1]))
                available_ip.append(ip)
        time.sleep(10)print('抓取結束')
    return available_ip

拿到ip后我們還需要對ip進行檢測,確定這個ip可以用。怎么檢測呢?我們可以用代理ip訪問一個能顯示訪問ip的網站,然后檢查請求結果。

def test_ip(ip,test_url='http://ip.tool.chinaz.com/'):
    proxies={'http': ip[0]+':'+ip[1]}
    try_ip=ip[0]
    try:
        r=requests.get(test_url, headers=random_header(), proxies=proxies)
        if r.status_code==200:
            r.encoding='gbk'
            result=re.search('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}',r.text)
            result=result.group()
            print(result)
            if result[:9]==try_ip[:9]:print('%S:%s測試通過' % (ip[0],ip[1]))
                return True
            else:
                print('%s:%s 攜帶代理失敗,使用了本地IP' %(ip[0],ip[1]))
                return False
        else:
            print('%s:%s 請求碼不是200' %(ip[0],ip[1]))
            return False
    except Exception as e:
        print(e)
        print('%s:%s 錯誤' %(ip[0],ip[1]))
        return False

有些教程只是拿到200的http狀態碼就認為成功了,這是不對的。因為代理ip訪問不成功,就會默認使用你自己的ip。用我自己的ip訪問當然能成功了。

 

最后拿到的ip在使用前我們還需要對其進行檢測,因為你不知道什么時候它就不可用了。所以平時多儲存一些代理ip,免得要用的時候沒得用。

 

這篇文章的代碼參考了https://blog.csdn.net/XRRRICK/article/details/78650764,我稍微做了一些修改。


免責聲明!

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



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