採集免費ip,製做本身的代理ip池

        咱們在爬取網站的時候常常會遇到忽然訪問不了的問題,緣由之一是由於你的ip進了該站的黑名單,在某一段時間內不能訪問該站的資源。那麼該怎麼解決這個問題?比較有效的方式是使用代理ip,而若是有一個本身的代理ip池,媽媽不再用擔憂我沒有ip可用啦。html

        github傳送門0(xici代理ip池python

西刺網(傳送門1 國內高匿)是一個免費代理ip資源比較多的站,本文就從西刺網獲取ip,製做代理ip池。mysql

        打開(傳送門1 國內高匿)可見到以下頁面git

有倆千多頁代理ip,,固然這是按時間排序的,我估計越到後面的ip可能就沒啥用了.github

分析該頁面的源碼正則表達式

很簡單的發現,全部的代理ip信息都在table下,每個tr都是一條ip的信息。那這就比較簡單了,分分鐘來一個漂亮的正則來將須要的信息匹配出來(這裏我匹配的有ip地址,端口,類型,服務器地址,是否匿名)sql

編寫xc.py數據庫

正則表達式(我的以爲這應該是本程序最精華的部分)的使用以下服務器

pattern=re.compile(u'<tr class=".*?">.*?'
                           +u'<td class="country"><img.*?/></td>.*?'
                           +u'<td>(\d+\.\d+\.\d+\.\d+)</td>.*?'
                           +u'<td>(\d+)</td>.*?'
                           +u'<td>.*?'
                           +u'<a href=".*?">(.*?)</a>.*?'
                           +u'</td>.*?'
                           +u'<td class="country">(.*?)</td>.*?'
                           +u'<td>([A-Z]+)</td>.*?'
                           +'</tr>'
                           ,re.S)
        l=re.findall(pattern,text)

\d匹配數字,\d+匹配多個數字 (\d+) 這裏匹配端口號ide

[A-Z]匹配大寫字母,[A-Z]+匹配多個大寫字母 這裏匹配的是類型

.匹配單個任意字符,*匹配前面字符0到屢次,?匹配前面0到一次,(.*?)匹配任意字符

若是你對正則表達式不是很熟悉,你能夠在這裏(傳送門2 菜鳥教程)進行這方面的學習。

下面編寫請求頭

self.headers={
            'Accept-Encoding':'gzip, deflate, br',
            'Accept-Language':'zh-CN,zh;q=0.8',
            'Referer':'http://www.xicidaili.com/nn/',
            'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                         '(KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 Chrome/60.0.3112.113 Safari/537.36',
        }
        self.proxyHeaders={
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 '
                          '(KHTML, like Gecko) Ubuntu Chromium/60.0.3112.113 Chrome/60.0.3112.113 Safari/537.36',
        }

第一個self.headers是下載頁面的請求頭,self.proxyHeaders是後面驗證ip是否可用的請求頭。

下面是下載頁面和正則匹配的函數

def getPage(self,url):
        page=self.req.get(url,headers=self.headers).text
        # print(page)
        return page

    def Page(self,text):
        time.sleep(2)
        pattern=re.compile(u'<tr class=".*?">.*?'
                           +u'<td class="country"><img.*?/></td>.*?'
                           +u'<td>(\d+\.\d+\.\d+\.\d+)</td>.*?'
                           +u'<td>(\d+)</td>.*?'
                           +u'<td>.*?'
                           +u'<a href=".*?">(.*?)</a>.*?'
                           +u'</td>.*?'
                           +u'<td class="country">(.*?)</td>.*?'
                           +u'<td>([A-Z]+)</td>.*?'
                           +'</tr>'
                           ,re.S)
        l=re.findall(pattern,text)
        return l

根據上面的代碼,就能夠將代理ip從西刺站拿下來,接下來檢驗是否有效。

requests是一個很是有用的庫,這裏也將使用它進行校驗

self.req.get("http://www.baidu.com",proxies={"{}".format(i[2]):"{}://{}:{}".format(i[2],i[0],i[1])},timeout=5)

i 是 ('110.73.48.247', '8123', 'HTTP') 類數據

爲了保證校驗的可靠性,我把每次校驗設置超時5s。

 

如此就能拿到新鮮免費的代理ip了,爲了使得ip能屢次使用,我將其存入mysql數據庫中。

寫入代碼以下

def insert(self,l):
    print("插入{}條".format(len(l)))
    self.cur.executemany("insert into xc values(%s,%s,%s,%s,%s)",l)
    self.con.commit()

讀取代碼以下

def select(self):
    a=self.cur.execute("select ip,port,xieyi from xc")
    info=self.cur.fetchall()
    return info

最後來看下使用效果:

編寫demo.py 再導入xc.py 中的xiciSpider類

from xi import xiciSpider
p=xiciSpider()
#第一次先運行這個方法,現要將ip存入mysql
p.getNewipToMysql()
#獲取可用代理ip,默認獲取1個,可指定size大小
ip=p.getAccessIP()
print(ip)

#輸出以下
「」「
/usr/bin/python3.5 /home/cb/桌面/xici/demo.py
[('36.251.248.76', '80', 'HTTPS')]

Process finished with exit code 0
」「」

首先你須要從西刺網將ip爬取到本身數據庫中,而後再從數據庫中提取有用的ip

第二次可直接使用getAccessIP方法來獲取可用ip.

 

最後奉上完整代碼 github傳送門0(xici代理ip池),以爲有用的不妨點個star

也歡迎關注本人的專欄 Python數據分析https://zhuanlan.zhihu.com/c_99646580

相關文章
相關標籤/搜索