数据采集技术第五次作业

作业①:

题目:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。使用Selenium框架爬取京东商城某类商品信息及图片。

候选网站:京东网,关键词自由选择。

输出信息:

mNo mMark mPrice mNote mFile
000001

三星Galaxy

9199.00

三星Galaxy Note20 Ultra 5G...

000001.jpg

000002 …… …… …… ……

完整代码:码云作业1

1.解题过程:

本题选择的关键词为:羽绒服

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)

创建数据库

try:
    self.con = sqlite3.connect("clothes.db")
    self.cursor = self.con.cursor()
    try:
        self.cursor.execute("drop table clothes")
    except:
        pass
    try:
        sql = "create  table  clothes(序号 varchar(32) primary key, 商品 varchar(256),价格 varchar(32),商店 varchar(256),图片 varchar(256))"
        self.cursor.execute(sql)
    except:
        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)

1.2查看网站信息,编写爬取代码。

可见商品在每个li中:

lis =self.driver.find_elements_by_xpath("//div[@id='J_goodsList']//li[@class='gl-item']")

爬取各列信息

for li in lis:
    try:#爬取价格
        price = li.find_element_by_xpath(".//div[@class='p-price']//i").text
    except:
        price = "0"
    try:#爬取商店
        shop = li.find_element_by_xpath(".//div[@class='p-shop']//a").text
    except:
        shop = ""
    try:#爬取商品
        name = li.find_element_by_xpath(".//div[@class='p-name p-name-type-2']//em").text
    except:
        name = ""
    self.No = self.No + 1#记录序号
    # if self.No > 139:
    #     self.closeUp()#页数过多,取了前139张
    no = str(self.No)
    while len(no) < 6:
        no = "0" + no

爬取图片信息

try:#在属性src中
    src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("src")
except:
    src1 = ""
try:#在属性data-lazy-img中
    src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img")
except:
    src2 = ""
    
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 = ""

翻页操作

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

1.3插入函数

    def insertDB(self, No, name, Price, shop, File):
        try:
            sql = "insert into clothes(序号,商品,价格,商店,图片) values (?,?,?,?,?)"
            self.cursor.execute(sql, (No, name, Price, shop, File))
        except Exception as err:
            print(err)

1.4图片下载函数

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:
            fobj = open(MySpider.imagePath + "\\" + mFile, "wb")#下载图片路径
            fobj.write(data)
            fobj.close()

1.5退出函数

    def closeUp(self):
        try:
            self.con.commit()
            self.con.close()
            self.driver.close()
        except Exception as err:
            print(err);

1.6输出结果:(每类股票爬取139个)

 2.心得体会:

此题为复现题目,完成过程中我进一步了解了selenium和xpath的使用,并通过修改查找的关键词更加体会到了它的魅力。

 

作业②:

题目:熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。

           使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、教学进度、课程状态,课程图片地址),同时存储图片到本地项目根目录下的imgs文件夹中,图片的名称用课程名来存储。

候选网站中国mooc网

输出信息:

Id cCourse cCollege cSchedule cCourseStatus

cImgUr

1

Python网络爬虫与信息提取

北京理工大学

已学3/18课时

2021年5月18日已结束

http://eduimage.nosdn.127.net/C0AB6

FA791150F0DFC0946B9A01C8CB2.jpg

2 …… …… …… …… ……

完整代码:码云作业2

1.解题过程:

 1.1设置启动chrome可见

driver = webdriver.Chrome()

 请求url

driver.get("https://www.icourse163.org/")

使页面呈现为最大的形式

driver.maximize_window()

1.2登录/注册

driver.find_element_by_xpath("//a[@class='f-f0 navLoginBtn']").click()

点击其他登录方式

driver.find_element_by_xpath("//div[@class='ux-login-set-scan-code_ft']//span[@class='ux-login-set-scan-code_ft_back']").click() # 选择另一种方式登录
time.sleep(1)

选择手机号登录方式

driver.find_elements_by_xpath("//ul[@class='ux-tabs-underline_hd']//li")[1].click()
time.sleep(1)
temp_iframe_id = driver.find_elements_by_tag_name('iframe')[1].get_attribute('id')
driver.switch_to.frame(temp_iframe_id)

登录部分

driver.find_element_by_xpath("//input[@type='tel']").send_keys('15224730327')
time.sleep(2)#手机号登录
driver.find_element_by_xpath("//input[@class='j-inputtext dlemail']").send_keys('yuminihao999!')
time.sleep(2)#密码
driver.find_element_by_xpath("//a[@class='u-loginbtn btncolor tabfocus']").click()
time.sleep(2)#点击登录

点击个人中心

driver.find_element_by_xpath("//div[@class='u-navLogin-myCourse-t']").click()
time.sleep(2)

1.3创建数据库

try:
    con = sqlite3.connect("mooc.db")#连接数据库
    cursor = con.cursor()
    try:
        cursor.execute("drop table mooc")
    except:
        pass
    try:#创建数据库
        sql = "create  table  mooc(序号 varchar(32) primary key,名称 varchar(16),课程 varchar(32),课时 varchar(12),状态 varchar(12),图片 varchar(256))"
        cursor.execute(sql)
    except:
        pass
except Exception as err:
    print(err)

1.4爬取信息

for link in driver.find_elements_by_xpath("//div[@class='course-card-wrapper']"):

name = link.find_element_by_xpath('.//span[@class="text"]').text# 课程名称
school = link.find_element_by_xpath(".//div[@class='school']//a").text# 开设学校
schedule=link.find_element_by_xpath(".//div[@class='status']//span").text# 教学进度
status=link.find_element_by_xpath(".//div[@class='course-status']").text# 课程状态
imgUrl=link.find_element_by_xpath(".//div[@class='img']/img").get_attribute("src")# 图片地址
urllib.request.urlretrieve(imgUrl, 'E:\爬取图片\\' + str(no)+'.jpg')  # 下载图片

1.5插入操作

    try:
        cursor.execute("insert into mooc(序号,名称,课程,课时,状态,图片) values (?,?,?,?,?,?)",
                (str(no), name, school,schedule,status,imgUrl))
    except Exception as err:
        print(err)

 1.6关闭操作

con.commit()
con.close()
driver.close()

1.7 输出信息:

 2.心得体会

通过此实验更加熟悉了selenium的相关操作,同时执行代码过程中设置chrome可见可以很容易看到哪里出现了问题。

问题:

在搜索登录密码的位置时,最开始我的查找语句是

driver.find_element_by_xpath("//input[@type='password']").send_keys('yuminihao999!')

但是执行时出错了。

解决:经过检查发现 [@type='password'] 并不是唯一的,后来修改为其相应的class属性。

反思:这样的问题不是第一次出现了,所以在编写查找语句时一定要细心筛选最简便准确的。

 

作业③:

题目:理解Flume架构和关键特性,掌握使用Flume完成日志采集任务。完成Flume日志采集实验,包含以下步骤:

任务一:开通MapReduce服务(过程略)

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

步骤 1:编写Python脚本,使用Xshell 7连接服务器

进入/opt/client/目录,用xftp7将本地的autodatapython.py文件上传至服务器/opt/client/目录下即可

步骤 2:创建目录

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

步骤三:测试执行

执行Python命令,测试生成100条数据

查看数据

任务三:配置Kafka

步骤 1:设置环境变量

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

步骤 2:在kafka中创建topic

步骤 3:查看topic信息

任务四:安装Flume客户端

步骤 1:打开flume服务界面

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

步骤 2:解压下载的flume客户端文件

使用Xshell7登录到上步中的弹性服务器上,进入/tmp/MRS-client目录

执行以下命令,解压压缩包获取校验文件与客户端配置包

步骤 3:校验文件包

步骤 4:解压“MRS_Flume_ClientConfig.tar”文件

步骤 5:安装Flume环境变量

执行以下命令,安装客户端运行环境到新的目录“/opt/Flumeenv”,安装时自动生成目录。

查看安装输出信息,如有以下结果表示客户端运行环境安装成功:

配置环境变量,执行命令:

步骤 6:解压Flume客户端

步骤 7:安装Flume客户端

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

步骤 8:重启Flume服务

任务五:配置Flume采集数据

步骤 1:修改配置文件,进入Flume安装目录,在conf目录下编辑文件properties.properties(同样是建议把内容复制到本地文件,修改ip地址后用Xshell上传到服务器,而不是直接vi/vim往里面复制。)

步骤 2:创建消费者消费kafka中的数据(记得改完配置文件要用source命令使其生效)

然后执行命令

执行完毕后,在新开一个Xshell 7窗口执行2.2.1步骤三的Python脚本命令,再生成一份数据,查看Kafka中是否有数据产生,可以看到,已经消费出数据了:

有数据产生,表明Flume到Kafka目前是打通的。测试完毕可以关闭Kafka的消费者窗口了。

心得体会:

        通过此次实验我初步了解了华为云,它主要介绍如何使用Flume进行实时流前端数据采集,便于之后的数据处理和可视化,是实时流场景数据流通的部分工作。

posted @ 2021-11-26 19:44  R-zhang  阅读(36)  评论(0编辑  收藏  举报