数据采集实践第四次作业

news/2024/11/29 22:52:05/文章来源:https://www.cnblogs.com/FunkTank/p/18569158

Gitee作业链接:
https://gitee.com/FunkTank/crawl_project/tree/master/作业4

作业①

要求:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。

1.作业内容

点击查看代码
from selenium import webdriver
from lxml import etree
from selenium.webdriver.common.by import By
import time
import pymysqldef get_data(url):html = driver.page_sourcebs = etree.HTML(html)lis = bs.xpath('//*[@id="table_wrapper-table"]/tbody/tr')time.sleep(2)for link in lis:a = link.xpath('./td[1]/text()')[0]  # 序号b = link.xpath('./td[2]/a/text()')[0]  # 代码c = link.xpath('./td[3]/a/text()')[0]  # 名称d = link.xpath('./td[5]/span/text()')[0]  # 最新价e = link.xpath('./td[6]/span/text()')[0]  # 涨跌幅f = link.xpath('./td[7]/span/text()')[0]  # 涨跌额g = link.xpath('./td[8]/text()')[0]  # 成交量h = link.xpath('./td[9]/text()')[0]  # 成交额i = link.xpath('./td[10]/text()')[0]  # 振幅j = link.xpath('./td[11]/span/text()')[0]  # 最高k = link.xpath('./td[12]/span/text()')[0]  # 最低l = link.xpath('./td[13]/span/text()')[0]  # 今开m = link.xpath('./td[14]/text()')[0]  # 昨收# 使用 pymysql 连接数据库connection = pymysql.connect(host='localhost',user='root',password='',database='pachoong',charset='utf8mb4')try:with connection.cursor() as cursor:sql = "INSERT INTO stock4 (序号, 代码, 名称, 最新价, 涨跌幅, 涨跌额, 成交量, 成交额, 振幅, 最高, 最低, 今开, 昨收) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"val = (a, b, c, d, e, f, g, h, i, j, k, l, m)cursor.execute(sql, val)connection.commit()print(a, b, c, d, e, f, g, h, i, j, k, l, m)except Exception as e:print(f"Error: {e}")finally:connection.close()next_button = driver.find_element(By.XPATH, url)next_button.click()time.sleep(2)chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')driver = webdriver.Chrome(options=chrome_options)driver.get("https://quote.eastmoney.com/center/gridlist.html#hs_a_board")
get_data('//*[@id="nav_sh_a_board"]/a')
get_data('//*[@id="nav_sz_a_board"]/a')
get_data('//*[@id="nav_bj_a_board"]/a')

输出信息:


2.心得体会

在完成这个股票数据爬取任务的过程中,我深刻体会到了自动化数据处理的重要性以及Selenium工具在实际应用中的强大功能。这次实践不仅提升了我对Selenium和MySQL的掌握程度,也让我认识到在处理实际项目时,问题分析和解决能力的重要性。

作业②

要求:熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)

1.作业内容

点击查看代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from lxml import etree
import pymysql# 数据库配置
DB_CONFIG = {'host': 'localhost','user': 'root','password': '','database': 'pachoong','charset': 'utf8mb4'
}# 目标网址
LOGIN_URL = 'https://www.icourse163.org/'
COURSE_URL = 'https://www.icourse163.org/search.htm?search=%20#/'# 初始化Chrome选项
chrome_options = Options()
chrome_options.add_argument('--headless')  # 无头模式
chrome_options.add_argument('--disable-gpu')# 初始化WebDriver
driver = webdriver.Chrome(options=chrome_options)def wait_for_element(driver, by, value, timeout=10):"""等待元素加载完成"""return WebDriverWait(driver, timeout).until(EC.presence_of_element_located((by, value)))def login(driver, login_url, account, password):"""登录到网站"""driver.get(login_url)wait_for_element(driver, By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div').click()# 切换到iframeframe = wait_for_element(driver, By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[2]/div[2]/div[1]/div/iframe')driver.switch_to.frame(frame)# 输入账号和密码wait_for_element(driver, By.ID, 'phoneipt').send_keys(account)wait_for_element(driver, By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[4]/div[2]/input[2]').send_keys(password)# 点击登录按钮wait_for_element(driver, By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[6]/a').click()# 等待登录完成,可以根据实际情况调整WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')))def fetch_course_data(driver, course_url):"""获取课程信息并存储到数据库"""driver.get(course_url)wait_for_element(driver, By.XPATH, '/html/body/div[4]/div[2]/div[2]/div[2]/div/div[6]/div[1]/div[1]/label/div').click()# 滚动页面以加载所有课程scroll_script = """var timer = setInterval(function(){var scrollTop = document.documentElement.scrollTop || document.body.scrollTop;var ispeed = Math.floor(document.body.scrollHeight / 100);if(scrollTop > document.body.scrollHeight * 90 / 100){clearInterval(timer);}console.log('scrollTop:' + scrollTop);console.log('scrollHeight:' + document.body.scrollHeight);window.scrollTo(0, scrollTop + ispeed);}, 20);"""driver.execute_script(scroll_script)time.sleep(4)  # 等待滚动完成# 获取页面源代码并解析html = driver.page_sourcebs = etree.HTML(html)courses = bs.xpath('/html/body/div[4]/div[2]/div[2]/div[2]/div/div[6]/div[2]/div[1]/div/div/div')# 连接到数据库mydb = pymysql.connect(**DB_CONFIG)cursor = mydb.cursor()try:for course in courses:# 提取课程信息a = course.xpath('./div[2]/div/div/div[1]/a[2]/span/text()')if len(a) != 0 and a[0] == '国家精品':b = course.xpath('./div[2]/div/div/div[1]/a[1]/span/text()')c = course.xpath('./div[2]/div/div/div[2]/a[1]/text()')d = course.xpath('./div[2]/div/div/div[2]/a[2]/text()')e = course.xpath('./div[2]/div/div/div[2]/a[2]/text()')f = course.xpath('./div[2]/div/div/div[3]/span[2]/text()')g = course.xpath('./div[2]/div/div/div[3]/div/span[2]/text()')h = course.xpath('./div[2]/div/div/a/span/text()')# 数据清洗course_name = b[0] if b else ''college = c[0] if c else ''teacher = d[0] if d else ''team = e[0] if e else ''count = f[0] if f else ''process = g[0] if g else '已结束'brief = h[0] if h else '空'# 插入数据库sql = "INSERT INTO mooc (cCourse, cCollege, cTeacher, cTeam, cCount, cProcess, cBrief) VALUES (%s, %s, %s, %s, %s, %s, %s)"val = (course_name, college, teacher, team, count, process, brief)cursor.execute(sql, val)mydb.commit()print(course_name, college, teacher, team, count, process, brief)except Exception as e:print(f"Error: {e}")finally:cursor.close()mydb.close()def main():# 登录login(driver, LOGIN_URL, '', '')  # 实际的账号和密码# 获取课程数据fetch_course_data(driver, COURSE_URL)# 关闭浏览器driver.quit()if __name__ == "__main__":main()

输出信息:

2.心得体会

在熟练掌握Selenium框架后,我成功实现了对中国大学MOOC网课程资源的自动化爬取。首先,我通过Selenium模拟用户登录,通过显式等待(WebDriverWait)处理动态加载的元素,确保登录流程的稳定性。接着,我使用Selenium的XPath定位功能,精准抓取课程信息,包括课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度和课程简介等关键数据。

作业③

要求:掌握大数据相关服务,熟悉Xshell的使用
完成文档 华为云_大数据实时分析处理实验手册-Flume日志采集实验(部分)v2.docx 中的任务,即为下面5个任务,具体操作见文档。
环境搭建:

  • 任务一:开通MapReduce服务

    实时分析开发实战:
  • 任务一:Python脚本生成测试数据

  • 任务二:配置Kafka

  • 任务三:安装Flume客户端

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

2.心得体会

通过使用Flink、Flume和Kafka等工具,我学会了如何构建一个完整的实时数据处理流程。我掌握了Flink SQL的编写技巧,这让我能够灵活地处理和分析流数据。此外,通过DLV服务进行数据可视化,我学会了如何将处理后的数据以直观的方式展示出来,这对于数据驱动的决策制定非常有帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/841132.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据采集作业四

数据采集作业四 作业①: 要求: 熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架+ MySQL数据库存储技术路线爬取“沪深A股”、“上证A股”、“深证A股”3个板块的股票数据信息。 候选网站:东方财富网:http://quote.eastmoney.com/…

Top 5 Kafka使用场景

▫️ 日志处理与分析📈:适用于处理和分析大量日志数据,生成趋势 ▫️ 数据流推荐系统🛒:实时数据流驱动个性化推荐。 ▫️ 系统监控与报警🚨:实时监控系统指标,及时响应报警 ▫️ 变更数据捕获(CDC)🔄:捕获和处理数据库变更,保持系统间数据同步 ▫️ 系…

IDEA2024.3激活提示激活码失效、IDEA2024版本

IDEA激活提示激活码失效解决 点击试用,或者使用网上教程激活后断网打开idea 进入idea随便创建或打开个项目 点击help -> Edit Custom VM Options [帮助 -> 编辑自定义VM选项]编辑自定义VM,鼠标右击找到这个目录看看是不是以前激活的目录,删除 重新执行激活操作 需要…

IDEA2024.3激活提示激活码失效

IDEA激活提示激活码失效解决 点击试用,或者使用网上教程激活后断网打开idea 进入idea随便创建或打开个项目点击help -> Edit Custom VM Options [帮助 -> 编辑自定义VM选项]编辑自定义VM找到这个目录看看是不是以前激活的目录,删除 重新执行激活操作 需要激活软件,可…

使用EVOLVEpro对蛋白质热稳定性进行定向进化

对EVOLVEpro还不熟的读者可以查看之前的博客:Rapid in silico directed evolution by a protein language model with EVOLVEpro 文献解读。 本文通过Kaggle竞赛中提供的酶热稳定性数据集对EVOLVEpro的性能进行验证。 数据集为test.csv和test_labels.csv,这是经过实验测量的某…

计算机概念——io 复用

前言 首先什么是io复用呢? 现在web框架没有不用到io复用的,这点是肯定的,不然并发真的很差。 那么io复用,复用的是什么呢?复用的真的不是io管道啥的,也不是io连接啥的,复用的是io线程。 这其实是操作系统的设计上的io并发不足的地方,然后自己给慢慢填了。 正文 听一段历…

java学习11.25

写了很久的这个差费报销系统,写的太慢了,一半不到,结构上也非常臃肿。

HTML中实现多选一且输入框的启用与禁用

其他类别内容:<script>// 控制"其他类别内容"输入框的启用与禁用function toggleTypeContent() {var typeContentInput = document.getElementById("typecontent");var otherRadio = document.getElementById("other");// 如果选中了&quo…

Pwn 乱刷合集

持续更新中3※ [SHCTF 2024] No stack overflow2考点:ret2libc,libc 库查询,整数溢出在 linux 下使用 checksec 查看该程序开启的保护,发现 Arch 为 amd64-64-little,这说明这是一个 64位 的程序,并且采用了 小端 存储,即低位对应低地址,高位对应高地址。下方的 RELRO …

MySQL原理简介—7.redo日志的底层原理

大纲 1.redo日志对事务提交后数据不丢失的意义 2.redo日志文件的构成 3.redo日志会写入到Redo Log Blcok中 4.redo日志如何写入到Redo Log Blcok中 5.Redo Log Buffer解析 6.Redo Log Buffer的刷盘时机 7.undo log回滚日志原理1.redo日志对事务提交后数据不丢失的意义 (1)redo …