NCBI(pubmed)里医学主题词(MeSH)完整词库获取
NCBI(pubmed)里医学主题词(MeSH)完整词库获取
转载提示:原创文章,转载前请联系我!!
文章目录
- NCBI(pubmed)里医学主题词(MeSH)完整词库获取
- 前言
- 一、MeSH词库是什么?
- 二、获取MeSH词库的方式
- 1.从官网的下载页面里下载
- 2.使用python和requests对网页进行爬取
- 三、使用python和requests对网页进行爬取
- 1.项目需求
- 2.网站特点
- 3.爬取目标
- 4.存储格式
- 5.项目文件
- 6.具体代码
- 7.项目成果
- 总结
前言
本文主要介绍MeSH词库的获取方法,有两种方式:1.官网的下载页面,2.对网页进行爬取。本文主要介绍第二种方法。MeSH词库官网:https://www.ncbi.nlm.nih.gov/mesh
一、MeSH词库是什么?
医学主题词(MeSH)是一种用于生物医学信息的索引和分类的层次结构术语。它用于为PubMed和其他NLM数据库建立索引。
二、获取MeSH词库的方式
根据项目需要选择适合项目的获取方式!!!
1.从官网的下载页面里下载
下载页面:https://www.nlm.nih.gov/databases/download/mesh.html
2.使用python和requests对网页进行爬取
在官网下载页面下载的数据清洗也比较费时费力,而且此网站没有反爬,能轻松获取到我们想要的数据,所以爬取也是一种较好的方式。
三、使用python和requests对网页进行爬取
1.项目需求
- 提供一个完整的MeSH词库,供项目使用。需要上下级关系,能够根据需要搜索的词找到它本身的同义词和它的所有下级节点以及它的所有下级节点的同义词。
2.网站特点
以下图为例,搜索Dental Care,网址:https://www.ncbi.nlm.nih.gov/mesh/68003729
上图可以看出:词在词库的位置有两个,以逗号分隔,并且下面树状结构也是两个。只要我们把每一个词和它在词库里的位置都获取下来,就能得到一个完整得词库。使用时只需找出词在词库的位置,根据词在词库的位置就能找到它所有的下级词。
例:上图搜索的词是Dental Care,词在词库的位置是E06.170和N02.421.240.190,它的下级词的位置必定包含上面两个,格式是E06.170.xxx 或N02.421.240.190.xxx,所以找出所有包含上面两个位置的词就是Dental Care的下级词。例如用鼠标点击下级词:Dental Care for Aged,它在词库里的位置是E06.170.100和N02.421.240.190.210,可见有了Dental Care在词库的位置就能查出它所有的下级词。
3.爬取目标
目标:获取网页上每一个词以及它的Entry Terms和Tree Number(s)。
实际爬虫的时候:为了将整个词库完整得获取下来,就需要将搜索词的下级词的href网址也都获取下来,然后遍历。
下图示例:若看不清可保存图片放大!!!!
官网:https://www.ncbi.nlm.nih.gov
例:下级词的href="/mesh/68016321",它的url就是官网+href。
url:https://www.ncbi.nlm.nih.gov/mesh/68016321
4.存储格式
- 我是用txt存储的,也可选择其他格式!!
- 卍分割1.搜索的词与2.词在词库里的位置,※分割1.搜索的词与3.词的同义词
5.项目文件
6.具体代码
# -*- coding: utf-8 -*-
import requests
import time
from lxml import etree
import pandas as pd# 作者:csdn.美味大香蕉
# 日期:2020-11-10# 卍分割1.搜索的词与2.词在词库里的位置,※分割1.搜索的词与3.词的同义词#写入txt
def writeTxt(text):file = open('./data.txt', 'a', encoding='utf-8')file.write(text + "\n")file.close()#爬取网页
def Request(url):response = requests.get(url,timeout=10)time.sleep(2)# print(response)response.encoding = 'utf-8'textData = response.textresHtml = etree.HTML(textData.encode('utf-8'))return resHtml#主程序
def crawl():#官网baseUrl="https://www.ncbi.nlm.nih.gov"#起始词All MeSH CategoriesqueueHref=["/mesh/1000048"]endHref=[]#统计写入txt的数据量num=0#标记错误链接的重试次数tag=0#开始时间startTime=time.time()while queueHref !=[]:try:headHref=queueHref[0]print(headHref)#拼接urlurl = baseUrl + headHref#获取网页html=Request(url)#从网页上获取hrefxpath = '//*[@id="maincontent"]/div/div[5]/div//@href'hrefData = html.xpath(xpath)if len(hrefData)>0:for h in hrefData:if h not in endHref and h not in queueHref and h[:6] =="/mesh/":queueHref.append(h)# 从网页上获取 词nameXpath = '//*[@id="maincontent"]/div/div[5]/div/h1/text()'nameData=html.xpath(nameXpath)# 从网页上获取 entryTermsentryTermsXpath = '//*[@id="maincontent"]/div/div[5]/div/ul[1]/*/text()'entryTermsData = html.xpath(entryTermsXpath)entryTerms=""if len(entryTermsData)>1:entryTermsData3=[]for e in range(len(entryTermsData)):entryTermsXpath2 = '//*[@id="maincontent"]/div/div[5]/div/ul[1]/li['+str(e+1)+']//text()'entryTermsData2 = html.xpath(entryTermsXpath2)if len(entryTermsData2)>0:entryTermsData3.append("".join(entryTermsData2))entryTerms="※".join(entryTermsData3)elif len(entryTermsData)==1:if entryTermsData[0] !="All MeSH Categories":entryTerms = entryTermsData[0]# 从网页上获取 Tree Number(s)idXpath = '//*[@id="maincontent"]/div/div[5]/div/p/text()'idData=html.xpath(idXpath)if len(idData)>0:for i2 in idData:if "Tree Number(s): " in i2:ids=i2.replace("Tree Number(s): ","")ids=ids.split(", ")#将数据写入txtfor id in ids:writeTxt(id + "卍" + nameData[0]+"※"+entryTerms)num+=1print("已写入第"+str(num)+"个数据。")#更新queueHref和endHrefqueueHref.remove(headHref)endHref.append(headHref)tag = 0except:#若重试次数等于10次,就将错误的Href保存至errorLog.txtif tag==10:queueHref.remove(headHref)endHref.append(headHref)file = open('./errorLog.txt', 'a', encoding='utf-8')file.write(headHref + "\n")file.close()tag = 0print("*" * 30)print("数据错误,已保存至txt!!!!!!")print("*" * 30)tag+=1#保存queueHref和endHrefpd.to_pickle(queueHref, "./queueHref.pkl")pd.to_pickle(endHref, "./endHref.pkl")#读取queueHref和endHrefendHref = pd.read_pickle("./endHref.pkl")queueHref = pd.read_pickle("./queueHref.pkl")#发生错误的时间zTime=time.time()print("*" * 30)print("已用时:"+str(zTime-startTime)+"秒!!")print("发生错误,程序10秒后自动开始运行,!!!!!!")print("*" * 30)time.sleep(10)#程序运行完的时间endTime=time.time()print("※" * 30)print("总用时:"+str(endTime-startTime)+"秒!!")print("爬取完成!!")print("※" * 30)if __name__=="__main__":crawl()
7.项目成果
总结
上面项目和代码只是本人演示交流所用,请各位帅哥美女根据实际项目需要再做修改。
NCBI(pubmed)里医学主题词(MeSH)完整词库获取相关推荐
- 有道词典里添加星际译王词库
1.到这里下载自己需要的词典 http://stardict.sourceforge.net/Dictionaries_zh_CN.php 2.文件默认是tar.bz2格式,一种linux的文件打包压 ...
- python 爬虫 搜狗词库
完整版代码github地址:https://github.com/Monster2848/sougou_dic_spider 目标网站 下面有分类 点进 社会科学–金融保险分类 我们需要获取的数据是 ...
- MeSH 医学主题词数据库
一.MeSH简介 MeSH医学主题词数据库,全称为Medical Subject Headings,由美国医学国家医学图书馆NLM建立,用于收录生物医学术语词汇,用于描述医学文献数据库MEDLINE中 ...
- SEO 词库完整指南 转
SEO 词库完整指南 2018.11.17 之前讲到了 SEO 频道,其中极其重要的一步,就是词库的建立了.词库的整理和收集,一方面可以根据关键词获取到精准的.大量的流量,另一方面也可以了解用户的需求 ...
- SEO 词库完整指南(转载)
2019独角兽企业重金招聘Python工程师标准>>> SEO 词库完整指南 2018.11.17 之前讲到了 SEO 频道,其中极其重要的一步,就是词库的建立了.词库的整理和收集, ...
- LeetCode 748. 最短完整词
1. 题目 如果单词列表(words)中的一个单词包含牌照(licensePlate)中所有的字母,那么我们称之为完整词. 在所有完整词中,最短的单词我们称之为最短完整词. 单词在匹配牌照中的字母时不 ...
- LeetCode(748)——最短完整词(JavaScript)
如果单词列表(words)中的一个单词包含牌照(licensePlate)中所有的字母,那么我们称之为完整词.在所有完整词中,最短的单词我们称之为最短完整词. 单词在匹配牌照中的字母时不区分大小写,比 ...
- 爬取搜狗输入法的医学词库 下载.scel格式文件
Ps: 参考代码 原文链接:https://blog.csdn.net/Q_QuanTing/article/details/82698229 Why am I doing this? 入职后一段时间 ...
- android输入法可以删掉吗,搜狗输入法功能科普二:如何添加或删除词库里的词(安卓篇)...
原标题:搜狗输入法功能科普二:如何添加或删除词库里的词(安卓篇) 小伙伴们大家好,我们又见面了今天给大家分享下如何来使用输入法的各种词库.目前搜狗输入法是有很多词库的呢,比如系统词库.个人词库.细胞词 ...
最新文章
- linux中负载值为多少正常_Linux load average负载量分析与解决思路
- java扫描包内所有类_第20天|Java入门有野,修饰符
- CAD数据与ArcGIS数据的互转换
- 客户端发现响应内容类型为“text/html”,但应该是“text/xml”
- 【java与智能设备】01_1Android简介与环境搭建
- 紫色飞猪:基于K8s的集群稳定架构
- openSUSE:下载帮助
- java 刻度尺,刻度尺选择控件
- 谷歌浏览器怎么关闭硬件加速?
- wps怎么画网络图_wps 流程图怎么画 WPS流程图绘制图解教程
- Altium常用元件库,制作原理图使用,共1844个文件,500M+
- 栈顶指针不同进行“进、出”栈的易错题
- 掌握这十个Linux命令,秒变Linux老手
- 5G无线技术基础自学系列 | 密集组网
- AD18.1.9和AD18.1.7的安装步骤
- 谷歌浏览器的默认字号是多大?以及如何设置比最小字体还小的字体?
- mac下npm安装全局组件报错
- Unity3D游戏制作-----环境搭建
- ubuntu 系统 如何生成requirement.txt
- 干货|学原画时的那些你不知道的小技巧!
热门文章
- hessian java_Hessian构建分布式系统应用
- 使用matlab求解二维浅水方程的数值解(一)—浅水波
- vs中项目的外部依赖项是什么意思
- 【SwinTransformer源码阅读二】Window Attention和Shifted Window Attention部分
- 解决springcloud 中各服务之间调用外部依赖的clint api时,在调试时不方便的问题
- excel基础常用操作(2)
- linux环境svn服务端及windows环境客户端安装配置
- uddi java_使用UDDI4J连接JUDDI
- 【报告分享】2021年OTT商业化白皮书-群邑(附下载)​​
- 跨考的福利!800多门精品在线课程!