[python爬虫] Selenium定向爬取PubMed生物医学摘要信息

本文介绍使用Selenium爬取PubMed数据库中关于蛋白质的文章标题及摘要的方法。PubMed是一个免费的生物医学文献搜索引擎,涵盖广泛的生命科学领域。通过分析网页结构并利用Selenium,实现了对指定关键词搜索结果的自动化爬取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        本文主要是自己的在线代码笔记。在生物医学本体Ontology构建过程中,我使用Selenium定向爬取生物医学PubMed数据库的内容。
        PubMed是一个免费的搜寻引擎,提供生物医学方面的论文搜寻以及摘要。它的数据库来源为MEDLINE(生物医学数据库),其核心主题为医学,但亦包括其他与医学相关的领域,像是护理学或者其他健康学科。它同时也提供对于相关生物医学资讯上相当全面的支援,像是生化学与细胞生物学。
        PubMed是因特网上使用最广泛的免费MEDLINE, 该搜寻引擎是由美国国立医学图书馆提供, 它是基于WEB的生物医学信息检索系统,它是NCBI Entrez整个数据库查询系统中的一个。PubMed界面提供与综合分子生物学数据库的链接,其内容包括:DNA与蛋白质序列,基因图数据,3D蛋白构象,人类孟德尔遗传在线,也包含着与提供期刊全文的出版商网址的链接等。
        医学导航链接:http://www.meddir.cn/cate/736.htm
        PubMed官网:http://pubmed.cn/


实现代码

        实现的代码主要是Selenium通过分析网页DOM结点进行爬取。
        爬取的地址是:http://www.medlive.cn/pubmed/
        在网址中搜索Protein(蛋白质)后,分析网址可发现设置Page=1~20可爬取前1~20页的URL信息。链接如下:
        http://www.medlive.cn/pubmed/pubmed_search.do?q=protein&page=1

# coding=utf-8
""" 
Created on 2015-12-05  Ontology Spider
@author Eastmount CSDN
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."

分析HTML

        1.获取每页Page中的20个关于Protein(蛋白质)的URL链接和标题。其中getURL()函数中的核心代码获取URL如下:
        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)





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





        其中你可能遇到的错误包括:
        1.Error: 'ascii' codec can't encode character u'\u223c'
        它是文件读写编码错误,我通常会将open(fileName,"w")改为codecs.open(fileName,'w','utf-8') 即可。
        2.第二个错误如下图所示或如下,可能是因为网页加载或Connection返回Close导致
        WebDriverException: Message: Error Message => 'URL ' didn't load. Error: 'TypeError: 'null' is not an object


运行结果

        得到的运行结果如下所示:00001.txt~00400.txt共400个txt文件,每个文件包含标题和摘要,该数据集可简单用于生物医学的本体学习、命名实体识别、本体对齐构建等。





        PS:最后也希望这篇文章对你有所帮助吧!虽然文章内容很简单,但是对于初学者或者刚接触爬虫的同学来说,还是有一定帮助的。同时,这篇文章更多的是我的个人在线笔记,简单记录下一段代码,以后也不会再写Selenium这种简单的爬取页面的文章了,更多是一些智能动态的操作和Scrapy、Python分布式爬虫的文章吧。如果文中有错误和不足之处,还请海涵~昨天自己生日,祝福自己,老师梦啊老师梦!!!
      (By:Eastmount 2015-12-06 深夜3点半   http://blog.csdn.net/eastmount/  

<think>好的,我现在需要帮助用户搭建一个用于爬取PubMed的智能体,使用Python或其他技术。首先,我得回想一下用户的需求,他们想从PubMed爬取数据,并且处理这些数据。PubMed是NCBI的一个数据库,所以可能涉及NCBI的API或者直接网页爬取。 根据用户提供的引用,特别是引用[1]和[4],用户之前有尝试过用Python爬取NCBI的经验,也提到了R语言的rvest包。但用户现在可能更倾向于Python,所以需要重点考虑Python的库,比如requests、BeautifulSoup、Scrapy等。另外,PubMed可能有自己的API,比如通过Biopython的Entrez模块,这可能更稳定和官方推荐的方式。 首先,我需要确定使用哪种方法。直接爬取网页可能会遇到反爬机制,而使用API则更可靠。Biopython的Entrez模块可以访问NCBI的E-utilities,这样更合法且高效。所以第一步应该是介绍使用Biopython的方法。 然后,用户可能需要处理大量的数据,比如获取文献的标题、摘要、作者等信息。这部分需要解析XML或JSON格式的数据,因为Entrez返回的是XML格式。Biopython的Entrez模块可以处理解析,但可能需要示例代码来展示如何提取特定字段。 另外,用户提到“智能体”,可能意味着需要一定的自动化或数据处理逻辑,比如定期爬取、数据存储、清洗或分析。这部分需要考虑数据库的使用,比如SQLite或MySQL,或者保存为CSV/JSON文件。同时,处理逻辑可能包括去重、缺失值处理、文本清洗等。 还要注意遵守NCBI的使用条款,比如限制请求频率,添加合理的延时,使用API密钥(如果有的话)。这能避免IP被封禁,保证爬虫的可持续性。 接下来,可能需要考虑异常处理,比如网络请求失败、数据解析错误等情况,确保爬虫的健壮性。此外,用户可能需要将爬取的数据进一步分析,比如使用pandas进行数据处理,或者结合机器学习库进行分析,这可能涉及到引用[3]中的机器学习相关内容。 最后,用户可能需要一个完整的脚本示例,涵盖从请求数据到存储的整个流程。需要分步骤讲解,确保代码清晰,并有注释说明每个部分的作用。同时,提醒用户注意法律和伦理问题,确保爬取的数据用于合法用途。 现在需要组织这些思路,分步骤回答,并生成相关问题。确保回答结构清晰,符合用户的要求,引用相关的参考文献,比如引用[1]和[2]提到的学习Python爬虫的经验,引用[4]中的数据处理步骤。</think>### 如何构建PubMed数据爬虫及处理逻辑? #### 一、选择技术方案 1. **官方API(推荐)** 使用NCBI提供的E-utilities接口(通过`Biopython`库实现),可合法、稳定地获取数据,支持结构化查询。 示例安装:`pip install biopython` [^2] 2. **网页爬取(备用)** 若API无法满足需求,可用`requests`+`BeautifulSoup`解析HTML,但需注意反爬限制和伦理规范[^1]。 --- #### 二、使用Biopython实现核心爬取 ```python from Bio import Entrez # 配置邮箱和API密钥(遵守NCBI条款) Entrez.email = "your_email@example.com" Entrez.api_key = "your_api_key" # 搜索PubMed文献(示例:获取最近10篇关于"cancer"的文献) search_term = "cancer" handle = Entrez.esearch(db="pubmed", term=search_term, retmax=10) record = Entrez.read(handle) pmid_list = record["IdList"] # 获取文献详情(XML格式) fetch_handle = Entrez.efetch(db="pubmed", id=pmid_list, rettype="xml", retmode="xml") data = fetch_handle.read() # 解析XML数据(示例提取标题和摘要) from Bio.Entrez import read articles = read(Entrez.StringElement(data), validate=False).get("PubmedArticle", []) for article in articles: title = article["MedlineCitation"]["Article"]["ArticleTitle"] abstract = article["MedlineCitation"]["Article"].get("Abstract", {}).get("AbstractText", ["No abstract"])[0] print(f"标题: {title}\n摘要: {abstract}\n") ``` --- #### 三、数据处理与存储 1. **数据清洗** - 去除HTML标签(如`BeautifulSoup(text, "lxml").get_text()`) - 处理缺失值(如摘要为空时填充默认值) 2. **存储方案** ```python import pandas as pd df = pd.DataFrame({ "PMID": pmid_list, "Title": [article["MedlineCitation"]["Article"]["ArticleTitle"] for article in articles], "Abstract": [article["MedlineCitation"]["Article"].get("Abstract", {}).get("AbstractText", [""])[0] for article in articles] }) df.to_csv("pubmed_data.csv", index=False) # 保存为CSV ``` --- #### 四、智能体优化方向 1. **自动化调度** 使用`schedule`库定时执行爬取任务。 2. **异常处理** 添加重试机制和日志记录: ```python import time from requests.exceptions import RequestException def safe_fetch(max_retries=3): retries = 0 while retries < max_retries: try: # 执行请求 return True except RequestException: retries += 1 time.sleep(60 * retries) return False ``` --- #### 五、注意事项 - **遵守NCBI政策**:限制请求频率(每秒不超过3次),建议申请API密钥。 - **伦理规范**:仅爬取公开数据,避免侵犯版权。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eastmount

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值