• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

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

开发技术 开发技术 4小时前 1次浏览

作业①

1.实验内容

  • 要求:
    • 熟练掌握 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……
  • 运行结果截图:(运行结果较多只截取部分信息)

控制台截图:

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

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

数据库截图:

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

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

文件夹截图:

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

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

  • 代码链接:https://gitee.com/lz061900413/project/blob/master/作业5/1.py

2.心得体会

(1)本题为 Selenium实例的复现,以手机作为关键词、总数据为413对进行网站爬取和翻页。
(2)建立与Chrome的连接

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
self.driver = webdriver.Chrome(chrome_options=chrome_options)

(3)建立数据库链接并创建表

try:#连接数据库
    self.con = pymysql.connect(host="127.0.0.1", port=3306, user="root",passwd="123456", db="ex5", charset="utf8")
    self.cursor = self.con.cursor()
    try:
        # 如果有表就删除
        self.cursor.execute("drop table phones")
    except:
        pass
    try:  #创建表并设置mNo为主键
        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:
        pass
except Exception as err:
    print(err)

(4)创建文件夹存放下载图片

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)

(5)访问网页检查输入关键词的元素

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

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

(6)检查网络元素可以发现每条数据都包含在div标签的属性id=”J_goodsList”下面的li标签属性为class=”gl- item”中

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

利用xpath找到所有的数据,然后利用循环得到每个li标签对中的元素,每部手机的数据从li对象中进一步爬取。由于图片数据量较大,所以利用多线程将下载图片设置为前台线程。

lis = self.driver.find_elements_by_xpath("//div[@id='J_goodsList']//li[@class='gl-item']")
for li in lis:
    if MySpider.No < 413:
        MySpider.No += 1
        # We find that the image is either in src or in data-lazy-img attribute
        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 = ""
        no = str(MySpider.No)
        while len(no) < 3:
            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)

(7)检查网络元素找到翻页相关超链接

数据采集与融合技术第五次大作业
可以发现只要找到,然后找到”下一页”的超级链接,在正常能翻页时超级链接是,设置休眠时间让浏览器进行缓冲。

nextPage = self.driver.find_element_by_xpath("//span[@class='p-num']//a[@class='pn-next']")
time.sleep(10)
nextPage.click()

(8)遇到问题及解决

  • 问题:在刚开始爬取的时候控制台报错

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

  • 问题解决:仔细检查发现由于Chrome版本升级之前的ChromeDriver版本已经不适配,所以重新下载。

作业②

1.实验内容

  • 要求:
    • 熟练掌握 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……
  • 运行结果截图:

控制台截图:

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

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

数据库截图:

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

文件夹截图:

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

  • 代码链接:https://gitee.com/lz061900413/project/blob/master/作业5/2.py

2.心得体会

(1)由于中国大学慕课的反扒机制较强,所以只爬取自己个人中心中的数据。
(2)打开中国大学慕课的登录界面检查元素

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

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

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

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

可以发现要用手机方式登录需要点击其他登录方式,然后再点击手机登录并输入手机号密码点击登录。注意每次click()之后需要设置休眠时间让浏览器进行缓冲。

self.driver.find_element_by_xpath('//div[@class="unlogin"]//a[@class="f-f0 navLoginBtn"]').click()  # 登录或注册
time.sleep(2)
self.driver.find_element_by_class_name('ux-login-set-scan-code_ft_back').click()  # 其他登录方式
time.sleep(2)
self.driver.find_element_by_xpath("//ul[@class='ux-tabs-underline_hd']//li[@class='']").click()
time.sleep(2)
self.driver.switch_to.frame(self.driver.find_element_by_xpath("//div[@class='ux-login-set-container']//iframe"))
self.driver.find_element_by_xpath('//input[@id="phoneipt"]').send_keys("*****")  # 输入手机号
time.sleep(2)
self.driver.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys("*****")  # 输入密码
time.sleep(2)
self.driver.find_element_by_xpath('//div[@class="f-cb loginbox"]//a[@id="submitBtn"]').click()  # 点击登录
time.sleep(6)

(3)登录后找到点击进入个人中心的网络元素,然后找到访问SPOC课程的网络元素

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

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

由此用selenium中利用xpath寻找的方式找到点击位置

self.driver.find_element_by_xpath("//div[@class='ga-click u-navLogin-myCourse u-navLogin-center-container']//span[@class='nav']").click() #点击个人中心
time.sleep(2)
self.driver.find_element_by_xpath('//div[@class="item u-st-spoc-course   ga-click"]//span[@class="u-st-course_span2"]').click() #跳转到SPOC课程
time.sleep(2)

(4)检查网络元素寻找每条信息对应的标签对

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

可以发现每条信息都在div标签的属性class=”course-card-wrapper”中,再针对题目要求检查各个信息所在的标签对然后利用selenium框架下xpath进行信息爬取。

list1 = self.driver.find_elements_by_xpath(
    "//div[@id='j-cnt1']//div[@class='course-panel-wrapper']//div[@class='course-card-wrapper']")
print("爬取MOOC课程中……")
for li in list1:
    try:
        MySpider.count += 1
        cCourse = li.find_element_by_xpath('.//div[@class="text"]//span[@class="text"]').text
        cCollege = li.find_element_by_xpath('.//div[@class="school"]/a[@target="_blank"]').text
        cSchedule = li.find_element_by_xpath(
            './/div[@class="text"]//span[@class="course-progress-text-span"]').text
        cCourseStatus = li.find_element_by_xpath(('.//div[@class="course-status"]')).text
        cImgUrl = li.find_element_by_xpath('.//div[@class="img"]/img').get_attribute("src")
        cImgUrl = cImgUrl.split("?")[0]
        time.sleep(2)
        Id = MySpider.count
        self.insertDB(Id, cCourse, cCollege, cSchedule,cCourseStatus,cImgUrl)
        print(Id, cCourse, cCollege, cSchedule, cCourseStatus, cImgUrl)
        File = str(MySpider.count) + ".jpg"  # 设置图片名称
        self.download(cImgUrl,File) #下载图片
    except Exception as err:
        print(err)

(5)建立数据库链接并创建表

try: #连接数据库
    self.con = pymysql.connect(host="127.0.0.1", port=3306, user="root",
                               passwd="123456", db="ex5", charset="utf8")
    self.cursor = self.con.cursor()
    try:
        self.cursor.execute("drop table course") # 如果有表就删除
    except:
        pass
    try: #创建表并设置Id为主键
        sql = "create  table  course  (Id  varchar(32) primary key, cCourse varchar(256),cCollege varchar(32),cSchedule varchar(1024),cCourseStatus varchar(256),cImgUrl varchar(256))"
        self.cursor.execute(sql)
    except:
        pass
except Exception as err:
    print(err)

(6)创建文件夹存放下载图片、

try: #创建文件夹用于下载图片
    if not os.path.exists(MySpider.imgpath): #如果不存在则创建
        os.mkdir(MySpider.imgpath)
    images = os.listdir(MySpider.imgpath) #存在则清空
    for img in images:
        s = os.path.join(MySpider.imgpath, img)
        os.remove(s)
except Exception as err:
    print(err)

(7)利用Chrome访问中国大学慕课网页过程

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

(8)遇到问题及解决

  • 问题:在登录过程中访问个人中心时控制台报错

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

  • 解决:延长休眠时间后问题解决,可能是浏览器的缓冲时间比原来设定的休眠时间要长一些。

作业③

1.实验内容

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

2.心得体会

(1)开通MapReduce服务

  • 购买集群,选择自定义购买并进行硬件配置和高级配置。

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

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

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

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

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

  • 对弹性公网进行设置并购买2个公网IP

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

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

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

  • 回到mrs集群页面点击节点管理绑定公网IP并进入安全组进行一键放通

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

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

  • 进入Manager设置访问MRS Manager界面的公网IP

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

  • 进行用户登录

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

(2)任务一:Python脚本生成测试数据

  • 使用Xshell 7连接服务器并设置用户身份验证

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

  • 进入/opt/client/目录,使用vi命令编写Python脚本

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

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

  • 创建目录:使用mkdir命令在/tmp下创建目录flume_spooldir,把Python脚本模拟生成的数据放到此目录下,后面Flume就监控这个文件下的目录,以读取数据。

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

  • 测试执行:执行Python命令测试生成100条数据并查看数据

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

(3)配置Kafka

  • 设置环境变量,执行source命令,使变量生效

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

  • 在kafka中创建topic,注意要用实际Zookeeper的IP

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

  • 查看topic信息

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

(4)安装Flume客户端

  • 进入MRS Manager集群管理界面,打开服务管理,点击flume,进入Flume服务然后点击下载客户端

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

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

  • 解压下载的flume客户端文件

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

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

  • 校验文件包

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

  • 解压“MRS_Flume_ClientConfig.tar”文件

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

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

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

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

  • 解压Flume客户端

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

  • 安装Flume客户端:安装Flume到新目录”/opt/FlumeClient”,安装时自动生成目录

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

  • 重启Flume服务

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

(5)配置Flume采集数据

  • 修改配置文件,在conf目录下编辑文件properties.properties

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

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

  • source环境变量

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

  • 创建消费者消费kafka中的数据

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

(6)实验心得:本次作业学会了用Flume进行实时流前端数据采集,也是第一次接触华为云平台,学习到很多新的东西。虽然刚开始操作不是很熟练,但是收获颇多,经过后面的学习会越来越好。


程序员灯塔
转载请注明原文链接:数据采集与融合技术第五次大作业
喜欢 (0)