【数据采集与融合技术】第五次大作业

【数据采集与融合技术】第五次大作业

作业①

  • 要求:

    • 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
    • 使用Selenium框架爬取京东商城某类商品信息及图片。
  • 候选网站:http://www.jd.com/

  • 关键词:学生自由选择

  • 输出信息:MYSQL的输出信息如下

    mNo mMark mPrice mNote mFile
    000001 三星Galaxy 9199.00 三星Galaxy Note20 Ultra 5G... 000001.jpg
    000002......

1)完成过程:

  • 大致思路:复现老师代码,初始化后跳转至搜索结果页面,之后逐页爬取商品信息并存储,使用多线程手段下载图片并保存

1.初始化并跳转至搜索结果页面

def startUp(self, url, key):  # 爬虫初始化并跳转至搜索结果页面
    # 浏览器设置初始化
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    self.driver = webdriver.Chrome(chrome_options=chrome_options)

    # 参数初始化
    self.threads = []
    self.No = 0
    self.imgNo = 0
    # 数据库初始化
    try:
        self.con = sqlite3.connect("phones.db")
        self.cursor = self.con.cursor()

        try:
            # 如果有表就删除
            self.cursor.execute("drop table phones")
        except Exception:
            pass

        try:
            # 建立新的表
            sql = "create  table  phones  (mNo  varchar(32) primary key, mMark varchar(256),mPrice varchar(32),mNote varchar(1024),mFile varchar(256))"
            self.cursor.execute(sql)
        except Exception:
            pass

    except Exception as err:
        print(err)
    # 初始化图片文件夹
    try:
        if not os.path.exists(MySpider.imagePath):
            os.mkdir(MySpider.imagePath)
        images = os.listdir(MySpider.imagePath)
        for img in images:
            s = os.path.join(MySpider.imagePath, img)
            os.remove(s)
    except Exception as err:
        print(err)

    self.driver.get(url)
    keyInput = self.driver.find_element_by_id("key")
    keyInput.send_keys(key)
    keyInput.send_keys(Keys.ENTER)

2.爬取当前页面商品信息并下载图片保存数据

def processSpider(self):  # 爬取当前页面商品数据
    try:
        time.sleep(1)
        print(self.driver.current_url)
        lis =self.driver.find_elements_by_xpath("//div[@id='J_goodsList']//li[@class='gl-item']")
        for li in lis:
        # 对图片存在的两个位置尝试下载
            try:
                src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("src")
            except:
                src1 = ""

            try:
                src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img")
            except:
                src2 = ""

            try:
                price = li.find_element_by_xpath(".//div[@class='p-price']//i").text
            except:
                price = "0"

            try:  # 数据清洗
                note = li.find_element_by_xpath(".//div[@class='p-name p-name-type-2']//em").text
                mark = note.split(" ")[0]
                mark = mark.replace("爱心东东\n", "")
                mark = mark.replace(",", "")
                note = note.replace("爱心东东\n", "")
                note = note.replace(",", "")
            except:
                note = ""
                mark = ""

            self.No = self.No + 1  # 图片计数
            if self.No > 115:  # 流量不足,下载115张图片后停止
                print('115张啦 差不多啦!')
                return
            no = str(self.No)
            while len(no) < 6:  # 同一图片命名格式
                no = "0" + no
            print(no, mark, price)
            if src1:  # 添加文件后缀
                src1 = urllib.request.urljoin(self.driver.current_url, src1)
                p = src1.rfind(".")
                mFile = no + src1[p:]
            elif src2:
                src2 = urllib.request.urljoin(self.driver.current_url, src2)
                p = src2.rfind(".")
                mFile = no + src2[p:]
            if src1 or src2:  # 多线程加快图片下载
                T = threading.Thread(target=self.download, args=(src1, src2, mFile))
                T.setDaemon(False)
                T.start()
                self.threads.append(T)
            else:
                mFile = ""
            self.insertDB(no, mark, price, note, mFile)
        # 取下一页的数据,直到最后一页
        try:
            self.driver.find_element_by_xpath("//span[@class='p-num']//a[@class='pn-next disabled']")
        except:
            nextPage = self.driver.find_element_by_xpath("//span[@class='p-num']//a[@class='pn-next']")
            time.sleep(10)
            nextPage.click()
            self.processSpider()
    except Exception as err:
        print(err)
  • 页面图片两种不同的加载方式

    • src

    • data-lazy-img

3.图片下载

def download(self, src1, src2, mFile):  # 图片下载
    data = None
    if src1:  # 尝试链接一爬取
        try:
            req = urllib.request.Request(src1, headers=MySpider.headers)
            resp = urllib.request.urlopen(req, timeout=10)
            data = resp.read()
        except:
            pass
    if not data and src2:  # 链接一爬取失败且存在链接二时尝试链接二
        try:
            req = urllib.request.Request(src2, headers=MySpider.headers)
            resp = urllib.request.urlopen(req, timeout=10)
            data = resp.read()
        except:
            pass
    if data:  # 图片存在则下载
        print("download begin", mFile)
        fobj = open(MySpider.imagePath + "\\" + mFile, "wb")
        fobj.write(data)
        fobj.close()
        print("download finish", mFile)

4.结果展示

  • 数据库

  • 图片

2)心得体会:

使用复现代码所以难度不大,其中对图片加载方式的理解确实比自己做作业时要仔细,学到了学到了!

作业②

  • 要求:

    • 熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
    • 使用Selenium框架+MySQL模拟登录慕课网,并获取学生自己账户中已学课程的信息保存到MySQL中(课程号、课程名称、授课单位、教学进度、课程状态,课程图片地址),同时存储图片到本地项目根目录下的imgs文件夹中,图片的名称用课程名来存储。
  • 候选网站:中国mooc网:https://www.icourse163.org

  • 输出信息:MYSQL数据库存储和输出格式

    表头应是英文命名例如:课程号ID,课程名称:cCourse……,由同学们自行定义设计表头:

    Id cCourse cCollege cSchedule cCourseStatus cImgUrl
    1 Python网络爬虫与信息提取 北京理工大学 已学3/18课时 2021年5月18日已结束 http://edu-image.nosdn.127.net/C0AB6FA791150F0DFC0946B9A01C8CB2.jpg
    2......

1)完成过程

  • 大致思路:整体使用作业①的代码框架,在页面跳转及信息爬取部分稍作改动其余相同。

1.爬虫初始化并进入信息界面

def startUp(self, url):  # 爬虫初始化并进入我的课程界面
    # selenium初始化
    chrome_options = Options()
    chrome_options.add_argument('--disable-gpu')
    self.driver = webdriver.Chrome(chrome_options=chrome_options)

    # 参数初始化
    self.threads = []
    self.No = 0
    # 数据库初始化
    try:
        self.con = sqlite3.connect("course.db")
        self.cursor = self.con.cursor()

        try:
            # 如果有表就删除
            self.cursor.execute("drop table course")
        except Exception as err:
            print(err)
            pass

        try:
            # 建立新的表
            sql = "create  table  course  (Id  varchar(32) primary key, cCourse varchar(256),cCollege varchar(64),cSchedule varchar(32),cCourseStatus varchar(32),cImgUrl varchar(256))"
            self.cursor.execute(sql)
        except Exception as err:
            print(err)
            pass

    except Exception as err:
        print(err)
    # 图片文件夹初始化
    try:
        if not os.path.exists(MySpider.imagePath):
            os.mkdir(MySpider.imagePath)
        images = os.listdir(MySpider.imagePath)
        for img in images:
            s = os.path.join(MySpider.imagePath, img)
            os.remove(s)
    except Exception as err:
        print(err)
    # 登陆后进入我的课程界面
    self.driver.get(url)
    a = self.driver.find_element(By.CLASS_NAME, "_1Y4Ni")
    a.click()
    time.sleep(10)
    my = self.driver.find_element(By.XPATH,'//div[@class="ga-click u-navLogin-myCourse u-navLogin-center-container"]//a')
    my.click()

2.爬取课程信息并保存下载

def processSpider(self):  # 爬取相关信息
    try:
        time.sleep(3)  # 等待数据加载
        courses = self.driver.find_elements(By.XPATH, '//div[@class="course-panel-body-wrapper"]/div')
        for c in courses:
            img = c.find_element(By.XPATH, './/img[@src]').get_attribute('src')
            title = c.find_element(By.XPATH, './/span[@class="text"]').text
            school = c.find_element(By.XPATH, './/div[@class="school"]//a').text
            schedule = c.find_element(By.XPATH, './/span[@class="course-progress-text-span"]').text
            end = c.find_element(By.XPATH, './/div[@class="course-status"]').text
            self.No = self.No + 1
            no = str(self.No)
            mFile = title + '.jpg'
            T = threading.Thread(target=self.download, args=(img, mFile))
            T.setDaemon(False)
            T.start()
            self.threads.append(T)

            self.insertDB(no, title, school, schedule, end, img)
    except Exception as err:
        print(err)

3.图片下载

def download(self, src, mFile):  # 图片下载
    data = None
    if src:  # 尝试爬取图片数据
        try:
            req = urllib.request.Request(src, headers=MySpider.headers)
            resp = urllib.request.urlopen(req, timeout=10)
            data = resp.read()
        except:
            pass
    if data:  # 存在图片数据则下载到本地
        print("download begin", mFile)
        fobj = open(MySpider.imagePath + "\\" + mFile, "wb")
        fobj.write(data)
        fobj.close()
        print("download finish", mFile)

4.结果展示

  • 数据库

image-20211205231433496

  • 图片

2)心得体会:

大体同作业①相同,但通过自己修改加深了对代码的理解,又学到了!

作业③

  • 要求

    :掌握大数据相关服务,熟悉Xshell的使用

    • 完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
    • 环境搭建
      • 任务一:开通MapReduce服务
    • 实时分析开发实战:
      • 任务一:Python脚本生成测试数据
      • 任务二:配置Kafka
      • 任务三:安装Flume客户端
      • 任务四:配置Flume采集数据

1)完成过程:

1.环境搭建

  • 任务一:开通MapReduce服务

2.实时分析开发实战

  • 任务一:Python脚本生成测试数据

  • 任务二:配置Kafka

  • 任务三:安装Flume客户端

  • 任务四:配置Flume采集数据

2)心得体会:

尝试了华为云系列产品,好用,学到了 !

代码

posted @ 2021-12-05 23:44  Poootato  阅读(10)  评论(0编辑  收藏  举报