CB写的博客也有人看啊

我是CB

数据采集与融合技术实践第五次实验作业

数据采集与融合技术实践第五次实验作业

作业①:

1.题目

  • 要求:熟练掌握 Selenium 查找HTML元素、爬取Ajax网页数据、等待HTML元素等内容。 使用Selenium框架爬取京东商城某类商品信息及图片。

  • 候选网站:http://www.jd.com/

  • 关键词:学生自由选择

  • 输出信息:MySQL数据库存储和输出格式如下:

    mNo mMark mPrice mNote mFile
    000001 三星Galaxy 9199.00 三星Galaxy Note20 Ultra5G... 000001.jpg
    000002......

2.实验思路

if __name__ == "__main__":
    threads = []
    url="http://www.jd.com/"
    driver = OpenDriver(url)
    db = DB()
    db.openDB()
    #搜索手机
    Search("手机")
    #获取数据部分
    for page in range(1,3):
        PullDown()
        GetInfo()
        if page == 2:
            break
        #翻页部分
        ToNextPage()
    for t in threads:
        t.join()
    db.closeDB()
    driver.close()
    print("爬取结束")

大题流程为进入首页、搜索关键词、获取两页的手机商品信息并存入MySQL数据库中

def OpenDriver(url):
    chrome_options = Options()
    # chrome_options.add_argument('--headless')
    chrome_options.add_argument('--disable-gpu')
    driver = webdriver.Chrome(options=chrome_options)
    driver.get(url)  # 浏览器访问首页
    return driver

该函数为打开浏览器进入首页

def Search(s):
    locator = (By.XPATH, '//*[@id="key"]')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    InputText = driver.find_element(By.XPATH, '//*[@id="key"]')
    InputText.send_keys(s)
    FindButtom = driver.find_element(By.XPATH, '//*[@id="search"]/div/div[2]/button')
    FindButtom.click()
    time.sleep(5)

改函数传入一个s参数,为搜索的关键词,然后在首页中通过XPATH搜索搜索栏和搜索按钮,进行搜索关键词的操作

def PullDown():
    time.sleep(0.5)
    for i in range(100):
        # Wwindow.scrollTo(x,y) x水平拖动,y垂直拖动
        js = 'window.scrollTo(0,%s)' % (i * 200)
        driver.execute_script(js)
        time.sleep(0.07)#每下拉一次停0.07秒等待加载

该函数为网页下拉操作,用于加载所有商品信息

no = 1
def GetInfo():
    global no
    div = driver.find_element(By.XPATH, '//*[@id="J_goodsList"]/ul')
    lis = div.find_elements(By.XPATH, './li')
    for li in lis:
        phone = li.find_element(By.XPATH,'./div')
        note = phone.find_element(By.XPATH,'./div[@class="p-name p-name-type-2"]/a/em').text
        mark = note.split(" ")[0]
        mark = mark.replace("京品手机\n", "").replace(",", "").replace("\n", "")
        note = note.replace("京品手机\n", "").replace(",", "").replace("\n", "")
        #print(note)
        #print(mark)
        price = phone.find_element(By.XPATH,'./div[@class="p-price"]/strong/i').text
        #print(price)
        imgPath = phone.find_element(By.XPATH,'./div[@class="p-img"]/a/img').get_attribute("src")
        #print(file)
        db.insert("{0:{1}>6}".format(no,0),mark,price,note,"{0:{1}>6}.jpg".format(no,0))
        T = threading.Thread(target=SaveImg, args=(imgPath, "{0:{1}>6}.jpg".format(no,0)))
        T.setDaemon(False)
        T.start()
        threads.append(T)
        no += 1

该函数为获取所需的信息,并将信息存储的数据库中,并采用多线程方法下载商品图片

def ToNextPage():
    locator = (By.XPATH, '//*[@id="J_bottomPage"]/span[1]/a[9]')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    NextPage = driver.find_element(By.XPATH, '//*[@id="J_bottomPage"]/span[1]/a[9]')
    #driver.execute_script('scrollBy(0,-200)')
    NextPage.click()

该函数为查找“下一页”的按钮,实现翻页操作




控制台输出、数据库存放结果、下载的图片如图所示

3.心得体会

作业①使用selenium来进行爬取信息,本次作业过程遇到的问题是爬取时有的图片url无法获取,原因是下拉速度太快导致图片还没加载,在每次下拉时停顿0.07秒即可解决问题

作业②:

1.题目

  • 要求:熟练掌握 Selenium 查找HTML元素、实现用户模拟登录、爬取Ajax网页数据、等待 HTML元素等内容。 使用Selenium框架+MySQL爬取中国mooc网课程资源信息(课程号、课程名称、教学 进度、课程状态,课程图片地址),同时存储图片到本地项目根目录下的imgs文件夹 中,图片的名称用课程名来存储。

  • 候选网站:中国mooc网:https://www.icourse163.org

  • 输出信息:MYSQL数据库存储和输出格式

    表头应是英文命名例如:课程号ID,课程名称:cCourse……,由同学们自行定义 设计表头:

    Id cCourse cCollege cSchedule cCourseStatus cImgUrl
    1 Python网络爬虫与信息提取 北京理工大学 已学3/18课时 2021年5月18日已结束 http://edu-image.nosdn.127.net/C0AB6FA791150F0DFC0946B9A01C8CB2.jpg
    2......

2.实验思路

if __name__ == "__main__":
    threads = []
    url="https://www.icourse163.org/"
    driver = OpenDriver(url)
    db = DB()
    db.openDB()
    account = input("请输入账号:")
    password = input("请输入密码:")
    Login(account,password)
    #获取数据部分
    GetInfo()
    for t in threads:
        t.join()
    db.closeDB()
    driver.close()
    print("爬取结束")

大体过程为进入首页、进行登录操作、获取信息并存入数据库

def Login(account,password):
    #点登陆/注册
    locator = (By.XPATH,'/html/body/div[4]/div[1]/div/div/div/div/div[7]/div[2]/div/div/div/a')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    LoginButton = driver.find_element(By.XPATH, '/html/body/div[4]/div[1]/div/div/div/div/div[7]/div[2]/div/div/div/a')
    LoginButton.click()
    #点其他登录方式
    locator = (By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div[2]/span')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    LoginButton = driver.find_element(By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div[2]/span')
    LoginButton.click()
    #点手机号登录
    locator = (By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[1]/ul/li[2]')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    LoginButton = driver.find_element(By.XPATH, '/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[1]/ul/li[2]')
    LoginButton.click()
    #输入账号密码
    iframe = driver.find_element(By.XPATH,"/html/body/div[13]/div[2]/div/div/div/div/div/div[1]/div/div[1]/div[2]/div[2]/div/iframe")
    driver.switch_to.frame(iframe)

    locator = (By.XPATH, '//*[@id="phoneipt"]')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    InputText = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[2]/div[2]/input')
    InputText.send_keys(account)
    InputText = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/form/div/div[4]/div[2]/input[2]')
    InputText.send_keys(password)

    locator = (By.XPATH, '//*[@id="submitBtn"]')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    LoginButton = driver.find_element(By.XPATH, '//*[@id="submitBtn"]')
    LoginButton.click()
    #点我的课程
    locator = (By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[4]/div')
    WebDriverWait(driver, 10, 0.5).until(EC.presence_of_element_located(locator))
    LoginButton = driver.find_element(By.XPATH, '//*[@id="app"]/div/div/div[1]/div[3]/div[4]/div')
    LoginButton.click()

该函数为模拟依次点击登录/注册、其他登录方式、手机号登录、输入账号密码、点击登录的操作,然后进入我的课程。

(过多重复代码可以用函数实现)

no = 1
def GetInfo():
    time.sleep(2)
    global no
    divss = driver.find_element(By.XPATH, '//*[@id="j-coursewrap"]/div/div[1]')
    divs = divss.find_elements(By.XPATH, './/div[@class="box"]')
    for div in divs:
        course = div.find_element(By.XPATH,'./a/div[@class="body"]//div[@class="title"]//span[@class="text"]').text
        #print(course)
        college = div.find_element(By.XPATH,'./a/div[@class="body"]//div[@class="school"]/a').text
        #print(college)
        schedule = div.find_element(By.XPATH,'./a/div[@class="body"]/div[@class="personal-info"]//a').text
        #print(schedule)
        courseStatus = div.find_element(By.XPATH,'./a/div[@class="body"]/div[@class="personal-info"]/div[@class="course-status"]').text
        #print(courseStatus)
        imgUrl = div.find_element(By.XPATH,'./a/div[@class="img"]/img').get_attribute("src")
        #print(imgUrl)
        db.insert(no,course,college,schedule,courseStatus,imgUrl)
        T = threading.Thread(target=SaveImg, args=(imgUrl, course+".jpg"))
        T.setDaemon(False)
        T.start()
        threads.append(T)
        no += 1

该函数为获取需要的信息,并存入数据库,然后用多线程方法下载图片



控制台输出、数据库存放结果、下载的图片如图所示

3.心得体会

作业②也使用selenium进行爬取信息,本次作业主要遇到的问题是部分按钮在复制xpath路径时为“//*[@id="auto-id-1637753529472"]”,但是该id中的数字是会变化的,因此在下一次运行的时候找不到该按钮,这时候copy full xpath即可,例如:

“/html/body/div[4]/div[1]/div/div/div/div/div[7]/div[2]/div/div/div/a”

作业③:

1.题目

要求: 理解Flume架构和关键特性,掌握使用Flume完成日志采集任务。 完成Flume日志采集实验,包含以下步骤: 任务一:开通MapReduce服务 任务二:Python脚本生成测试数据 任务三:配置Kafka 任务四:安装Flume客户端 任务五:配置Flume采集数据

2.实验思路

1、开通MapReduce服务

2、Python脚本生成测试数据

进入client编写py文件(实际是用xftp7移到里面的)

生成测试数据并查看
3、配置Kafka

配置环境变量,在kafka中创建topic

查看topic信息
4、安装Flume客户端

进入MRS Manager集群管理界面,打开服务管理点击flume,进入Flume服务,下载客户端

完成下载


解压压缩包获取校验文件与客户端配置包

校验文件包

解压tar文件

安装Flume环境变量

配置环境变量

解压Flume客户端

安装Flume客户端

重启Flume服务
5、配置Flume采集数据

在conf目录下编辑文件properties.properties

执行

新开一个Xshell7窗口执行指令

kafka中产生数据

码云上的代码:2019数据采集与融合技术: 数据采集与融合技术实践作业 - Gitee.com

posted @ 2021-11-24 19:36  zhuangxinpeng  阅读(39)  评论(0编辑  收藏  举报