2023数据采集与融合技术作业四
作业1
要求
- 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容
- 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。
- 候选网站:东方财富网http://quote.eastmoney.com/center/gridlist.html#hs_a_board
输出信息
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import selenium from selenium.webdriver.common.by import By from selenium.webdriver.chrome.service import Service from selenium import webdriver import time Option = webdriver.ChromeOptions() url = "http://quote.eastmoney.com/center/gridlist.html#hs_a_board" chrome_options = Option #chrome_options.add_argument('--headless') #设置浏览器不显示 driver = webdriver.Chrome(options = chrome_options) driver.get(url) print (driver.find_element(By.XPATH, './/*[@id="table_wrapper-table"]/tbody' ).text) time.sleep( 5 ) page2 = driver.find_element(By.XPATH, '//*[@id="nav_sh_a_board"]/a' ) page2.click() time.sleep( 5 ) print (driver.find_element(By.XPATH, './/*[@id="table_wrapper-table"]/tbody' ).text) page3 = driver.find_element(By.XPATH, '//*[@id="nav_sz_a_board"]/a' ) page3.click() time.sleep( 5 ) print (driver.find_element(By.XPATH, './/*[@id="table_wrapper-table"]/tbody' ).text) |
心得体会
学会了如何用click去切换板块,只需要在元素里找到能定位该板块的XPATH即可。难度不大,对selenium熟悉程度加深
作业2
要求
- 熟练掌握 Selenium 查找 HTML 元素、实现用户模拟登录、爬取 Ajax 网页数据、等待 HTML 元素等内容。
- 使用 Selenium 框架+MySQL 爬取中国 mooc 网课程资源信息(课程号、课程名称、学校名称、主讲教师、团队成员、参加人数、课程进度、课程简介)
- 候选网站:中国 mooc 网:https://www.icourse163.org
输出信息
- MYSQL 数据库存储和输出格式
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from prettytable import PrettyTable from selenium.webdriver.common.keys import Keys import time import random # 声明一个谷歌驱动器,并设置不加载图片,间接加快访问速度 options = webdriver.ChromeOptions() options.add_experimental_option( 'prefs' , { 'profile.managed_default_content_settings.images' : 2 }) driver = webdriver.Chrome(options = options) url = "https://www.icourse163.org/search.htm?search=%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F#/" # 声明一个list,存储dict data_list = [] table = PrettyTable([ '课程号' , '课程名称' , '学校名称' , '主讲教师' , '团队成员' , '参加人数' , '课程进度' , '课程简介' ]) def start_spider(): # 请求url driver.get(url) # 点击登录按钮 WebDriverWait(driver, 10 , 0.48 ).until(EC.presence_of_element_located((By.XPATH, '//a[@class="f-f0 navLoginBtn"]' ))).click() iframe = WebDriverWait(driver, 10 , 0.48 ).until(EC.presence_of_element_located((By.XPATH, '//*[@frameborder="0"]' ))) # 转到登录界面的iframe driver.switch_to.frame(iframe) # 输入账号密码并点击登录按钮 driver.find_element(By.XPATH, '//*[@id="phoneipt"]' ).send_keys("") time.sleep( 2 ) driver.find_element(By.XPATH, '//*[@class="j-inputtext dlemail"]' ).send_keys("") time.sleep( 2 ) driver.find_element(By. ID , 'submitBtn' ).click() # 开始提取信息,找到ul标签下的全部li标签 count = 0 for link in browser.find_elements(By.XPATH, '//div[@class="u-clist f-bgw f-cb f-pr j-href ga-click"]' ): count + = 1 #课程号 #课程名称 course_name = link.find_element(By.XPATH, './/span[@class=" u-course-name f-thide"]' ).text print ( "course name " ,course_name) #学校名称,可能是机构老师或者mooc自己推出的,特别处理一下为空的情况 try : school_name = link.find_element(By.XPATH, './/a[@class="t21 f-fc9"]' ).text except Exception as err: school_name = 'none' print ( "school " , school_name) #主讲教师 m_teacher = link.find_element(By.XPATH, './/a[@class="f-fc9"]' ).text print ( "laoshi:" , m_teacher) #团队成员 try : team_member = link.find_element(By.XPATH, './/span[@class="f-fc9"]' ).text except Exception as err: team_member = 'none' #print("团队:",team_member) #参加人数 join = link.find_element(By.XPATH, './/span[@class="hot"]' ).text join.replace( '参加' ,'') print ( "参加人数" ,join) #课程进度 try : process = link.find_element(By.XPATH, './/span[@class="txt"]' ).text except Exception as err: process = 'none' print ( 'jingdu ' ,process) #课程简介 try : introduction = link.find_element(By.XPATH, './/span[@class="p5 brief f-ib f-f0 f-cb"]' ).text except Exception as err: introduction = 'none' print (introduction) table.add_row([ count,course_name,school_name,m_teacher,team_member,join,process,introduction]); def main(): start_spider() if __name__ = = '__main__' : main() # 退出浏览器 driver.quit() print (table) |
心得体会
小问题1:最开始用id去定位登录框,但是发现总是会报找不到的错。是因为输入框以及登录按钮的标签都位于iframe标签中,需要使用switch_to.frame()函数将查找区域变更为对应iframe,才能找到输入框。每个iframe一般都有唯一的ID属性,但是该网站的ID属性值是动态生成的,每次加载的ID都不一样,应该选择根据frameborder属性值来定位该iframe。
小问题2:有一些课程并不好爬,可能缺少主讲成员、学校,所以就要特判一下,否则会报错
最终结果:
作业3
任务1 配置环境
步骤在word手册里,不再贴上来了
成功配好环境截图:
任务2 Python 脚本生成测试数据
将autodatapython.py用xftp拖到云端服务器后,在终端里用命令行运行即可
用more命令查看数据,发现确实生成了
任务3 配置 Kafka
在配置的过程中一直遇到下图问题,请教学长后发现是配置环境时忘记把右图的认证关了,导致一直被拒绝访问
配置成功
任务4 配置Kafka
下载并解包Flume
解压并安装Flume
重启Flume服务
任务5 配置Flume采集数据
这里报了一大堆 not found。有点慌,然后发现对后面操作没影响(?)
新开一个窗口运行pyhon代码(第一次知道可以新开一个窗口),发现左边窗口得到了新数据,说明已经消费出数据了,表明Flume到Kafka是打通的
心得体会
整体来说难度不大,跟着操作手册扎实走就好。如果说遇到了什么问题,应该是自己智障忘记关认证重装了一遍环境,然后熟练掌握了购买华为云环境和释放资源。。
码云链接:https://gitee.com/li-yishui/crawler_project
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了