• 要求:

    • 熟练掌握 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.思路及代码

1.1 代码链接:

5/01.py · 数据采集与融合 - 码云 - 开源中国 (gitee.com)

1.2 网页分析及关键代码:

由于采用的是Selenium框架模拟真人操作访问网站,所以先找到搜索框,可以通过id='key'来查找

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

keyinput = self.driver.find_element_by_id("key")

然后再键入我们要搜索的关键词,直接模拟键盘回车进行搜索,跳转到相应页面, 就不需要进行查找搜索按钮和点击按钮的操作

keyinput.send_keys(key)
keyinput.send_keys(Keys.ENTER)

由于页面加载需要时间,所以先暂停10秒钟等待页面加载,此外在很多地方都需要进行sleep操作

time.sleep(10)

分析商品页面可知,每个商品项都在一个li标签下,所以先定位li标签

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

然后解析每个li标签的内容,提取出标题、图片、价格,其中,品牌一般来说是标题的第一个词,所以可以用split提取

for li in lis:
    time.sleep(1)
    try:
        src1 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("src")
        time.sleep(1)
    except:
        src1 = ""
    try:
        src2 = li.find_element_by_xpath(".//div[@class='p-img']//a//img").get_attribute("data-lazy-img")
        time.sleep(1)
    except:
        src2 = ""
    try:
        price = li.find_element_by_xpath(".//div[@class='p-price']//i").text
        time.sleep(1)
    except:
        price = "0"

    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(",", "")

处理图片链接

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.downloadDB, args=(src1, src2, mFile))
    T.setDaemon(False)
    T.start()
    self.threads.append(T)
else:
    mFile = ""

插入数据库

sql = "insert into phones (mNo,mMark,mPrice,mNote,mFile) values (?,?,?,?,?)"
self.cursor.execute(sql, (mNo, mMark, mPrice, mNote, mFile))

1.3 结果

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

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

2.心得体会

  1. 之前使用Selenium框架爬取时,都是先找到搜索框输入内容, 然后再找到搜索按钮模拟点击,通过这题复现,发现了可以直接模拟键盘回车keyinput.send_keys(Keys.ENTER)来达到同样的效果,真是神来之笔。

  2. 本题在对品牌进行提取时,仍然还存在一些不相关的词汇(如下图所示),还需要进一步处理,比如进入商品详情页爬取品牌(会非常耗时间)。

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

作业②:

  • 要求:

    • 熟练掌握 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......

1.思路及代码

1.1 代码链接:

5/02.py · 数据采集与融合 - 码云 - 开源中国 (gitee.com)

1.2 网页分析及关键代码:

启动驱动器,发送请求

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import pymysql

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

要爬取个人的课程信息,首先要先登录,由于输入密码登录还是要手动输入验证码,所以直接选择扫码登录比较简便。

首先要找到登录按钮

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

定位登录按钮并且点击,然后等待扫码登录

driver.find_element(By.XPATH, "//div[@class='unlogin']").click()
time.sleep(20)  # 等待扫码登录

【数据采集与融合技术】 第五次大作业登录成功后,定位到个人中心的按钮,模拟点击进行跳转

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

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

每门课程都在一个div标签下,在div标签下可以查看到我们需要爬取的所有信息

title = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="body"]//span[@class="text"]')
school = driver.find_elements(By.XPATH,'//div[@class="course-card-wrapper"]//div[@class="body"]//div[@class="school"]/a')
learn = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="body"]//div['
                                       '@class="personal-info"]//span[@class="course-progress-text-span"]')
status = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="body"]//div[@class="course-status"]')
url = driver.find_elements(By.XPATH, '//div[@class="course-card-wrapper"]//div[@class="img"]/img')

最后将结果存入数据库

con = pymysql.connect(host='localhost', user='root', password='123456', charset="utf8", database='DATA_acquisition')
cursor = con.cursor()
for i in range(len(title)):
    cursor.execute("insert into mooc values(%s,%s,%s,%s,%s)", (title[i].text, school[i].text, learn[i].text, status[i].text, url[i].get_attribute('src')))
con.commit()

从数据库读取课程名和图片地址,进行多线程下载

cursor.execute("SELECT url,name FROM mooc")
rows = cursor.fetchall()
threads = []
for row in rows:
    T = threading.Thread(target=downloadPic, args=(row[0], row[1]))
    T.setDaemon(False)
    T.start()
    threads.append(T)
for t in threads:
    t.join()

1.3 结果

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

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

2.心得体会

本题我在登录环节困扰许久,一直在尝试让机器自动登录,企图让Selenium 框架自动识别验证码,通过人机验证。不过最终还是用手动扫码登录,Selenium虽然能模拟人的行为,但终究不具备人的智能

作业③:Flume日志采集实验

  • 要求

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

    • 完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。

    • 环境搭建

      • 任务一:开通MapReduce服务
    • 实时分析开发实战:

      • 任务一:Python脚本生成测试数据
      • 任务二:配置Kafka
      • 任务三:安装Flume客户端
      • 任务四:配置Flume采集数据

1.步骤

  • 任务一:Python脚本生成测试数据
    【数据采集与融合技术】 第五次大作业

  • 任务二:配置Kafka
    【数据采集与融合技术】 第五次大作业

  • 任务三:安装Flume客户端
    【数据采集与融合技术】 第五次大作业

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

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

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

2.心得体会

学会了如何使用Flume进行实时流前端数据采集,方便为之后数据处理和数据的可视化,是实时流场景数据流通的部分工作。

通过本章实验的学习,我能够部分掌握实时场景下,大数据的数据采集能力。

相关文章: