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

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

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

「数据采集」实验五

一、作业①

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......

1.2 代码及思路

5/5-1.py · 灰色/2019级数据采集与融合技术 - 码云 - 开源中国 (gitee.com)

1.2.1 预先准备

首先登录一次www.jd.com,并用浏览器的F12功能抓包服务器发回的信息,保存其中的cookies为jd_cookies用于模拟登录使用

由于保存下来的cookies是一大段字符串,因此编写getCookies函数将其转为字典

def getCookies(ck):
    manual_cookies = {}
    cookies_txt = ck.read().strip(';')  # 读取文本内容
    # 手动分割添加cookie
    for item in cookies_txt.split(';'):
        name, value = item.strip().split('=', 1)  # 用=号分割,分割1次
        manual_cookies[name] = value  # 为字典cookies添加内容
    return manual_cookies

1.2.2 配置模拟chrome浏览器的相关设置

#设置启动时浏览器不可见
from selenium.webdriver.common.by import By

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

1.2.3 创建浏览器并模拟登录

用deiver.add_cookie方法可以使模拟浏览器的请求带上cookies,同时也可以配置头文件

#创建chrome浏览器
driver= webdriver.Chrome() #不带参数显式地展示爬取过程
#用cookies模拟登录
jd_cookies=open("jd_cookies.txt",'r',encoding='utf-8')
cookies=getCookies(jd_cookies)
jd_cookies.close()
for key in cookies.keys():
    driver.add_cookie
    (
        {
        'domain': '.jd.com',  # 此处xxx.com前,需要带点
        'name': key,
        'value': cookies[key],
        'path': '/',
        'expires': None
        }
    )

1.2.4 访问要搜索的页面

首先用Xpath-helper找到输入框,用send_keys()方法模拟键盘键入关键词。再用click()方法模拟对【搜索】按钮的点击,其中time.sleep(2)

是为了让跳转后的页面加载完成在进行爬取。

#使用driver.get(url)方法访问网页
url="https://www.jd.com/"
driver.get(url)
time.sleep(2)

#跳转到要搜索的页面
search=driver.find_element(By.XPATH, "//input[@id='key']")
search.send_keys("显卡")
driver.find_element(By.XPATH, '//*[@id="search"]/div/div[2]/button').click()
time.sleep(2)

1.2.5 编写数据库类

class SPDB:
    def openDB(self):
        self.con=sqlite3.connect("sp.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table sp (id varchar(8),sMark varchar(16),sPrice varchar(16),"
                                "sNote varchar(32),sFile varchar(128))")
        except:
            self.cursor.execute("delete from sp")

    def closeDB(self):
        self.con.commit()
        self.con.close()

    def insert(self, var1,var2,var3,var4,var5):
        try:
            self.cursor.execute("insert into sp (id, sMark, sPrice, sNOte, sFile) values (?,?,?,?,?)",
                                (var1,var2,var3,var4,var5))
        except Exception as err:
            print(err)

1.2.6 爬取三页商品信息

#开始爬取:共爬取三页
db=SPDB()
db.openDB()
cnt=1
for i in range(2):
    goodsList=driver.find_elements(By.XPATH, "//div[@class='gl-i-wrap']")
    for j in goodsList:
        name=j.find_element(By.XPATH, "./div[@class='p-name p-name-type-2']/a/em")
        sMark=name.text.split()[0]
        sNote=name.text
        sPrice=j.find_element(By.XPATH, "./div[@class='p-price']/strong/i").text
        sFile=j.find_element(By.XPATH,"./div[@class='p-img']/a/img").get_attribute('src')
        #print(cnt,sMark,sPrice,sNote,sFile)
        db.insert(cnt,sMark,sPrice,sNote,sFile)
        cnt+=1
    if i!=0:
        #点击下一页
        driver.find_element(By.XPATH, "//div[@id='J_bottomPage']/span[@class='p-num']/a[@class='pn-next']/em").click()
db.closeDB()

1.3 运行结果

1.4 心得体会

●善用time.sleep(),有时候爬取的 太快页面还没加载完成会爬取出错误的结果

●模拟登录用模拟输入账号密码会过不了人机验证,用cookies即可

●京东商城一页的商品要用模拟滑动条下拉才能显示完全,但因为技术问题暂未实现

二、作业②

2.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......

2.2 思路及代码

5/5-2.py · 灰色/2019级数据采集与融合技术 - 码云 - 开源中国 (gitee.com)

2.2.1 预先准备

进入中国慕课网,点击【登录|注册】扫码登陆后点击【个人中心】,即可看到自己所选的全部课程。每个课程有【课程名字】、【开课院校】、【目前学时】、【课程状态】四个信息,再加上课程图标url链接,作为爬取的目标属性,即表头。

2.2.2 配置模拟chrome浏览器的相关设置

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')

2.2.3 创建浏览器并模拟登录

这里采用点击登录按钮后,使用time.sleep(10)等待一段时间用手机扫码人工登录实现登录功能,自动化程度不足

#创建chrome浏览器
driver= webdriver.Chrome()

#使用driver.get(url)方法访问网页
url="https://www.icourse163.org/"
driver.get(url)
time.sleep(2)

driver.find_element(By.XPATH,"//div[@class='unlogin']/a").click()
time.sleep(5)
driver.find_element(By.XPATH,"//div[@class='ga-click u-navLogin-myCourse u-navLogin-center-container']/a").click()
time.sleep(5)

2.2.4 数据库类

class SPDB:
    def openDB(self):
        self.con=sqlite3.connect("sp.db")
        self.cursor=self.con.cursor()
        try:
            self.cursor.execute("create table sp (id varchar(8),sMark varchar(16),sPrice varchar(16),"
                                "sNote varchar(32),sFile varchar(128))")
        except:
            self.cursor.execute("delete from sp")

    def closeDB(self):
        self.con.commit()
        self.con.close()

    def insert(self, var1,var2,var3,var4,var5):
        try:
            self.cursor.execute("insert into sp (id, sMark, sPrice, sNOte, sFile) values (?,?,?,?,?)",
                                (var1,var2,var3,var4,var5))
        except Exception as err:
            print(err)

2.2.5 开始爬取

sp=SPDB()
sp.openDB()
#开始爬取
courses=driver.find_elements(By.XPATH,'//div[@class="course-card-wrapper"]')
for course in courses:
    name=course.find_element(By.XPATH,".//span[@class='text']").text
    college=course.find_element(By.XPATH,".//div[@class='school']/a").text
    schedule=course.find_element(By.XPATH, ".//a/span[@class='course-progress-text-span']").text
    status=course.find_element(By.XPATH, ".//div[@class='course-status']").text
    src=course.find_element(By.XPATH, ".//div[@class='img']/img").get_attribute("src")
    sp.insert(name,college,schedule,status,src)

sp.closeDB()

2.3 运行结果

2.4 心得体会

●有的网站难以绕过人机验证,实验人工的方式辅助爬取也是可行的

●爬取前先观察页面元素的Xpath结构可以让爬取事半功倍

三、作业②

3.1 题目

  • 要求:

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

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

3.2 代码及思路

​ 无

3.3 运行结果

环境搭建:

任务一:开通MapReduce服务

实时分析开发实战

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

1、使用Xshell 7连接服务器,进入/opt/client/目录,用xftp7将本地的autodatapython.py文件上传至服务器/opt/client/目录下。
2、创建目录,使用mkdir命令在/tmp下创建目录flume_spooldir,我们把Python脚本模拟生成的数据放到此目录下,后面Flume就监控这个文件下的目录,以读取数据。
3、测试执行,执行Python命令,测试生成100条数据,查看数据。

任务二:配置Kafka

1、设置环境变量,执行source命令,使变量生效
2、在kafka中创建topic
3、查看topic信息

任务四:安装Flume客户端

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

2、解压下载的flume客户端文件。使用Xshell7登录到上步中的弹性服务器上,进入/tmp/MRS-client目录,解压压缩包获取校验文件与客户端配置包,校验文件包,解压“MRS_Flume_ClientConfig.tar”文件。

3、安装客户端运行环境到新的目录“/opt/Flumeenv”,安装时自动生成目录。查看安装输出信息,如有以下结果表示客户端运行环境安装成功

4、配置环境变量,解压Flume客户端

5、安装Flume到新目录”/opt/FlumeClient”,安装时自动生成目录

任务五:配置Flume采集数据

1、修改配置文件,创建消费者消费kafka中的数据。执行完毕后,在新开一个Xshell 7窗口(右键相应会话-->在右选项卡组中打开),执行2.2.1步骤三的Python脚本命令,再生成一份数据,查看Kafka中是否有数据产生,可以看到,已经消费出数据了:

3.4 心得体会

本次实验作业完成了Flume环境的配置,方便数据处理以及相关可视化。实现了Mapreduce流式计算环境的搭建,在大数据时代增强了处理数据,获取数据的能力。

posted @ 2021-11-24 23:08  暴走小铸币  阅读(38)  评论(0编辑  收藏  举报