# 数据挖掘期末项目 **Repository Path**: gaogaolo/data-mining-final-project ## Basic Information - **Project Name**: 数据挖掘期末项目 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-06-29 - **Last Updated**: 2021-07-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 数据挖掘_CNKI实践 * 撰写人:高智浩 * 最新撰写时间: 2021.6.29 ## 项目意义: * 深入熟悉selenium自动化挖掘操作 * 了解并解决验证码识别问题 ## 项目目的 1. 对CNKI PDF文件进行依次下载并且解决当中出现的验证码 2. 爬取知网有关新媒体的论文 3. 对爬取结果进行数据可视化 ## 项目结果 * 成功对CNKI的PDF文件进行依次爬取下载,获取到了需要的有关新媒体的PDF格式论文,并且有效解决了当中有可能会出现验证码的问题。 ## 项目逻辑 * 依次点击文件链接后下载pdf文件 * 如果遇到出现验证码的问题首先判断验证码元素是否存在,如果验证码存在则对验证码进行识别处理,反之则继续下载。 * 当出现验证码时,首先切换到验证码窗口,然后通过selenium截图截取验证码内容并对验证码图片进行图片处理使得更容易被api识别。 * 用图鉴api对处理好的验证码图片进行识别并填入验证码窗口,并通过判断语句判断验证码是否正确,如果不正确则继续重新识别填入,正确则继续下载pdf文件。 ## 所遇问题以及解决方案 1.验证码识别精度问题: * 项目刚开始的时候我所选用的验证码处理方法是百度文字识别api, 但由于百度文字识别api识别精度太低等问题导致项目一直难以进行,遇到验证码的时候无法有效的正确识别出验证码内容。百度文字识别api代码如下: ``` def baidu_API(): # client_id 为官网获取的AK, client_secret 为官网获取的SK host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={AK}&client_secret={SK}' response = requests.get(host) if response: # print(response.json()) access_token = response.json()["access_token"] request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic" f = open('screenImg.png', 'rb') img = base64.b64encode(f.read()) params = { "image":img } request_url = request_url + "?access_token=" + access_token headers = {'content-type': 'application/x-www-form-urlencoded'} response = requests.post(request_url, data=params, headers=headers) time.sleep(1) results = response.json()["words_result"][0]["words"] return results ``` * 在使用百度文字识别api多次尝试无果过,我选择了更换验证码处理方法,使用图鉴文字识别api继续对验证码识别进行尝试,并成功完成了对验证码的高效识别处理。示例如下: ``` uname = "用户名" pwd = "密码" typeid = "3" def base64_api(uname, pwd, img, typeid): with open('screenImg.png', 'rb') as f: base64_data = base64.b64encode(f.read()) img = base64_data.decode() data = {"username": uname, "password": pwd, "typeid": typeid, "image": img} time.sleep(1) result = json.loads(requests.post("http://api.ttshitu.com/predict", json=data).text) if result['success']: return result["data"]["result"] else: return result["message"] return "" ``` 2.判断验证码是否出现 * 在自动化下载PDF文件的时候,会存在一定几率出现要输入验证码的情况,我们需要在代码中加入判断语句来对是否出现验证码进行判断,如果存在验证码出现的情况需要对页面进行切换操作,否则代码运行会报错。我运用的方法是通过判断有无存在验证码元素来对验证码出现情况进行判断,示例代码如下: ``` def img_isTrue(): try: driver.find_element_by_xpath('//*[@id="vImg"]') return True except: return False ``` 3.判断验证码识别情况正不正确 * 在处理验证码情况当中,我所遇到的一个重要问题是如何去判断api所识别出来的验证码正不正确且如果不正确该如何进行处理。我一开始运用的方法是判断页面元素有无改变,有没有出现验证码识别错误的提示语句去判断验证码是否正确。但在多次测试后发现此方法并不可行,因为有的时候输入错误验证码并不会出现错误的提示语句而导致无法判断。所以最后我选择了检测本地储存下载文件夹的文件数量来判断验证码输入正误,如果验证码输入正确则会下载文件,本地文件便会增多,反之则不会。示例代码如下: ``` def wenjian(): path = r'C:\Users\92519\python数据挖掘\_week13_\pdf' file = int(len([lists for lists in os.listdir(path) if os.path.isfile(os.path.join(path, lists))])) return file ``` ``` def wenjian2(): path = r'C:\Users\92519\python数据挖掘\_week13_\pdf' file2 = int(len([lists for lists in os.listdir(path) if os.path.isfile(os.path.join(path, lists))])) return file2 ``` ``` def wenjian3(): if file2 > file: return True else: return False ``` ``` if res is True: img()#爬取验证码 time.sleep(2) base64_api(uname, pwd, img, typeid)#调用api识别验证码内容 shuru()#填写识别出来的验证码内容 wenjian()#检测下载文件夹内的文件数量 file = wenjian() time.sleep(1) element = driver.find_element_by_xpath('/html/body/div/form/dl/dd/button') element.click() wenjian2()#检测点击下载后文件夹内的文件数量 file2 = wenjian2() time.sleep(1) wenjian3()#判断下载文件夹内的文件数量是否变化 res2 = wenjian3() while res2 == False: img()#爬取验证码 base64_api(uname, pwd, img, typeid)#调用百度api识别验证码内容 shuru()#填写识别出来的验证码内容 wenjian()#检测下载文件夹内的文件数量 file = wenjian() element = driver.find_element_by_xpath('/html/body/div/form/dl/dd/button') element.click() wenjian2() file2 = wenjian2() wenjian3()#判断下载文件夹内的文件数量是否变化 res2 = wenjian3() if res2 == True: break ``` ## 爬取结果可视化分析 * 根据数据可视化分析可得,新媒体类论文研究领域主要集中于*新媒体环境*,*新媒体时代*以及*新媒体技术*这三个领域之中,可以看出当前对新媒体领域的研究更多还是集中于大时代环境以及技术当中。而其它更多的细分领域则更多集中于教育以及新闻传播之中,这也与新媒体原本的媒体属性相契合,并且与传统媒体的研究方向也有着一定交错重合,但是却是以新媒体的新视角去看待这些传统的研究方向。 ![輸入圖片說明](https://images.gitee.com/uploads/images/2021/0701/092308_602c5a2a_7603885.png "屏幕截图.png") ## 总结 * 在本次项目实践中,我学习并更加深入了解了selenium的操作,懂得了如何处理解决可能出现的验证码问题,并加深了对数据挖掘这门课的理解。感谢在项目中给我帮助的智超老师以及同学们。