爬虫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)

猜你喜欢

转载自blog.csdn.net/qq_38044574/article/details/84615977