1. 程式人生 > >爬蟲ip代理池新建(使用芝麻ip代理)

爬蟲ip代理池新建(使用芝麻ip代理)

如果真入職爬蟲工程師職位後,真正做爬蟲爬取資料的過程,將會使用大量的ip做ip替換,否則很容易被封ip,導致資料獲取無法持續下去。
而現在市面上的免費代理其實很多都是無效的,或者持續效果很低效的。因此需要找到一個穩定高效且效果不錯的代理商。
現在我就把自己目前使用的ip代理和自己獲取代理使用mysql做的ip代理池分享出來。
儲存後執行檔案即可以直接使用。

芝麻官網:http://www.zhimaruanjian.com/
使用芝麻代理,需要將本地ip新增白名單後才能穩定使用。
下面是我代理池指令碼執行截圖截圖
在這裡插入圖片描述

import requests
import json
import re
from xlwt import Workbook
import xlrd
import time
import pymysql
import time
import threadpool,random
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
import smtplib,time


#獲取ip代理
def get_ip():
    url =["http://webapi.http.zhimacangku.com/getip?num=200&type=2&pro=&city=0&yys=0&port=1&time=5&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1&regions=",
          "http://webapi.http.zhimacangku.com/getip?num=200&type=2&pro=&city=0&yys=0&port=1&time=4&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1&regions=",
          "http://webapi.http.zhimacangku.com/getip?num=200&type=2&pro=&city=0&yys=0&port=1&time=3&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1&regions=",
          "http://webapi.http.zhimacangku.com/getip?num=200&type=2&pro=&city=0&yys=0&port=1&time=2&ts=0&ys=0&cs=0&lb=1&sb=0&pb=4&mr=1&regions="]

    html = requests.get(url=random.choice(url),headers={'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3534.4 Safari/537.36"})
    zm_ip = []
    datas = json.loads(str(html.content, encoding='utf-8'))
    # print(datas['data'])
    if datas['code'] is 0:
        for data in datas['data']:
            # print(data)
            zm_ip.append(data['ip'] + ':' + str(data['port']))
    else:
        time.sleep(30)
        print('獲取ip失敗,等待30s,重複獲取嘗試中.....')
        get_ip()
    return zm_ip

#資料插入
def details_ip(ip):
    conn = pymysql.connect(host="地址", user="使用者名稱", passwd="密碼", db="資料庫", charset="utf8")
    cursor = conn.cursor()
    try:
        sql = "insert into ip (ip) values(%s)"
        cursor.executemany(sql, ip)
        conn.commit()
    except:
        print('資料插入有誤。。')
        conn.rollback()

    cursor.close()
    conn.close()
    print('---新獲取200ip插入完成---')

#ip池數量統計
def count_ip():
    conn = pymysql.connect(host="地址", user="使用者名稱", passwd="密碼", db="資料庫", charset="utf8")
    cursor = conn.cursor()
    sql = "select count(*) from ip"
    cursor.execute(sql)
    data = cursor.fetchone()
    cursor.close()
    conn.close()

    return data

#獲取ip池前200條測試是否可用
def m_get_ip():
	
    conn = pymysql.connect(host="地址", user="使用者名稱", passwd="密碼", db="資料庫", charset="utf8")
    cursor = conn.cursor()
    sql = "select * from ip  LIMIT 0,200"
	
    cursor.execute(sql)
    data = cursor.fetchall()
    cursor.close()
    conn.close()
    ips = test_ip(data)
    return ips

#測試是否可用的方法
def test_ip(IPlist):
    succ_ip = []
    delete_ip_id = []

    for ip in IPlist:
        try:
            # print('測試:', ip[1])
            requests.get('http://www.baidu.com', proxies={"http": ip[1]}, timeout=0.5)
        except:
            # print('失敗', ip[0])
            delete_ip_id.append(ip[0])
        else:
            # print('成功', ip[1])
            succ_ip.append(ip[1])
    delete_ip(delete_ip_id)
    # print(delete_ip_id)
    print('開始測試前200條ip是否可用,-------------------------完成。 -------------------------------共%d條資料可以繼續使用' % len(succ_ip))
    if len(succ_ip) < 50:
        email_spider('IP池爬蟲', 'ip池可用ip數量低於50,請儘快檢查!!!')
    return succ_ip

#將測試不通過的ip刪除
def delete_ip(ids):
    print('本次此時刪除ip數量為:%d' % len(ids))
    conn = pymysql.connect(host="地址", user="使用者名稱", passwd="密碼", db="資料庫", charset="utf8")
    cursor = conn.cursor()
    for id in ids:
        # print(id)
        sql = "delete from ip where id =%s" % id
        cursor.execute(sql)
    conn.commit()
    cursor.close()
    conn.close()
    print('開始刪除前200條ip中不可使用的資料,完成')

#郵件通知模組
def _format_addr(s):
    name, addr = parseaddr(s)

    return formataddr((Header(name, 'utf-8').encode(), addr))

#郵件通知模組
def email_spider(msgs,content):
    from_addr = '傳送人郵箱@163.com'
    password = '傳送人key'
    to_addr = '接收人郵箱@qq.com'
    smtp_server = 'smtp.163.com'
    now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    msg = MIMEText('爬蟲:%s執行詳細報告 \n\n %s   \n 傳送時間是:%s' % (msgs,content,now_time), 'plain', 'utf-8')

    msg['From'] = _format_addr('%s爬蟲執行狀態報告 <%s> ' % (msgs, from_addr))

    msg['To'] = _format_addr('管理員 <%s> ' % to_addr)

    msg['Subject'] = Header('%s爬蟲執行狀態' % msgs, 'UTF-8').encode()

    server = smtplib.SMTP(smtp_server, 25)

    server.login(from_addr, password)

    server.sendmail(from_addr, [to_addr], msg.as_string())

    server.quit()

    print('郵件傳送成功')
#獲取當前執行時間
def get_now_time():
    now_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
    return now_time

#啟動模組
if __name__ == '__main__':
    while True:
        count = count_ip()
        if count[0] < 400:
            print('--{}--ip代理池數量小於400,啟動獲取指令碼'.format(get_now_time()))
            ip = get_ip()
            details_ip(ip)
            # time.sleep(60)
            m_get_ip()

        elif count[0] > 400:
            print('--{}--ip代理池數量大於400,暫停中。。。'.format(get_now_time()))
            time.sleep(60)

        m_get_ip()
        time.sleep(30)
        print('--{}--每30s檢測一次資料庫前200條ip地址是否可訪問'.format(get_now_time()))

    # print(data)