类的应用--天猫、苏宁易购数据的自动化爬取和保存--学生系统

本文介绍了如何利用类来实现天猫和苏宁易购数据的自动化爬取,并结合学生系统进行数据管理。通过定义数据类和模块类,实现了数据的添加和功能模块化,特别是利用泛型遍历优化了数据处理过程。

天猫数据的自动化爬取

#天猫商品信息
#从selenium中引入webdriver
from selenium import webdriver
import time

#声明一个类
class TianMao(object):
    #初始化时,传递要查询的关键词
    def __init__(self,keyword):

        self.keyword=keyword
    def start_taobao(self):
        #1.创建firefox浏览器对象
        driver=webdriver.Firefox()
        #2.打开淘宝网址
        driver.get('http://www.tianmao.com')
        #3.通过id找到输入框
        search_input=driver.find_element_by_id('mq')
        #4.输入搜索内容
        search_input.send_keys(self.keyword)
注意:

        #5.通过class找到搜索按钮
        search_btn=driver.find_element_by_css_selector('button[type="submit"]')

        #6.点击搜索按钮
        search_btn.click()
        #休眠2秒
        time.sleep(2)
        #1.打开文件 encoding=utf-8 指定文件的字符编码
        file_handle=open('%s.txt'%self.keyword,'w',encoding='utf-8')

        for x in range(1,3):
            print('正在获取第%s页数据,请稍后......'%x)
            #for 循环执行5次
            for x in range(1,11,2):
                #休眠1秒
                time.sleep(1)
                #把x转换小数
                j=x/10
                #拼接让浏览器滚动的js代码
                #%f float类型数据占位符
                js='document.documentElement.scrollTop = document.documentElement.scrollHeight *%f '%j
                #执行让浏览器滚动的js代码
                driver.execute_script(js)

            #查找当前页所有的商品信息,返回的是一个列表(elements查找多个)
            #电脑,鼠标、键盘.........class_name填写 info-cont
            #其他的产品........class_name填写 J_MouserOnverReq
            shops=driver.find_elements_by_class_name('product')
            print(len(shops))
            #如果没有找到数据,换另一种方式去找
            # if len(shops)==0:
            #     shops = driver.find_elements_by_class_name('info-cont')

            #for循环遍历列表,取出每一个商品的信息
            for shop in shops:
                #输出查看商品信息
                # print(shop.text)
                file_handle.write(shop.text)
                file_handle.write('\n\n')
            # 找到下一页,点击
            next=driver.find_element_by_class_name('ui-page-next')
            next.click()
        # 3.关闭文件
        # 退出浏览器
        driver.quit()
#输出
# print(__name__)
#__name__值为__main__表示是从当前文件直接运行
#__name__ 值为  当前文件名称 表示别的文件引用执行的
#如果是从当前文件直接运行的,执行以下代码
if __name__=='__main__':
    keyword=input('请输入查询关键词:')
    tm=TianMao(keyword)
    tm.start_taobao()

苏宁易购数据爬取

from selenium import webdriver
import time
class Suning(object):
    # 初始化时,传递要查询的关键词
    def __init__(self, keyword):
        self.keyword = keyword
    def suning(self):

        driver=webdriver.Firefox()
        driver.get('http://suning.com')

        search_input=driver.find_element_by_id('searchKeywords')
        search_input.send_keys(keyword)
        time.sleep(5)
        search_btn=driver.find_element_by_id('searchSubmit')
        search_btn.click()
        time.sleep(2)
        file_handle=open('%s.txt'%self.keyword,'w',encoding='utf-8')
        for x in range(1,3):
            print('正在爬取第%s页数据......'%x)
            for x in range(1,11,2):
                j=x/10
                js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight *%f ' % j
                # 执行让浏览器滚动的js代码
                driver.execute_script(js)
            # #电脑
            # shops=driver.find_elements_by_class_name('product-box')
            # if len(shops)==0:
            #     #好吃的
            #     shops = driver.find_elements_by_class_name('wrap')
            shops = driver.find_elements_by_class_name('res-info')
            for shop in shops:
                # print(shop.text)
                file_handle.write(shop.text)
                file_handle.write('\n\n')

            next=driver.find_element_by_id('nextPage')
            # next=driver.find_element_by_link_text('下一页')
            next.click()

        driver.quit()
if __name__=='__main__':
    keyword=input('请输入查询关键词:')
    sn=Suning(keyword)
    sn.suning()

学生系统

定义两个类:1.数据类   添加数据

                    2.模块类  实现的具体功能(创建一个数据类的对象,将这个对象的传入的数据添加到列表中)


 #注意:!!!!!泛型遍历,只会匹配内容,执行完从第一个开始找,for x in..先拿出索引

例如:在删除所有同名的数据时:

  while 1:
                a=False

                #注意:!!!!!泛型遍历,只会匹配内容,执行完从第一个开始找,for x in..先拿出索引
                for x in range(0,len(self.student_list)):
                    student=self.student_list[x]
                    if student.name== name:
                        #根据student(小列表)在大列表中位置,判断学员信息的序号
                        # index=self.student_list.index(student,0,len(self.student_list)+1)
                        print('该学员的序号为:%s'%x)
                        a=True

                if a==False:
                    name = input('您要查询的学生不在该表,重新输入查询学员的姓名:')
                else:
                    break
该系统实现代码如下:


#数据类
class Date(object):
    # 初始化中给对象属性赋值
    def __init__(self, name, age, phone):
        self.name = name
        self.age = age
        self.phone = phone



#模块类
class Student(object):
    #初始化中给对象属性赋值
    def __init__(self):
        # self.name=''
        # self.age=''
        # self.phone=''
        self.student_list=[]

    #添加学员函数
    def add_student(self):
        # 输入学员姓名、年龄、电话
        self.name = input('请输入学员姓名:')
        self.age = input('请输入学员年龄:')
        self.phone = input('请输入学员电话:')
        #把name、age、phone放在小列表中
        # student={'name':self.name,'age':self.age,'phone':self.phone}
        student=Date(self.name,self.age,self.phone)
        #把小列表添加到所有学员的大列表中
        #append(object) insert(index,object) extend(iterable)
        self.student_list.append(student)
        print('****添加学员成功****')

    #查询学员的函数
    def query_student(self):
        #1.查询所有学员
        #2.输入学员姓名 查询学员 得到查询的学员的序号
        print('*******学员信息列表*********')
        print('1.查询所有学员')
        print('2.根据姓名,查询学员序号')
        num = input('请选择您的操作:')
        # 转换为整数
        num = int(num)
        # 判断选择学员序号是否在范围内
        while num not in range(1,3):
            # 不在范围,重新选择
            num = input('没有选项,请重选:')
            num = int(num)
        if num==1:
            #遍历大列表
            for x in range(0,len(self.student_list)):
                #根据x的值 从大列表中取出小字典
                student=self.student_list[x]
                #对象中取出姓名、年龄、电话      属性值=对象.属性名
                name=student.name
                age=student.age
                phone=student.phone
                print('序号:%s姓名:%s年龄:%s电话:%s'%(x,name,age,phone))

        else:
            name = input('请输入要查询学员的姓名:')
            while 1:
                a=False

                #注意:!!!!!泛型遍历,只会匹配内容,执行完从第一个开始找,for x in..先拿出索引
                for x in range(0,len(self.student_list)):
                    student=self.student_list[x]
                    if student.name== name:
                        #根据student(小列表)在大列表中位置,判断学员信息的序号
                        # index=self.student_list.index(student,0,len(self.student_list)+1)
                        print('该学员的序号为:%s'%x)
                        a=True

                if a==False:
                    name = input('您要查询的学生不在该表,重新输入查询学员的姓名:')
                else:
                    break


    #修改学员的函数
    def update_student(self):
        #判断是否有学员信息,如果没有,直接结束函数的执行
        if len(self.student_list)==0:
            print('没有学员信息,无法进行修改操作!')
            #强制结束函数的执行 return  下面的代码 都不会再执行了
            return
        for x in range(0, len(self.student_list)):
            # 根据x的值 从大列表中取出小字典
            student = self.student_list[x]
            # 从小字典中取出姓名、年龄、电话
            name = student.name
            age = student.age
            phone = student.phone
            print('序号:%s姓名:%s年龄:%s电话:%s' % (x, name, age, phone))

        index=self.get_index('修改')
        #根据选择的序号取出对应的学员信息小列表
        student=self.student_list[index]
        new_name=input('请输入修改后的姓名(%s):'%student.name)
        new_age=input('请输入修改后的年龄(%s):'%student.age)
        new_phone=input('请输入修改后的电话(%s):'%student.phone)
        #6.修改小列表中的数据
        student.name=new_name
        student.age =new_age
        student.phone=new_phone
        print('-----------修改数据完成------------')

    def get_index(self,type):
        '''
        函数的功能描述:获取用户选择的学员序号
        :param type: 选择序号类型
        :return: 选择的序号
        '''
        index = input('请选择要%s的学员序号:'%type)
        # 转换为整数类型
        index = int(index)
        while index not in range(0, len(self.student_list)):
            index = input('选择的学员序号不存在,请重选:')
            index = int(index)
        #返回选择的序号
        return index
    #删除学员信息
    #1.根据序号删除 2.删除所有学员 3.根据学员姓名删除(有同名的,把同名的都删除)
    def delete_student(self):
        if len(self.student_list)==0:
            print('没有学员信息,无法执行删除操作!')
            return
        print('1.根据学员序号删除')
        print('2.删除所有学员')
        print('3.根据姓名删除学员')
        num = int(input('请输入您的选择:'))
        # 判断选择的选项是否在范围内
        while num not in range(1, 4):
            #获取输入的内容 并转换为整数类型
            num = int(input('没有改选项,请重选:'))
        #判断选择选项
        if num==1:
            # 1.展示所有学员信息
            for x in range(0, len(self.student_list)):
                # 根据x的值 从大列表中取出小字典
                student = self.student_list[x]
                # 从小字典中取出姓名、年龄、电话
                name = student.name
                age = student.age
                phone = student.phone
                print('序号:%s姓名:%s年龄:%s电话:%s' % (x, name, age, phone))

            # 2.选择删除的序号
            index = self.get_index('删除')
            rs= input('确定要删除序号为(%s)的学员信息?y(是的)/n(不是):'%index)
            if rs == 'y':
                # 根据索引删除列表中的数据
                del self.student_list[index]
                #student_list.pop(index)
        elif num==2:
            # student_list.clear()
            rs = input('确定要删除全部成员?y(是的)/n(不是):')
            if rs == 'y':
                # 删除列表中全部数据
                self.student_list.clear()
            else:
                print('删除数据操作已取消!')
        else:
            name=input('请输入要删除的学员姓名:')
            while 1:
                #bb是判断是否找到对应的name,并且删除
                bb=False
                #判断大列表中是否还有同名的
                a = False
                while len(self.student_list):
                    a = False
                    for student in self.student_list:
                        if student.name ==name:
                            self.student_list.remove(student)
                            bb=True
                            a=True
                    if a==False:
                        break
                # print(student_list)
                if bb==False:
                    name=input('您要删除的学生姓名不存在,请重输:')
                else:
                    break
    def start(self):
        #声明一个大列表,存放所有学员信息
        self.student_list=[]
        #2.while循环
        while True:
            print('**************学员管理系统v2.0************')
            print('************出品人:智游集团**********')
            print('1.添加学员')
            print('2.查询学员')
            print('3.修改学员')
            print('4.删除学员')
            print('0.退出程序')
            # 选择操作
            num = input('请输入您的选择:')
            #转换为整数
            num = int(num)
            # 判断选择的选项是否在范围内
            while num not in range(0, 5):
                #重新选择
                num = input('没有改选项,请重选:')
                #把字符串类型转换整数类型
                num = int(num)
            #根据选择的选项执行对应的操作
            if num==1:
                #调用添加学员的函数
                self.add_student()
            elif num==2:
                #调用查询学员的函数
                self.query_student()
            elif num==3:
                #调用修改学员的函数
                self.update_student()
            elif num==4:
                #调用删除学员的函数
                self.delete_student()
            else:
                # print(self.student_list)
                print('-----------程序运行结束-------------')
                break


if __name__=='__main__':
    st=Student()
    st.start()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值