作业①
**1)作业要求:
- 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
- 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。
输出信息:
MYSQL数据库存储和输出格式如下,表头应是英文命名例如:序号id,股票代码:bStockNo……,由同学们自行定义设计表头
序号 | 股票代码 | 股票名称 | 最新报价 | 涨跌幅 | 涨跌额 | 成交量 | 成交额 | 振幅 | 最高 | 最低 | 今开 | 昨收 |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 688093 | N世华 | 28.47 | 62.22% | 10.92 | 26.13万 | 7.6亿 | 22.34 | 32.0 | 28.08 | 30.2 | 17.55 |
2 | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
核心代码展示:
def get_stock(url):
service = Service(
executable_path=r"C:\Program Files\Google\Chrome\Application\chromedriver.exe")
driver = webdriver.Chrome(service=service)
driver.get(url)
trs = driver.find_elements(By.XPATH, '//tbody/tr')
stocks = []
for tr in trs:
tds = tr.find_elements(By.XPATH, './td')
td = [x.text for x in tds]
stocks.append(td)
# print(stocks[1])
stockInfo = []
for stock in stocks:
stockInfo.append((stock[0], stock[1], stock[2], stock[4], stock[5], stock[6], stock[7], stock[8], stock[9],
stock[10], stock[11], stock[12], stock[13]))
# print(stockInfo)
for st in stockInfo:
insertDB.openDB()
insertDB.insert(st[0], st[1], st[2], st[3], st[4], st[5], st[6], st[7], st[8], st[9], st[10], st[11], st[12])
insertDB.show()
insertDB.closeDB()
return stockInfo
运行图片展示:
2)心得体会:
这个作业让我对Selenium框架有了更深入的了解,尤其是在处理Ajax网页数据爬取时,我学会了如何有效地等待和查找HTML元素。这种技能对于数据采集来说至关重要,因为它帮助我更精确地定位和提取所需的信息。通过实际操作,我也意识到了代码优化的重要性,以及如何通过合理的结构和注释来提高代码的可读性。
作业②
1)作业要求:
- 熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
- 使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
输出信息:
核心代码展示:
连接mysql
try:
db = pymysql.connect(host='127.0.0.1', user='root', password='216020', port=3306, database='mooc_data')
cursor = db.cursor()
cursor.execute('DROP TABLE IF EXISTS courseMessage')
sql = '''CREATE TABLE courseMessage(cCourse varchar(64),cCollege varchar(64),cTeacher varchar(16),cTeam varchar(256),cCount varchar(16),
cProcess varchar(32),cBrief varchar(2048))'''
cursor.execute(sql)
except Exception as e:
print(e)
爬取一个页面的数据
def spiderOnePage():
time.sleep(3) # 等待页面加载完成
courses = driver.find_elements(By.XPATH, '//*[@id="channel-course-list"]/div/div/div[2]/div[1]/div')
current_window_handle = driver.current_window_handle
for course in courses:
cCourse = course.find_element(By.XPATH, './/h3').text # 课程名
cCollege = course.find_element(By.XPATH, './/p[@class="_2lZi3"]').text # 大学名称
cTeacher = course.find_element(By.XPATH, './/div[@class="_1Zkj9"]').text # 主讲老师
cCount = course.find_element(By.XPATH, './/div[@class="jvxcQ"]/span').text # 参与该课程的人数
cProcess = course.find_element(By.XPATH, './/div[@class="jvxcQ"]/div').text # 课程进展
course.click() # 点击进入课程详情页,在新标签页中打开
Handles = driver.window_handles # 获取当前浏览器的所有页面的句柄
driver.switch_to.window(Handles[1]) # 跳转到新标签页
time.sleep(3) # 等待页面加载完成
# 爬取课程详情数据
cBrief = driver.find_element(By.XPATH, '//*[@id="j-rectxt2"]').text
if len(cBrief) == 0:
cBriefs = driver.find_elements(By.XPATH, '//*[@id="content-section"]/div[4]/div//*')
cBrief = ""
for c in cBriefs:
cBrief += c.text
# 将文本中的引号进行转义处理,防止插入表格时报错
cBrief = cBrief.replace('"', r'\"').replace("'", r"\'")
cBrief = cBrief.strip()
# 爬取老师团队信息
nameList = []
cTeachers = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_con_item"]')
for Teacher in cTeachers:
name = Teacher.find_element(By.XPATH, './/h3[@class="f-fc3"]').text.strip()
nameList.append(name)
# 如果有下一页的标签,就点击它,然后继续爬取
nextButton = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_next f-pa"]')
while len(nextButton) != 0:
nextButton[0].click()
time.sleep(3)
cTeachers = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_con_item"]')
for Teacher in cTeachers:
name = Teacher.find_element(By.XPATH, './/h3[@class="f-fc3"]').text.strip()
nameList.append(name)
nextButton = driver.find_elements(By.XPATH, '//div[@class="um-list-slider_next f-pa"]')
cTeam = ','.join(nameList)
driver.close() # 关闭新标签页
driver.switch_to.window(current_window_handle) # 跳转回原始页面
try:
cursor.execute('INSERT INTO courseMessage VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (
cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief))
db.commit()
except Exception as e:
print(e)
点击登录按钮
WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '//a[@class="f-f0 navLoginBtn"]'))).click()
iframe = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@frameborder="0"]')))
driver.switch_to.frame(iframe)
# 输入账号密码并点击登录按钮
driver.find_element(By.XPATH, '//*[@id="phoneipt"]').send_keys("13559180253") # 你的手机号码
time.sleep(2)
driver.find_element(By.XPATH, '//*[@class="j-inputtext dlemail"]').send_keys("wuyuzi17.") # 你的密码
time.sleep(2)
driver.find_element(By.ID, 'submitBtn').click()
运行图片展示:
2)心得体会:
作业②对我是一个挑战,因为它涉及到模拟用户登录和爬取更为复杂的网页数据。在这个过程中,我不仅提升了自己的技术能力,还学会了如何分析和解决遇到的问题。这次经历让我认识到了耐心和细致的重要性,因为每一个小错误都可能导致整个爬虫的失败。同时,我也体会到了团队合作的价值,因为在遇到困难时,与同学们的讨论和交流常常能带来新的解决方案。
作业③
1)作业要求:
- 掌握大数据相关服务,熟悉Xshell的使用
- 完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
- 环境搭建:
- 任务一:开通MapReduce服务
- 实时分析开发实战:
- 任务一:Python脚本生成测试数据
- 任务二:配置Kafka
- 任务三: 安装Flume客户端
- 任务四:配置Flume采集数据
输出信息:
实验关键步骤或结果截图。
实验图片展示:
开通MapReduce服务
Python脚本生成测试数据
配置Kafka
安装Flume客户端
配置Flume采集数据
2)心得体会:
任这个作业让我对大数据服务有了更加实际的认识,尤其是在使用Xshell进行操作时,我学会了如何搭建和管理MapReduce服务。这个过程中,我不仅对大数据的实时分析处理有了更深的理解,还掌握了如何配置Kafka和Flume来实现数据的高效采集和传输。这些技能对于处理大规模数据流至关重要。通过实验手册的指导,我逐步完成了各个任务。这次任务不仅提升了我的技术能力,也让我对大数据技术的实际应用有了更加全面的认识。