吃西瓜不吐葡萄皮

导航

第五次大作业

第五次作业

  • 作业①

    要求

    • 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。

    • 使用Selenium框架爬取京东商城某类商品信息及图片。

候选网站:http://www.jd.com/

码云地址:https://gitee.com/eat-watermelon-bu/crawl_project/tree/master/%E7%AC%AC%E4%BA%94%E6%AC%A1%E5%A4%A7%E4%BD%9C%E4%B8%9A/%E4%BD%9C%E4%B8%9A%E4%B8%80

 

 

 

思路

复现书本代码,更改一些参数

核心代码:

 

# 下载图片到本地
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)

 

    # 页面提取
   def processSpider(self):
       # 用于控制爬取页面的数量
       if self.page > 3:
           return
       # 用于控制爬取数据项的数量
       if self.count > 108:
           return
       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:
               # 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 = ""
               self.No = self.No + 1
               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)
               # 用来控制爬取的项目数量,限制在108项
               self.count += 1
               if self.count > 108:
                   return
           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()
               # 用来限制爬取的页面数,限制在3页以内
               self.page += 1
               if self.page <=3:
                   self.processSpider()
               else:
                   return
       except Exception as err:
               print(err)

结果截图

 控制台

 

 

 

 数据库

 

 图片

 

 

 

 

 

心得

复现课件的代码,熟悉的selenium的操作,学习了代码规范性

 

 

  • 作业二

    要求:

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

    HTML元素等内容。

    • 使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、教学

      进度、课程状态,课程图片地址),同时存储图片到本地项目根目录下的imgs文件夹

      中,图片的名称用课程名来存储。

     

候选网站:中国mooc网:https://www.icourse163.org

思路

步骤分为登录和爬取,主要难点在登录,模拟人的操作,一个一个按键进行点击,输入账号密码,进入个人中心

 码云:https://gitee.com/eat-watermelon-bu/crawl_project/tree/master/%E7%AC%AC%E4%BA%94%E6%AC%A1%E5%A4%A7%E4%BD%9C%E4%B8%9A/%E4%BD%9C%E4%B8%9A%E4%BA%8C

登录函数

# 负责登录到个人课程页面
def login(self,url):

   personal_id = input("Input your ID:")# mooc网账号
   print()
   personal_pwd = input("Input your password:")# mooc网密码
   try:
       self.browser.get(url)
       time.sleep(3)  # 停顿一秒
       #                                   //*[@id="app"]/div/div/div[1]/div[3]/div[3]/div
       self.browser.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div').click()
       # 点击登录按钮
       time.sleep(3)  # 停顿一秒
       #                             //*[@id="auto-id-1637753632245"]/div/div/div/div[2]/span
       self.browser.find_element_by_xpath('//div/div/div/div[@class="ux-login-set-scan-code_ft"]/span').click()
       # 点击其他登录方式
       time.sleep(1)  # 停顿一秒
       self.browser.find_element_by_xpath('//div[@class="zcnt"]//div[@class="mooc-login-set"]//ul[@class="ux-tabs-underline_hd"]/li[2]').click()
       # 点击手机号登录
       time.sleep(1)  # 停顿一秒
       self.browser.switch_to.frame(self.browser.find_elements_by_tag_name("iframe")[1])
       # 跳转手机登录界面
       time.sleep(1)  # 停顿一秒
       self.browser.find_element_by_xpath('//input[@placeholder="请输入手机号"]').send_keys(personal_id)
       self.browser.find_element_by_xpath('//input[@placeholder="请输入密码"]').send_keys(personal_pwd)
       # 输入登录信息
       time.sleep(1)  # 停顿一秒
       self.browser.find_element_by_xpath('//*[@id="submitBtn"]').click()
       # 点击登录
       time.sleep(5)  # 停顿五秒,登录进去后
       self.browser.find_element_by_xpath('//*[@id="privacy-ok"]').click()  # 点击“我的课程”这个按钮
       time.sleep(1)  # 停顿一秒
       self.browser.find_element_by_xpath('//*[@id="app"]/div/div/div[1]/div[3]/div[4]/div').click()
       time.sleep(1)


   except Exception as err:
       print(err)

数据获取函数

def get_data(self):
   names = self.browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="text"]/span[2]')
   names = [item.text for item in names]
   schools = self.browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="school"]/a')
   schools = [item.text for item in schools]
   status = self.browser.find_elements_by_xpath('//div[@class="personal-info"]//div[@class="text"]/a/span')
   status = [item.text for item in status]
   endings = self.browser.find_elements_by_xpath('//div[@class="personal-info"]//div[@class="course-status"]')
   endings = [item.text for item in endings]
   img_urls = self.browser.find_elements_by_xpath('//div[@class="course-card-wrapper"]//div[@class="img"]/img')
   img_urls = [item.get_attribute('src') for item in img_urls]
   for i in range(len(names)):
       print(names[i])
       print(schools[i])
       print(status[i])
       print(endings[i])
       print(img_urls[i])
       filename = 'coursesPic'
# 将指定url的图片下载到文件夹中
       self.downloadPic(filename,img_urls[i],self.cid)
# 插入到数据库
       self.insertDB(self.cid,names[i],schools[i],
                     status[i],endings[i],img_urls[i])
       self.cid += 1
       # 提交插入操作
       self.commitDB()
       print("Data item inserted successfully")
       print('*'*80)

翻页函数

def turn_page(self):
   try:
       # 等待翻页按钮出现再点击
       self.wait.until(EC.element_to_be_clickable((By.XPATH,'//li[@class="ux-pager_btn ux-pager_btn__next"]/a'))).click()
       time.sleep(1)
   except Exception as err:
       print(err)

 

 

将登录和数据获取封装到spider函数

def spider(self,url):
   self.login(url)
   self.openDB()
   self.createTable()

   self.get_data()  # 获取我的课程的数据
   for i in range(self.page_num - 1):# 控制翻页数量
       self.turn_page()
       self.get_data()  # 获取我的课程的数据
   self.closeDB()

结果截图

 控制台

 

 数据库

 

 图片

 

 

 

心得

熟悉了对AJAX网页模拟登录的方法,进一步熟悉了selenium的用法

  • 作业③

要求:

  • 理解Flume架构和关键特性,掌握使用Flume完成日志采集任务。

  • 完成Flume日志采集实验,包含以下步骤:

    任务一:开通MapReduce服务

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

    任务三:配置Kafka

    任务四:安装Flume客户端

    任务五:配置Flume采集数据

 

  • 任务一:开通MapReduce服务

    访问MRS manager

     

 

 

   配置完毕

 

 

 

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

    通过xftp 将脚本上传到/opt/client下

 

 

 

      通过shell查看上传的结果

 

     运行结果

 

 

  • 任务三:配置Kafka

    设置环境变量

 

 

 

   在Kafka中创建topic

 

 

 

   查看topic

 

 

 

  • 任务四:安装Flume客户端

    客户端安装成功

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

    创建Kafka数据

 

 

 

   最终结果

 

 

 

心得

最大的收获是第一次尝试着去使用云服务器,对云服务器的使用有了一定的了解,并且了解到大数据的一些工具使用。

 

 

posted on 2021-11-26 22:15  吃西瓜不吐葡萄皮  阅读(7)  评论(0编辑  收藏  举报