Selenium定向爬取PubMed生物医学摘要信息
本文主要介绍了使用Selenium工具从PubMed数据库中进行生物医学本体论语的爬取与分析。文章详细描述了代码的功能与实现过程,包括如何通过高级搜索功能获取蛋白质(Protein)相关的文献链接及标题,并通过自定义函数getAbstract提取文献摘要并保存为txt文件。此外,文章还提到了在爬取过程中可能遇到的常见问题及解决方案,并展示了最终获取的数据量及其应用潜力。整篇文章结构清晰,内容全面且具有指导性。
目录
一、前言
1、PubMed是什么?
2、PubMed特点
二、实现代码
三、分析HTML
四、运行结果
一、前言
本文主要为个人整理的在线代码笔记,在研究生物医学本体Ontology的过程中,本人运用Selenium进行定向爬取,并重点关注了PubMed数据库的内容.
1、PubMed是什么?
PubMed是一个免费资源平台,在生物医学文献检索方面具有重要价值。它主要基于MEDLINE数据库构建知识体系,在基础医学研究领域具有显著优势。同时为用户提供广泛的知识服务支持系统,在生化与细胞生物学研究领域具有重要应用价值。
作为美国NCBI推出的在线开放获取资源平台,在线浏览量位居全球前列。该平台由美国国立医学图书馆(NLM)运营,并采用基于Web的信息检索技术实现功能拓展和数据整合。为了方便用户查阅全文资源,PubMed不仅提供了传统的参考文献服务,还集成多种辅助功能模块,如文献摘要生成、相关性评分等,有效提升了用户体验水平。
2、PubMed特点
它系统地收集了全球范围内丰富的生物医学文献。它涵盖了多种类型的学术出版物。它广泛涉及多个相关学科领域。
PubMed作为一个免费资源,在其官方网站上所有人都可以上获取并使用这些文献资源。这一特点不仅方便了研究人员、医生以及学生等专业人士的工作需求,也为公众提供了便捷的医疗信息获取渠道。
3. 强大的检索功能:PubMed采用先进的技术手段实现其高级检索功能,并支持多种检索维度(包括关键词、作者、期刊及年份等),能够精准满足用户需求。此外,在文献检索方面,PubMed基于MeSH(医学主题词汇)系统实现了高效的文献查找
在PubMed中的一份文献通常会包含摘要部分、作者信息以及所属期刊的相关资料,并提供相关文献的链接和引用信息。这些功能帮助研究人员轻松地获取所需参考文献并跟踪最新研究进展。
5. 过滤与分类功能:PubMed提供了丰富的过滤与分类功能,可以根据研究领域、语言种类以及发表时间等因素对文献进行筛选与分类。这些功能能够帮助用户高效地筛选出所需的研究成果。
生物医学数据库链接:我们建立了涵盖多个生物医学数据库(包括GenBank、ClinicalTrials.gov、Protein Data Bank等)的连接系统。该系统使用户能够通过PubMed便捷地访问这些数据库中的相关信息与数据。
二、实现代码
主要代码是基于Selenium技术实现的,在该技术框架下通过对网页DOM结点进行解析来完成数据获取功能。
具体链接如下:
PubMed检索(汉化版)_期刊文献_医脉通_medlive.cn
[PubMed检索(医脉通)期刊文献 medlive.cn](http://www.medlive.cn(pubmed_search.do?q=protein&page=1 "PubMed检索(医脉通)期刊文献" )
在解析该网址时发现设置Page=120可获取前120页的URL信息。
 # coding=utf-8  
    
 """  
    
 Created on 2015-12-05  Ontology Spider 
    
 @author Eastmount  
    
 URL: 
    
   http://www.meddir.cn/cate/736.htm 
    
   http://www.medlive.cn/pubmed/ 
    
   http://paper.medlive.cn/literature/1502224 
    
 """  
    
   
    
 import time            
    
 import re            
    
 import os  
    
 import shutil  
    
 import sys  
    
 import codecs   
    
 from selenium import webdriver        
    
 from selenium.webdriver.common.keys import Keys        
    
 import selenium.webdriver.support.ui as ui        
    
 from selenium.webdriver.common.action_chains import ActionChains    
    
   
    
 #Open PhantomJS  
    
 driver = webdriver.Firefox()  
    
 driver2 = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")   
    
 wait = ui.WebDriverWait(driver,10)  
    
   
    
 ''''' 
    
  Load Ontoloty 
    
  去到每个生物本体页面下载摘要信息 
    
  http://paper.medlive.cn/literature/literature_view.php?pmid=26637181 
    
  http://paper.medlive.cn/literature/1526876 
    
 '''  
    
 def getAbstract(num,title,url):  
    
     try:  
    
         fileName = "E:\ PubMedSpider\ " + str(num) + ".txt"  
    
         #result = open(fileName,"w")  
    
         #Error: 'ascii' codec can't encode character u'\u223c'  
    
         result = codecs.open(fileName,'w','utf-8')   
    
         result.write("[Title]\r\n")  
    
         result.write(title+"\r\n\r\n")  
    
         result.write("[Astract]\r\n")  
    
         driver2.get(url)  
    
         elem = driver2.find_element_by_xpath("//div[@class='txt']/p")  
    
         #print elem.text  
    
         result.write(elem.text+"\r\n")  
    
     except Exception,e:      
    
         print 'Error:',e  
    
     finally:  
    
         result.close()  
    
         print 'END\n'  
    
   
    
 ''''' 
    
  循环获取搜索页面的URL 
    
  规律 http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page=1 
    
 '''  
    
 def getURL():  
    
     page = 1      #跳转的页面总数  
    
     count = 1     #统计所有搜索的生物本体个数      
    
     while page<=20:  
    
         url_page = "http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page="+str(page)  
    
         print url_page  
    
         driver.get(url_page)  
    
         elem_url = driver.find_elements_by_xpath("//div[@id='div_data']/div/div/h3/a")  
    
         for url in elem_url:  
    
             num = "%05d" % count  
    
             title = url.text  
    
             url_content = url.get_attribute("href")  
    
             print num  
    
             print title  
    
             print url_content  
    
             #自定义函数获取内容  
    
             getAbstract(num,title,url_content)  
    
             count = count + 1  
    
         else:  
    
             print "Over Page " + str(page) + "\n\n"  
    
         page = page + 1  
    
     else:  
    
         "Over getUrl()\n"  
    
         time.sleep(5)  
    
   
    
 ''''' 
    
  主函数预先运行 
    
 '''  
    
 if __name__ == '__main__':  
    
     ''''' 
    
     path = "F:\ MedSpider\ " 
    
     if os.path.isfile(path):         #Delete file 
    
         os.remove(path) 
    
     elif os.path.isdir(path):        #Delete dir     
    
         shutil.rmtree(path, True)     
    
     os.makedirs(path)                #Create the file directory 
    
     '''  
    
     getURL()  
    
     print "Download has finished."  
    
    
    
    
    AI助手
        三、分析HTML
第1步:从每个页面中收集20个与蛋白质相关的URL链接及其标题信息。其中getURL()函数的核心代码用于获取相关资源。
         url = driver.find_elements_by_xpath("//div[@id='div_data']/div/div/h3/a")
    
         url_content = url.get_attribute("href")
    
         getAbstract(num,title,url_content)
    
    
    
    
    AI助手
        

2.再去到具体的生物文章页面获取摘要信息


其中你可能遇到的错误包括:
1.Error Occurred: 无法对字符 u'\u223c' 进行 ASCII 编码
这是由于文件读写时的编码不兼容所导致的问题。通常情况下,在 Python 中打开文件时如果遇到类似问题,默认的 open 函数参数无法满足需求。建议将 open 函数调用方式从 open(fileName,"w") 更改为 codecs.open(fileName,'w','utf-8') 即可解决问题。
2.第二个错误可能会以图形界面的形式展示(如附图所示)或以文本形式呈现(如以下情况),这通常是由于网页加载过程存在问题或是网络连接中断所致
具体而言,在 WebDriver 环境中遇到此类错误时,请注意以下几点:WebDriverException 显示信息指出 URL 未能正确加载。同时也会出现类型转换失败:原始值为 null。

四、运行结果
运行后的结果如下显示:从编号为[编号范围]的多个文档中获取共400个txt文件。每个文档均包含标题信息与摘要内容,并且该数据集主要适用于生物医学领域中的本体构建、命名实体识别以及跨本体对齐等技术应用。


PS: 感谢您的阅读与关注!尽管内容较为基础,但仍然能带来一定的参考价值。此外,请 note 刚刚开始学习爬虫技术的朋友们而言,在这里可以获得一些基本知识与操作经验。值得注意的是这更像是我个人学习路上的一个随手笔记记录——简单地记录了一些基础代码片段——以后不会再深入探讨像Selenium这样较为基础的网页抓取技术——而是更多地涉及一些智能动态操作以及基于 Scrapy 框架的 Python 分布式爬虫技术相关内容
