采集免费ip,制作自己的代理ip池

采集免费ip,制作自己的代理ip池

 

第一步,选择一个免费代理ip的网站,把他们网站的所有ip都爬取下来,

免费的代理IP不同网站质量也不尽相同,如果大家对于代理IP质量要求比较高,或者需要大量稳定代理IP的话,还是建议大家进行购买啦~

提取的时候,使用正则表达式,

这种免费代理,绝大部分,都是不可用的,

 

第二步,用request库去请求验证这个ip,然后把可用的ip,都提取出来,

要想判断所使用的代理IP是否有用,只需要通过代理IP访问IP地址查询网站抓取地址以及归属地信息并与不使用代理IP时的地址信息以及归属地信息进行比较即可。

在浏览器访问icanhazip.com,浏览器会直接返回你的出口IP(也叫公网IP)。或者百度“IP”也可以返回你的出口IP。

浏览器访问IP138.com 或者http://ip.chinaz.com/,就可以得到外网地址。icanhazip.com

 

 

 

 

第三步,把可用的ip,都保存到数据库,

如此就能拿到新鲜免费的代理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

 

整个过程使用python+re+request+mysql来完成,

####

import re
import requests
import pymysql
import time
class xiciSpider(object):
    def __init__(self):
        self.req=requests.Session()
        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.con=pymysql.Connect(
            host='127.0.0.1',
            user='root',
            password="*****",
            database='xici',
            port=3306,
            charset='utf8',
        )
        self.cur=self.con.cursor()


    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
        # print(result[0])
    def getUrl(self,pageNum):
        url='http://www.xicidaili.com/nn/'+str(pageNum)
        return url

    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
    def getAccessIP(self,size=1):
        info=self.select()
        p=[]
        for i in info:
            if len(p)==size:
                return p
            try:
                self.req.get("http://www.baidu.com",proxies={"{}".format(i[2]):"{}://{}:{}".format(i[2],i[0],i[1])},timeout=5)
                p.append(i)
            except Exception:
                print("{} is valid".format(i))
        print(p)

    def getNewipToMysql(self):
        for i in range(2300):
            page=self.getPage(self.getUrl(i))
            p.insert(self.Page(page))

if __name__=='__main__':
    p=xiciSpider()
    # p.Page(p.getPage('http://www.xicidaili.com/nn/'))

    # for i in range(2300):
    #     page=p.getPage(p.getUrl(i))
    #     p.insert(p.Page(page))
    p.getAccessIP()

 

#####

from xc import xiciSpider

p=xiciSpider()
#第一次先运行这个方法,现将ip存入mysql
p.getNewipToMysql()
#获取可用代理ip,默认获取1个,可指定size大小
ip=p.getAccessIP()
print(ip)

####

 

 

 

 

 

 

######

posted @ 2021-09-22 07:39  技术改变命运Andy  阅读(1605)  评论(0编辑  收藏  举报