Ing_ideas

V1

2022/12/29阅读:14主题:默认主题

小白数据挖掘利器 selenium实战案例--论文数据挖掘与可视化分析(上)

最近为了对知网论文进行数据分析,需要获取包含标题、作者和作者单位(发文机构)、关键词、参考文献和引证文献等信息,于是用Python中的selenium包控制谷歌浏览器的方式,获取了城市规划领域2012年至2022年五种期刊论文的信息,清洗之后共8585篇论文文献。 本系列文章分为上下两篇,分别为数据挖掘和数据可视化分析,欢迎关注。

本文不包含selenium的详细安装和使用,需要的请查阅官方文档,或者其他人总结的文章

一、数据挖掘

1 为什么选择又慢又占内存的selenium?

当然是因为知网网站的反扒措施很多、寻找网站真正的请求地址url又困难、提取多数网站数据需要执行JavaScript脚本,对于我们这种刚入门Python的人来说,selenium包可以执行浏览器点击等操作,下图所示获取知网信息操作,虽然慢,在处理类似瀑布加载时比较有效:

知网翻页演示
知网翻页演示

2 selenium获取知网信息流程图

我们获取知网信息分为如下五个步骤:

selenium获取知网信息流程图
selenium获取知网信息流程图

1)selenium和ChromeOptions参数

我主要用了如下参数,更详细的可以看《Selenium Chrome的最全常用Option及其一些加速优化》

options = ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-automation']) #设置开发者模式启动,该模式下webdriver属性为正常值   一般反爬比较好的网址都会根据这个反爬
options.add_argument('--headless'# 启用无头浏览器即不打开浏览器页面
options.add_argument('lang=zh_CN.UTF-8'# 不加载图片, 提升速度
options.add_argument('blink-settings=imagesEnabled=false')
options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
#from fake_useragent import UserAgent  # 随机头包 也可以自己定义
ua = UserAgent()
options.add_argument(f'user-agent={ua.random}')  # 随机头
driver = webdriver.Chrome(options=options) # 加入options属性

2)构建期刊列表循环

本次选取了城市规划、城市规划学刊、城市发展研究、规划师、国际城市规划五种期刊,我们可以看到2022年“中国最具国际影响力学术期刊”中人文社会学科城市规划和城市发展研究分别排到第38和第40,具有一定影响力。

2022中国最具国际影响力学术期刊:人文社科类
2022中国最具国际影响力学术期刊:人文社科类

代码部分找到响应期刊执行打开浏览器命令就行。

3) 循环点击并获取每年期刊所在出版期

我们定义两个函数:

# 定义选择年份函数并点击
def click_issue_year(options,url,Issue_year):
    print(f"正在处理{Issue_year}")
    sleep_date = random.randint(12)
    time.sleep(sleep_date)
    # 执行点击展示当年期刊
    Issue_year_Botton = driver.find_element_by_id(f"{Issue_year}")
    Issue_year_Botton.click()
    time.sleep(sleep_date)
    return driver
# 点击具体的期刊页 获取title_element和count 容易出错
def click_issue_elemet(driver,Issue_year,Singe_Issue_elemet):
写一个try函数 没数据就重试
        try:
            WebDriverWait(driver, 3).until(EC.visibility_of(driver.find_element_by_xpath("//*[@id=\"CataLogContent\"]")))  # 有论文信息出现就继续
            # 点击那一期
            Singe_Issue_elemet.click()
            time.sleep(sleep_date)
            Singe_Issue_elemet.click()
            time.sleep(sleep_date)
            driver.execute_script("window.scrollBy(0,100)")
        except:
            print("此页无论文,需要刷新")
            driver.refresh()
            # 刷新了需要重新定位
            new_window = driver.window_handles[-1]  # 找到新窗口名字
            driver.switch_to.window(new_window)  # 切换到最新打开的窗口
            # 执行点击展示当年期刊
            Issue_year_Botton = driver.find_element_by_id(f"{Issue_year}")
            Issue_year_Botton.click()
            time.sleep(sleep_date)
            click_issue_elemet(driver, Issue_year, Singe_Issue_elemet)# 重新执行程序
        return driver

4)获取标题信息并跳转到论文详情页

这步要注意切换浏览器窗口,因为是在新标签页打开的:

# 切换窗口
new_window = driver.window_handles[-1]  # 找到新窗口名字
driver.switch_to.window(new_window)  # 切换到最新打开的窗口

5)获取论文页详细信息

主要用到了滚动窗口、因为参考文献和引证文献数据需要滚动到它们所在位置才会加载出来:

# 全局像素滚动
driver.execute_script("window.scrollBy(0,800)"# 800像素
# 指定目标滚动
target = driver.find_elements_by_xpath("//*[@id=\"literature-recommend\"]/h5/span")[-1# 指定位置
driver.execute_script("arguments[0].scrollIntoView();", target) # 拖动到可见的元素去

除此之外还需要根据作者的上标序号对应相应的作者地址(发文机构)。

比如陈勇、钱家潍对应浙江省城乡规划设计研究院,周俊则对应浙江省城乡规划设计研究院规划二分院。

最后点击获取参考和引证文献时候,单种数据比如期刊信息没展示完还需要翻页,并且如果页面没有完全加载,就只能获取期刊和博士两种数据,实际上底部其他类型的引证数据还没有被加载。 引证文献详情页


底部数据没有被加载
底部数据没有被加载

底部数据没有被加载(↑↑↑↑↑↑↑↑) 底部数据加载后 底部数据没有加载后(↑↑↑↑↑↑↑↑)

2数据储存与清洗

我的数据保存在非关系型数据库Mongodb中,意味着不需要如SQL等关系型数据库先定义字段类型才能写入表格,Mongodb数据库可以在同一个表中无限增加字段,对于储存此类数据特别适合,其每条数据类似json数据。

{
  "_id": {
    "$oid""63a41c7b1af0b53ffc3f7603"
  },
  "journal""城市规划",
  "title""加快地下空间利用立法,提高城市可持续发展能力",
  "author""赵星烁",
  "author_address""住房和城乡建设部城乡规划管理中心",
  "title_url""https://kns.cnki.net/kcms2/article/abstract?v=YPzfsUXoupjgblNF5vY-7n8woO9NOLghs4xG_6y2xmbgqtYCTgax9rK4yPDXQtpllx8oaoQTKr-l57KQ4KCDjz9j0X0iFpjSAqy-LTgPAjSJlQ96fa3rNCruJ1_ibP45&uniplatform=NZKPT",
  "keywords": [
    "地下空间;",
    "立法;",
    "可持续发展;"
  ],
  "date""2015,39(03)",
  "Year""201503",
  "funds""国家自然科学基金项目(41371534)资助                                                    ",
  "abstract""随着我国可持续发展的步伐不断加快,地下空间的开发利用初具规模。本文通过对我国地下空间立法现状的分析,强调了加快地下空间立法的必要性,同时借鉴国际经验,提出我国地下空间立法的建议。",
  "citations_num""38",
  "citations_info_lst": [
    "[3] 南宁市城市跨江桥梁桥下空间利用规划策略研究[D]. 庞艺飞.哈尔滨工业大学,2020null",
    "[5] 国土空间规划体系下城市地下空间规划的再认识[J]. 刘超;赵竹君;李海梅.城市发展研究,2022(01)null",
    "[10] 城市地下空间规划编制若干问题的探讨[J]. 夏丹.智能城市,2019(06)null",
    "[7] 城市地下空间综合管理关键问题研究[J]. 刘荆;邹亮;羊娅萍.地下空间与工程学报,2020(03)null",
    "[9] 我国城市地下空间确权登记态势与机制研究[J]. 张潆文;张富刚;吴春岐;李凯.中国房地产,2019(18)null",
    "[16] 城市地下空间可持续开发利用问题与对策探讨[J]. 魏新江;崔允亮.现代城市,2016(04)null",
    "[2] “以人为本”视域下城市地下空间居民满意度评价——以杭州为例[J]. 周德;郑星;钟文钰;戚佳玲;李翠珍;周婷;王俊峰.中国土地科学,2022(04)null",
    "[18] 2015年土地科学研究重点进展评述及2016年展望[J]. 冯广京;朱道林;林坚;胡振琪;丰雷;张清勇;郎海鸥;陈美景;仲济香;郧宛琪;张立新;晏学丽;张珂.中国土地科学,2016(01)null",
    "[1] 高密度科技创新区域地下空间开发利用规划研究——以杭州市未来科技城为例[J]. 黄杉;王敏;徐逸程;朱云辰;郑昕文.建筑与文化,2022(09)null",
    "[4] 岩溶管道型突涌水封堵材料研发及其应用研究[D]. 马晨阳.山东大学,2020null",
    "[1] 论我国地下空间利用权制度的构建[D]. 贾宏斌.吉林大学,2016null",
    "[8] 资阳临空经济区地下空间管制研究[D]. 陈俊熹.重庆大学,2019null",
    "[11] 珠海市地下空间开发利用研究[J]. 姜亚莉;张延辉.中国经贸导刊(中),2018(32)null",
    "[6] 苏州市地下空间开发利用管理中的问题与对策研究[D]. 黄媛媛.苏州大学,2019null",
    "[10] H城市地下综合管廊建设“绿色转型”管理研究[D]. 王刚.吉林大学,2018null",
    "[9] 考虑能见度影响的地下多层人员密集场所上行疏散模型研究[D]. 文秋萍.西南交通大学,2019null",
    "[3] 中国城市地下空间立法:近十年以来的进展[J]. 徐生钰;文乾.中国国土资源经济,2022(06)null",
    "[15] 陕西省城市地下空间开发利用规划研究[J]. 李冬雪;刘科伟.西北大学学报(自然科学版),2017(02)null",
    "[4] 我国安全科学与工程学科“十四五”发展战略研究[J]. 范维澄;苗鸿雁;袁亮;周福宝;张来斌;刘乃安;钟茂华.中国科学基金,2021(06)null",
    "[7] 近代历史文化街区地下空间可实施存量评估方法[D]. 刘家韦华.河北工程大学,2019null",
    "[8] 城市地下空间开发利用现状及未来发展理念[J]. 雷升祥;申艳军;肖清华;奚家米;顾霖骏.地下空间与工程学报,2019(04)null",
    "[17] 2015年土地科学研究重点进展评述及2016年展望——土地管理领域分报告[J]. 朱道林;郧宛琪;张立新;晏学丽;张珂.中国土地科学,2016(02)null",
    "[1] 水位变动条件下综合管廊的力学性状研究[D]. 刘创.中南林业科技大学,2021null",
    "[2] 我国城市地下空间开发利用中的环境保护制度研究[D]. 肖玉.河北地质大学,2020null",
    "[12] 地下空间规划条件的实操性研究[J]. 贺俏毅;陈松;吴燕.规划师,2018(05)null",
    "[13] 城市地下空间开发的国际经验及启示[J]. 张京祥;王宇彤.江苏建设,2018(01)null",
    "[14] 我国地下空间开发法制体系的反思与完善[J]. 史浩明.苏州大学学报(哲学社会科学版),2017(05)null",
    "[6] 厦门地下空间规划治理体系构建研究[J]. 韦希.规划师,2021(02)null",
    "[5] 城市地下空间开发利用质量评价[D]. 郑星.浙江工商大学,2020null"
  ],
  "secondcitations_num""251",
  "reference_num""11",
  "reference_info_lst": [
    "[4] 北京城市地下空间开发利用的历程与未来[J]. 石晓冬.地下空间与工程学报,2006(S1)null",
    "[2] 城市地下空间法律、政策与实践探索. 邓少海, 等著.东南大学出版社.2010",
    "[3] 城市地下空间资源评估与开发利用规划. 童林, 祝文君, 著.中国建筑工业出版社.2008",
    "[3] 日本城市地下空间开发利用法律研究[J]. 刘春彦;沈燕红.地下空间与工程学报,2007(04)null",
    "[2] 我国城市地下空间规划的理论研究与编制实践[J]. 束昱;柳昆;张美靓.规划师,2007(10)null",
    "[4] 地下空间科学开发与利用. 钱七虎, 编著.江苏科学技术出版社.2007",
    "[1] 城市地下综合体设计研究[D]. 周伟.武汉大学,2005null",
    "[2] Master Planning for Underground Space Use. City of Helsinki Real Estate Department..2012",
    "[1] 拓展城市发展的战略新空间[N/OL]. 祝文君.光明日报.2014",
    "[1] 中国地下空间规划现状与趋势[J]. 邵继中;王海丰.现代城市研究,2013(01)null",
    "[1] 城市地下空间建设政策与标准体系研究. 李显忠, 主编.海洋出版社.2011"
  ],
  "author_address_modified""住房和城乡建设部",
  "province""北京市",
  "city""北京",
  "geometry""POLYGON ((......)",
}

1)储存方法

利用pymongo接入python,方法是insert_one(dict(“字典”))。

2)清洗规则

  • 去重:根据title和author
  • 删除作者、发文地址为空值的数据
  • 展开作者列,保证每行只有一位作者,方便分析。
  • 对作者地址进行处理
    • 统一到学校而非分到学院,设计院、研究院、厅等政府部门同理。
    • 根据上一步得到的数据确定所在省、市。
    • 删除国外机构的信息
  • 列名更改
  • 完成以后导入到Tableau等可视化软件绘图,Python的绘图包太难学了,初学者可以试试Tableau、excel这些软件分析,地理空间绘图也可以用Arcgis。
带你用数据看世界

各大平台欢迎关注

分类:

后端

标签:

大数据

作者介绍

Ing_ideas
V1