2023数据采集与融合技术作业四
作业1
要求
- 熟练掌握 Selenium 查找 HTML 元素、爬取 Ajax 网页数据、等待 HTML 元素等内容
- 使用 Selenium 框架+ MySQL 数据库存储技术路线爬取“沪深 A 股”、“上证 A 股”、“深证 A 股”3 个板块的股票数据信息。
- 候选网站:东方财富网http://quote.eastmoney.com/center/gridlist.html#hs_a_board
输出信息
Code
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
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