作业一
要求:
▪ 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内
容。
▪ 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、
“深证 A 股”3 个板块的股票数据信息。
o 候选网站:东方财富网:
http://quote.eastmoney.com/center/gridlist.html#hs_a_board
o 输出信息:MYSQL 数据库存储和输出格式如下,表头应是英文命名例如:序号
id,股票代码:bStockNo……,由同学们自行定义设计表头
部分关键代码
def insert_stock_data(cursor, stock_data):cursor.execute("""INSERT INTO stocks (股票代码, 股票名称, 最新价, 涨跌幅, 涨跌额, 成交量, 成交额, 振幅, 最高, 最低, 今开, 昨收) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", (stock_data['股票代码'], stock_data['股票名称'], stock_data['最新价'], stock_data['涨跌幅'],stock_data['涨跌额'], stock_data['成交量'], stock_data['成交额'], stock_data['振幅'],stock_data['最高'], stock_data['最低'], stock_data['今开'], stock_data['昨收']))
这部分代码用于将爬取到的股票数据按照顺序填入表格
# 爬取所有页的数据
data = []# 假设页面最多会翻10页,可以根据需要修改
page = 1
while True:# 获取当前页面的所有股票数据rows = driver.find_elements(By.XPATH, "//table[@id='table_wrapper-table']/tbody/tr")# 如果没有数据,停止爬取if not rows:print("没有更多数据,停止爬取。")break# 遍历每一行,提取股票信息for row in rows:cols = row.find_elements(By.TAG_NAME, "td")if len(cols) > 1:stock_data = {'股票代码': cols[1].text, # 股票代码'股票名称': cols[2].text, # 股票名称'最新价': float(cols[4].text.replace(",", "")) if cols[4].text else 0.0, # 最新价'涨跌幅': float(cols[5].text.replace("%", "")) if cols[5].text else 0.0, # 涨跌幅'涨跌额': float(cols[6].text.replace(",", "")) if cols[6].text else 0.0, # 涨跌额'成交量': parse_volume(cols[7].text), # 使用parse_volume函数处理成交量'成交额': parse_amount(cols[8].text), # 使用parse_amount函数处理成交额'振幅': float(cols[9].text.replace("%", "")) if cols[9].text else 0.0, # 振幅'最高': float(cols[10].text.replace(",", "")) if cols[10].text else 0.0, # 最高'最低': float(cols[11].text.replace(",", "")) if cols[11].text else 0.0, # 最低'今开': float(cols[12].text.replace(",", "")) if cols[12].text else 0.0, # 今开'昨收': float(cols[13].text.replace(",", "")) if cols[13].text else 0.0 # 昨收}data.append(stock_data)# 将数据插入到数据库insert_stock_data(cursor, stock_data)# 等待翻页按钮可点击try:WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//a[@class='next']")))# 点击翻页按钮,加载下一页数据next_button = driver.find_element(By.XPATH, "//a[@class='next']")next_button.click()# 等待页面加载time.sleep(3)page += 1if page > 10: # 假设只爬取前10页print("爬取结束,已到达最大页数。")breakexcept Exception as e:print(f"翻页失败或超时: {e}")break # 如果发生任何异常则停止翻页
这部分代码用于爬取网站的相关股票数据
结果展示
心得体会
在这次数据爬取和数据库存储的过程中,我学到了很多关于如何使用 Selenium 和 MySQL 进行数据抓取和管理的知识。通过使用 Selenium,能够模拟浏览器操作,自动化地从网页上提取数据,这对处理大量网页内容和需要频繁更新的数据尤为重要。此外,使用 MySQL 来存储数据,不仅提高了数据的持久性,还方便了后续的数据分析和处理。通过设置字符集为 utf8mb4,确保了中文数据的正确存储和显示。
在处理页面翻页时,利用 WebDriverWait 和 EC.element_to_be_clickable 等 Selenium 技巧,提高了程序的稳定性和效率。对成交量和成交额等数据的处理,也通过自定义函数进行转换和解析,使得数据能够符合数据库存储的标准。这次实践让我对如何处理网页抓取、数据解析、数据库操作有了更深入的了解。
同时,在设计数据库时,采用中文列名,使得数据更加易于理解和管理。尽管过程中遇到了一些挑战,如翻页失败和超时问题,但通过不断调试和优化,最终顺利完成了任务。总体来说,这次经历不仅让我加深了对数据抓取技术的理解,也提高了我在实际项目中应用技术的能力。
作业二
要求:
熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待HTML元素等内容。
使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
候选网站:中国mooc网:https://www.icourse163.org
输出信息:MYSQL数据库存储和输出格式
部分核心代码展示
# 打开 iCourse163 网站
driver.get('https://www.icourse163.org/')
time.sleep(1)# 定位并点击登录按钮
button = driver.find_element(By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[3]/div')
button.click()
time.sleep(1)# 切换到登录 iframe
frame = driver.find_element(By.XPATH, "//div[@class='ux-login-set-container']//iframe")
driver.switch_to.frame(frame)
这部分用于模拟用户登录到mook平台
# 获取课程链接元素列表
link_list = driver.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]')# 遍历课程链接元素列表
for link in link_list:# 获取课程名称course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]').text# 获取学校名称school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]').text# 获取主讲老师teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]').texttry:# 获取教师团队成员team_member = link.find_element(By.XPATH, './/span[@class="f-fc9"]/span').textteam_member = teacher + ' 、' + team_memberexcept Exception:team_member = 'none'# 获取参加人数并去除'参加'字样attendees = link.find_element(By.XPATH, './/span[@class="hot"]').text.replace('参加', '')# 获取课程进度process = link.find_element(By.XPATH, './/span[@class="txt"]').text# 获取课程简介introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]').text# 将数据插入 MySQL 数据库cursor.execute('''INSERT INTO courses (课程名称, 学校名称, 老师, 教师团队, 参加人数, 课程进度, 课程简介)VALUES (%s, %s, %s, %s, %s, %s, %s)''', (course_name, school_name, teacher, team_member, attendees, process, introduction))conn.commit()
这部分用于爬取mook的课程内容
运行结果
心得体会
在进行数据库操作和使用 Selenium 自动化抓取网页数据的过程中,我深入体会到了编程与实际应用结合的重要性。首先,在进行数据抓取时,我意识到网页结构的复杂性和动态加载内容的挑战,使用 Selenium 时切换 iframe 和等待元素加载是非常关键的步骤。这让我对网页的 DOM 结构和网络请求有了更深的理解。
其次,在使用 MySQL 存储抓取的数据时,我发现数据库设计的重要性。通过合理的表结构和数据类型的选择,不仅能保证数据存储的效率,还能提高后续查询和管理的便捷性。我还意识到,面对不同数据库(如 MySQL 和 SQLite)时,连接方式、查询语法和权限管理会有些许差异,因此需要根据实际需求灵活调整。
此外,通过实际操作,我对编程中常见的问题和错误有了更多的应对经验。例如,遇到库或驱动版本不匹配时,如何快速定位问题并解决,如何调试程序的每一步操作,这些经验对于提高开发效率非常有帮助。
总的来说,通过实践,我不仅提高了编程技能,还对如何高效地从网页抓取数据并进行存储和分析有了更深的理解。这将为未来更多的项目和挑战打下坚实的基础。