-
要求:
- 熟练掌握 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.心得体会
-
之前使用Selenium框架爬取时,都是先找到搜索框输入内容, 然后再找到搜索按钮模拟点击,通过这题复现,发现了可以直接模拟键盘回车
keyinput.send_keys(Keys.ENTER)来达到同样的效果,真是神来之笔。 -
本题在对品牌进行提取时,仍然还存在一些不相关的词汇(如下图所示),还需要进一步处理,比如进入商品详情页爬取品牌(会非常耗时间)。
作业②:
-
要求:
- 熟练掌握 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进行实时流前端数据采集,方便为之后数据处理和数据的可视化,是实时流场景数据流通的部分工作。
通过本章实验的学习,我能够部分掌握实时场景下,大数据的数据采集能力。