1. 程式人生 > >Python搭建自己的ip代理池學習總結

Python搭建自己的ip代理池學習總結

    剛剛學習了爬蟲入門爬取小說,覺得那是不夠的,很多時候你僅僅偽裝成瀏覽器是解決不了問題的,還需要解決別人封你的ip的問題,所以我又學習瞭如何爬蟲是更換自己的ip,想要有足夠的ip來供你更換,一定得先搭建你的ip代理池,那麼我們就先搭建自己的ip代理池。

   什麼是ip代理池,就是很多代理ip地址放到一起足夠讓你去更換,那麼我們從哪裡去獲取足夠多的ip呢,當然很多前人已經幫我們解決問題了我目前只是入門了,所以我用的是https://www.xicidaili.com/nn/1這個網站,我們先想爬小說一樣爬取這個網站上的代理ip,由於我還不會使用資料庫我們就先把這個代理ip以字典的形式存放在文字檔案裡面,看起來很容易,不過本蒟蒻弄了好久,遇到了很多問題:

  1. 爬取西刺網上的ip時每一個頁的每個ip有很多資訊包括,ip地址,埠,地址,速度等資訊,如果你想爬取小說那樣用正則表示式是有問題的,資訊太多啦,一個要用''' '''才能包含下,而且一個不小心就會,啥頁提取不出來,後面才知道用的xpath提取的,需要bs4,lxml庫,不過在宣告的時候它又說我這個沒有這個包,需要安裝,要需要匯入,這些操作都是網上有的我就不細說了。反正搞啦好久才解決問題。
  2. 學習的時候很多人都告訴你,很多ip是不能用的,需要自己手動檢測,然後就需要寫一個檢測ip是否有效果的問題了。
  3. 爬取ip地址的時候還遇到了,html是亂碼的問題,要他用ecodeing='gbk',雖然西刺網沒有這個情況.

參考:怎樣簡單的搭建一個免費的IP代理池python中requests爬去網頁內容出現亂碼的解決方案

程式碼:

import requests
from lxml import etree
import re
import time
import random
import telnetlib
def check(ip,port):
    try:
        telnetlib.Telnet(ip, port, timeout=20)
    except:
        return False
    else:
        return True
send_headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
        "Connection": "keep-alive",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "Accept-Language": "zh-CN,zh;q=0.8"
    }  # 偽裝成瀏覽器
def get_agent():
    agents = [
              'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36',
              'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;',
              'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv,2.0.1) Gecko/20100101 Firefox/4.0.1',
              'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11',
              'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
              'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)'
              'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:58.0) Gecko/20100101 Firefox/58.0'
              ]#獲取agent   在多個模擬的瀏覽器中隨機選取一個
    fakeheader = {}
    fakeheader['User-agent'] = agents[random.randint(0, len(agents)-1)]
    return fakeheader
def get_iplist(url,max_page):
    ip_list={}
    for i in range(1,max_page+1):#爬取很多頁的代理ip
        response=requests.get(url+str(i),headers=get_agent())
        response.encoding='utf-8'
        html=response.text
        response.close()
        info = etree.HTML(html)
        address = info.xpath('//tr[@class="odd" or class=""]/td[2]/text()')  # IP地址
        ports = info.xpath('//tr[@class="odd" or class=""]/td[3]/text()')  # 埠
        anonymous = info.xpath('//tr[@class="odd" or class=""]/td[5]/text()')  # 匿名形式
        http_https = info.xpath('//tr[@class="odd" or class=""]/td[6]/text()')  # http or https
        speed = info.xpath('//tr[@class="odd" or class=""]/td[7]/div[1]/@title')  # 連線速度
        speed_width = info.xpath('//tr[@class="odd" or class=""]/td[7]/div[1]/div/@style')  # 連線速度的比例
        conn_time = info.xpath('//tr[@class="odd" or class=""]/td[8]/div[1]/@title')  # 連線時間
        conn_time_width = info.xpath('//tr[@class="odd" or class=""]/td[8]/div[1]/div/@style')  # 連線時間的比例
        life = info.xpath('//tr[@class="odd" or class=""]/td[9]/text()')  # 存活時間
        test = info.xpath('//tr[@class="odd" or class=""]/td[10]/text()')  # 檢驗時間
    cnt=int(0)
    for i in range(0,len(address)-1):
        if check(address[i],ports[i]):
            ip_list[str(cnt+1)]={
                'IP地址': address[i]+':'+ports[i],
                '是否匿名': anonymous[i],
                '型別': http_https[i],
                '速度': eval((re.compile('(.*?)秒').findall(speed[i]))[0]),
                '速度比例': eval((re.compile('width:(.*?)%').findall(speed_width[i]))[0]),
                '連線時間': eval((re.compile('(.*?)秒').findall(conn_time[i]))[0]),
                '耗時比例': eval((re.compile('width:(.*?)%').findall(conn_time_width[i]))[0]),
                '存活時間': eval((re.compile('(\d+).*?').findall(life[i]))[0]),
                '驗證時間': test[i]
            }
            try :
               #with open('porxy_ip.csv', 'w', encoding='utf-8') as fp:
                fp.write(str(ip_list[str(cnt+1)]))
                fp.write('\n')
                print('成功寫入ip及埠:%s'%(address[i]+':'+ports[i]))
                cnt=cnt+1
            except:
                print("寫入錯誤!")
            #exit()
        else :
            pass
    return ip_list
ip_url='https://www.xicidaili.com/nn/'
fp=open('porxy_ip.csv', 'w', encoding='utf-8')
max_page=1
ip=get_iplist(ip_url,max_page)
print('成功寫入%s個可用ip地址'%str(len(ip)))