python爬取"快代理"和"西刺"的"国内高匿代理IP"

需求

爬取"快代理"网站里免费代理专栏的"国内高匿代理",如下图

而我们要做的就是获取IP,PORT,匿名度,类型,位置,响应速度以及最后验证时间,并验证其可用性,最后把他们存储到.txt文件,.csv文件以及mongoDB数据库中。

事先准备

  • pycharm开发工具。
  • mongoDB数据库。

安装教程可自行百度或谷歌查找。或者点这里,PyCharm2019安装教程MongoDB安装配置教程

源代码

#######################################
####  爬取"快代理"的"国内高匿代理IP"
#######################################
import requests
from bs4 import BeautifulSoup
from telnetlib import Telnet  # 这是用来验证IP是否可用
import pandas as pd           # 将数据保存到csv中
import pymongo

class MongoDB():
    def __init__(self, result=''):
        self.host = 'localhost'
        self.port = 27017
        self.databaseName = 'meituan'
        self.formName = 'proxy_ip'
        self.result = result

    # 连接数据库
    def collect_database(self):
        client = pymongo.MongoClient(host=self.host, port=self.port)  # 连接MongoDB
        db = client[self.databaseName]  # 选择数据库
        collection = db[self.formName]  # 指定要操作的集合,表
        return collection

    # 保存数据
    def save_to_Mongo(self):
        collection = self.collect_database()
        try:
            if collection.insert_many(self.result):
                print('存储到MongoDB成功', self.result)
        except Exception:
            print('存储到MongoDb失败', self.result)

    # 查询数据
    def selectMongoDB(self):
        collection = self.collect_database()
        # print('评论数据的总长度为:',collection.count_documents({}))
        for x in collection.find():
            print(x)

    # 删除数据
    def delete_database(self):
        collection = self.collect_database()
        collection.delete_many({'proxy_web_name': 'kuai_proxy'})  # 删除数据库内容

class KuaiProxy():
    def __init__(self):
        self.baseUrl = 'https://www.kuaidaili.com/free/inha/'

    #获取快代理的有效ip,数目为num条
    def getDataList(self, num=5):
        print('爬取中...')
        #将浏览器的request header和response header的字段复制过来
        headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
            'Host': 'www.kuaidaili.com',
            'Referer': 'https://www.kuaidaili.com/free/inha'
        }
        totalList = []  #爬取到的所有的ip
        ableList = []   #爬取到的有效的ip
        unableList = [] #爬取到的无效的ip
        page = 1   #为保证能爬取到足够多的有效代理,这里设置最大爬取页数

        #至少要爬取到num个有效的免费ip地址
        while len(ableList) < num:
            self.url = self.baseUrl + str(page)
            req = requests.get(self.url, headers=headers)
            html_doc = BeautifulSoup(req.text, 'html.parser')
            lists = html_doc.select('.table.table-bordered.table-striped tbody tr')
            print('数据分析中,请稍等...')
            for tr in lists:
                self.tr = tr
                ip = self.getText(0) + ':' + self.getText(1)
                obj = {
                    'ip': ip,
                    'anonymous': self.getText(2),
                    'type': self.getText(3),
                    'address': self.getText(4),
                    'responseTime':self.getText(5),
                    'finalVerifyTime': self.getText(6),
                }
                totalList.append(obj)
                try:
                    Telnet(self.getText(0), self.getText(1),timeout=10)#timeout的只是在初始化socket连接时起作用,而一旦连接成功后如果出现等待那就不会起作用了
                    ableList.append(obj)
                    print('ableList:', ableList, len(ableList))
                except:
                    unableList.append(obj)
            page = page + 1
        self.totalList = totalList
        self.ableList = ableList
        self.unableList = unableList
        return ableList

    #删除开头或是结尾的字符,如对" Runoob "去除首尾空格
    def getText(self, index):
        return self.tr.select('td')[index].text.strip()

class SaveDataInFiles():
    def __init__(self, results=''):
        # 需要保存的数据
        self.results = results

    # 出口文件
    def saveResults(self):
        self.saveInCsv()
        self.saveInTxt()

    # 将结果ip保存到D:\python\meituan\output_file\proxyIp_kuai.txt中
    def saveInTxt(self):
        txt = open('D:\python\meituan\output_file\proxyIp_kuai.txt', 'w')
        txt.truncate()  # 保存内容前先清空内容
        for item in self.results:
            itemStr = str(item)
            txt.write(itemStr)
            txt.write('\n')
        txt.close()

    # 将结果保存到D:\python\meituan\output_file\proxyIp_kuai.csv中
    def saveInCsv(self):
        csvUrl = 'D:\python\meituan\output_file\proxyIp_kuai.csv'
        pd.DataFrame(self.results).to_csv(csvUrl, encoding="utf-8-sig")  # 避免保存的中文乱码

#调用方法,获取有效IP列表
KuaiProxy = KuaiProxy().getDataList()
# 保存数据到files中
SaveDataInFiles(KuaiProxy).saveResults()
# 保存数据到数据库
MongoDB(KuaiProxy).save_to_Mongo()
# 查看保存的数据
MongoDB().selectMongoDB()

存储到数据库的代理ip
在这里插入图片描述

存储到.txt文件的代理ip
在这里插入图片描述

存储到.csv文件的代理ip
在这里插入图片描述

同理的,爬取西刺免费代理过程也是一样的。源代码如下:

#######################################
####  爬取"西刺免费代理"的"国内高匿代理IP"
#######################################

import requests
import csv  # 不使用这个
from bs4 import BeautifulSoup
from telnetlib import Telnet  # 这是用来验证IP是否可用
import pandas as pd  # 将数据保存到csv中
# import datetime               # 获取当前时间
import pymongo

class MongoDB():
    def __init__(self, result=''):
        self.host = 'localhost'
        self.port = 27017
        self.databaseName = 'meituan'
        self.formName = 'proxy_ip'
        self.result = result

    # 连接数据库
    def collect_database(self):
        client = pymongo.MongoClient(host=self.host, port=self.port)  # 连接MongoDB
        db = client[self.databaseName]  # 选择数据库
        collection = db[self.formName]  # 指定要操作的集合,表
        return collection

    # 保存数据
    def save_to_Mongo(self):
        collection = self.collect_database()
        try:
            if collection.insert_many(self.result):
                print('存储到MongoDB成功', self.result)
        except Exception:
            print('存储到MongoDb失败', self.result)

    # 查询数据
    def selectMongoDB(self):
        collection = self.collect_database()
        # print('评论数据的总长度为:',collection.count_documents({}))
        for x in collection.find():
            print(x)

    # 删除数据
    def delete_database(self):
        collection = self.collect_database()
        collection.delete_many({'proxy_web_name': 'xici_proxy'})  # 删除数据库内容

class XiciProxy():
    def __init__(self):
        self.baseUrl = 'https://www.kuaidaili.com/free/inha/'
        # self.createTime = datetime.datetime.now().strftime('%Y-%m-%d')
        # self.mongoDB =mongoDB(self) #调用数据库的类

    # 获取西刺代理的有效ip,数目为num条
    def getDataList(self, num=10):
        print('爬取中...')
        # 将浏览器的response header和request header的复制过来
        headers = {
            'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36",
            'Host': 'www.xicidaili.com',
            'Referer': 'https://www.xicidaili.com/nn/'
        }
        totalList = []
        ableList = []
        unableList = []
        page = 1  # 只爬取第一页的数据
        # 至少要爬取到num=20个有效的免费ip地址
        while len(ableList) < num:
            self.url = self.baseUrl + str(page)
            req = requests.get(self.url, headers=headers)
            html_doc = BeautifulSoup(req.text, 'html.parser')
            # 除去第一行,因为第一行为标题栏(国家,IP地址,端口,服务器地址,是否匿名......),不是我们想要的数据
            lists = html_doc.select('#ip_list tr')[1:]
            print('数据分析中,请稍等...')
            print('lists:',lists)
            for li in lists[1:]:
                self.li = li
                ip = self.getText(1) + ':' + self.getText(2)
                obj = {
                    'proxy_web_name': 'xici_proxy',
                    'ip': ip,
                    'address': self.getText(3),
                    'anonymous': self.getText(4),
                    'type': self.getText(5),
                    'alive': self.getText(8),
                    'date': self.getText(9),
                }
                totalList.append(obj)
                print('ableList:', ableList, len(ableList))
                try:
                    Telnet(self.getText(1), self.getText(2), timeout=0.1)
                    print(len(ableList), num, Telnet(self.getText(1), self.getText(2), timeout=1))
                    ableList.append(obj)
                except:
                    unableList.append(obj)
            page = page + 1
        self.totalList = totalList
        self.ableList = ableList
        self.unableList = unableList

        return ableList

    # 删除开头或是结尾的字符,如对" Runoob "去除首尾空格
    def getText(self, index):
        return self.li.select('td')[index].text.strip()

class SaveDataInFiles():
    def __init__(self, results=''):
        # 需要保存的数据
        self.results = results

    # 出口文件
    def saveResults(self):
        self.saveInCsv()
        self.saveInTxt()

    # 将结果ip保存到D:\python\meituan\output_file\roxyIp_xici.txt中
    def saveInTxt(self):
        txt = open('D:\python\meituan\output_file\proxyIp_xici.txt', 'w')
        txt.truncate()  # 保存内容前先清空内容
        for item in self.results:
            itemStr = str(item)
            txt.write(itemStr)
            txt.write('\n')
        txt.close()

    # 将结果保存到D:\python\meituan\output_file\roxyIp_xici.csv中
    def saveInCsv(self):
        csvUrl = 'D:\python\meituan\output_file\proxyIp_xici.csv'
        pd.DataFrame(self.results).to_csv(csvUrl, encoding="utf-8-sig")  # 避免保存的中文乱码


# 调用方法,返回有效IP列表
xici_proxy = XiciProxy().getDataList()
# 保存数据到files中
SaveDataInFiles(xici_proxy).saveResults()
# 保存数据到数据库
MongoDB(xici_proxy).save_to_Mongo()
# 查看保存的数据
MongoDB().selectMongoDB()

虽然我们已经爬取了免费代理,但是它们极不稳定,而且很容易挂掉。因此,若各位条件允许的话,还是使用付费的代理吧。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值