[数据采集]实验五

作业①

1.1题目

完整代码

  • 要求:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
  • 使用Selenium框架爬取京东商城某类商品信息及图片。
  • 输出信息:
mNo mMark mPrice mNote mFile
000001 三星Galaxy 9199.00 三星Galaxy Note20 Ultra 5G... 000001.jpg
000002 ......

1.2实现过程

1、初始化Chrome browser

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

2、启动driver访问网站

url = "http://www.jd.com"
spider = MySpider()
while True:
    print("1.爬取")
    print("2.显示")
    print("3.退出")
    s = input("请选择(1,2,3):")
    if s == "1":
        spider.executeSpider(url, "手机")
        continue
    elif s == "2":
        spider.showDB()
        continue
    elif s == "3":
        break

3、爬取网页内容

  • 商品信息
lis =self.driver.find_elements_by_xpath("//div[@id='J_goodsList']//li[@class='gl-item']")
for li in lis:
    # 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 = ""
  • 下载图片
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)

4、翻页处理

# 取下一页的数据,直到指定页数
if(self.pages<20):
     self.pages+=1
     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(1)
            nextPage.click()
            self.processSpider()

5、保存数据到数据库

  • 创建表phones.db
self.con = sqlite3.connect("phones.db")
self.cursor = self.con.cursor()
try:
     # 如果有表就删除
     self.cursor.execute("drop table phones")
except:
     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:
     pass
  • 插入数据到phones.db
def insertDB(self, mNo, mMark, mPrice, mNote, mFile):
        try:
            sql = "insert into phones (mNo,mMark,mPrice,mNote,mFile) values (?,?,?,?,?)"
            self.cursor.execute(sql, (mNo, mMark, mPrice, mNote, mFile))
        except Exception as err:
            print(err)

1.3输出结果

  • MySQL数据库存储结果如下:

  • 下载图片到文件夹结果

作业②

2.1题目

完整代码

  • 要求:熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待
    HTML元素等内容。
  • 使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、教学进度、课程状态,课程图片地址),同时存储图片到本地项目根目录下的imgs文件夹
    中,图片的名称用课程名来存储。
  • 输出信息
Id cCourse cCollege cSchedule cCourseStatus cImgUrl
1 Python网络爬虫与信息提取 北京理工大学 已学3/18课时 2021年5月18日已结束 http://edu-image.nosdn.127.net/C0AB6FA791150F0DFC0946B9A01C8CB2.jpg
2 ......

2.2实现过程

2.2.1 观察html源代码
  • 可以看到全部课程信息都存放在一个<div class="course-panel-body-wrapper">标签

  • 接着观察<div class="course-card-wrapper">标签中每个课程的内容,得到对应的信息

2.2.2 代码实现

1、初始化Chrome browser

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

2、启动driver访问网站

url = "https://www.icourse163.org/"
spider = MySpider()
while True:
    print("1.爬取")
    print("2.显示")
    print("3.退出")
    s = input("请选择(1,2,3):")
    if s == "1":
        spider.executeSpider(url)
        continue
    elif s == "2":
        spider.showDB()
        continue
    elif s == "3":
        break

3、找到登录按钮并点击,等待手动扫码登录

self.driver.get(url)
wait = WebDriverWait(self.driver, 10)
login =wait.until(  # 登录按钮
       EC.element_to_be_clickable((By.XPATH, '//*[@class="f-f0 navLoginBtn"]'))
)
login.click()       # 点击登录按钮
time.sleep(10)      # 等待扫码登录

4、进入个人中心

myclass = wait.until(  # 个人中心
            EC.element_to_be_clickable((By.XPATH, '//*[@id="j-indexNav-bar"]/div/div/div/div/div[7]/div[3]/div/div/a/span'))
        )
myclass.click()        # 点击进入个人中心

5、使用Xpath获取信息

divs =self.driver.find_elements_by_xpath('//*[@id="j-coursewrap"]/div/div[1]/div')
print(len(divs))
for i in range(len(divs)):
     div = divs[i]
     try:
          cCourse = div.find_element_by_xpath('./div/a/div[2]/div/div/div/span[2]').text
          cCollege = div.find_element_by_xpath('./div/a/div[2]/div/div[2]/a').text
          cSchedule = div.find_element_by_xpath('./div[1]/a/div[2]/div[2]/div[1]/div[1]/div[1]/a/span').text
          cCourseStatus = div.find_element_by_xpath('./div[1]/a/div[2]/div[2]/div[2]').text
          cImgUrl = div.find_element_by_xpath('./div[1]/a/div[1]/img').get_attribute('src')

6、保存结果

  • 保存数据到数据库

连接数据库,新建表:

self.con = sqlite3.connect(MySpider.dbPath)
self.cursor = self.con.cursor()
try:
      # 如果有表就删除
      self.cursor.execute("drop table courses")
except:
       pass
try:
       # 建立新的表
       sql = "create  table  courses  (id int primary key, cCourse varchar(256),cCollege varchar(32),cSchedule varchar(32),cCourseStatus varchar(32), cImgUrl varchar(256))"
       self.cursor.execute(sql)
except:
       pass

插入数据

def insertDB(self,id,cCourse,cCollege, cSchedule,cCourseStatus, cImgUrl):
       try:
            sql = "insert into courses (id,cCourse,cCollege, cSchedule,cCourseStatus, cImgUrl) values (?,?,?,?,?,?)"
            self.cursor.execute(sql, (id,cCourse,cCollege, cSchedule,cCourseStatus, cImgUrl))
       except Exception as err:
            print(err)
  • 下载图片到imgs文件夹
def download(self,url, count):
      try:
            path = r"D:/第五次作业/imgs/"  # 图片保存路径
            img_url = url  # 图片下载路径
            new_path = path + str(count) + ".jpg"  # 图片存放路径
            urllib.request.urlretrieve(img_url, new_path)  # 图片存放到本地
            print("downloaded " + str(count) + '.jpg')
      except Exception as err:
            print(err)
T = threading.Thread(target=self.download, args=(cImgUrl,cCourse))
T.setDaemon(False)
T.start()
self.threads.append(T)

2.3输出结果

  • MYSQL数据库存储结果:

  • 下载图片到imgs文件夹结果:

作业③

3.1题目

  • 理解Flume架构和关键特性,掌握使用Flume完成日志采集任务
  • 完成Flume日志采集实验,包含以下步骤:
    任务一:开通MapReduce服务
    任务二:Python脚本生成测试数据
    任务三:配置Kafka
    任务四:安装Flume客户端
    任务五:配置Flume采集数据

3.2实现过程

1、开通MapReduce服务

2、Python脚本生成测试数据
  • 打开Xshell,输入为MRS的Master节点绑定的公网IP,输入用户名和密码登录到MRS服务的Master节点

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

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

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

  • 查看数据

3、配置Kafka
  • 首先设置环境变量,执行source命令,使变量生效
  • 在kafka中创建topic
  • 查看topic信息:
4、安装Flume客户端
  • 进入MRS Manager集群管理界面,打开服务管理,点击flume,进入Flume服务,点击下载客户端

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

  • 校验文件包

  • 解压“MRS_Flume_ClientConfig.tar”文件

  • 安装Flume环境变量

  • 解压Flume客户端

  • 安装Flume客户端

系统显示以下结果表示客户端运行环境安装成功:install flume client successfully

5、配置Flume采集数据
  • 修改配置文件,进入Flume安装目录,在conf目录下编辑文件properties.properties

  • 使用Putty登录Master节点,source环境变量后,执行命令

  • 新开一个Putty窗口,执行上文的Python脚本命令,再生成一份数据

  • 查看Kafka中是否有数据产生

心得体会

  • 巩固了Selenium爬取网页的方法,学习到了如何通过模拟浏览器行为进行翻页、切换页面操作
  • 通过对使用Flume完成日志采集任务的初步实现,了解了什么是Flume以及Flume的适用场景
posted @ 2021-11-24 19:16  penguin02  阅读(45)  评论(0编辑  收藏  举报