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

浙公网安备 33010602011771号