基于BeautifulSoup实现pubmed文献摘要的爬虫与无格式输出

一、实现背景

        为了满足项目数据集的构造,我们需要针对各领域医学文献的摘要进行爬取工作,因此编写了pubmed的文献摘要爬虫代码。代码基于python语言,可使用pycharm直接运行,同时基于BeautifulSoup库实现了解析HTML,为了获取纯文本内容,输出结果是以各个文献在pubmed中的PMID为文件名的.txt文件。

二、具体实现

具体代码如下:

代码支持单关键字的查找与多关键字的and查找,并确保了输出文章的数量与输出文章的数量,有明确的结果输出。

针对多关键字的and查找,我们需要在多个关键字间添加分号,在命令行窗口中需要使用‘%3b’来代替分号,使用图片参考下文。

import requests
import re
import os
from bs4 import BeautifulSoup

key = input("请输入你想查找的信息:")
local_folder = input("请输入你想存储的文件夹位置:")
if not os.path.exists(local_folder):
    os.makedirs(local_folder)

turl = "https://pubmed.ncbi.nlm.nih.gov/"
tdata = requests.get(turl, params={"term": key}).text

pat_alldocu = '<span class="value">(.*?)</span>'
alldocu = re.compile(pat_alldocu, re.S).findall(tdata)

num = int(input("请输入大致想获取的文章数目(总数为" + str(alldocu[0]) + "):"))

downloaded_count = 0  # 记录已下载的文章数

for j in range(0, (num - 1) // 10 + 1):
    url = f"https://pubmed.ncbi.nlm.nih.gov/?term={key}&page={str(j + 1)}"
    data = requests.get(url).text

    pat1_content_url = '<div class="docsum-wrap">.*?<.*?href="(.*?)".*?</a>'
    content_url = re.compile(pat1_content_url, re.S).findall(data)

    hd = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0',
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3748.400 QQBrowser/10.5.3863.400'
    }

    for i in range(0, len(content_url)):
        if downloaded_count >= num:
            break

        curl = "https://pubmed.ncbi.nlm.nih.gov" + content_url[i]
        try:
            cdata = requests.get(curl, headers=hd).text

            # 提取PMID
            pmid_match = re.search(r'\/(\d+)\/*$', content_url[i])
            if pmid_match:
                pmid = pmid_match.group(1)
            else:
                continue  # 如果没有找到PMID, 跳过这篇文章

            pat3_content = '<div class="abstract-content selected".*?>(.*?)</div>'
            content_html = re.compile(pat3_content, re.S).findall(cdata)[0]

            # 使用BeautifulSoup解析HTML,并获取纯文本内容
            soup = BeautifulSoup(content_html, 'html.parser')
            content_text = soup.get_text(strip=True)

            # 使用PMID作为文件名
            file_name = f"{pmid}.txt"
            file_path = os.path.join(local_folder, file_name)

            # 写入摘要内容到文件
            with open(file_path, "w", encoding="utf-8") as file:
                file.write(content_text)

            downloaded_count += 1  # 成功下载后,计数器增加

        except Exception as err:
            print(f"出现相关错误: {err}")
            continue  # 错误时继绌尝试下一篇文章

print(f"爬取了 {num} 文章数, 正确下载了 {downloaded_count} 文章数,爬取工作完成.")

三、使用方法

将上述代码保存为xxx.py格式,放入编译器中即可编译运行。

使用方法为:根据提示信息依次输入想要爬取的文章关键字,输入文件存储位置以及输入想要爬取的文章数量。下图展示了搜索与“肺癌”和“随机对照试验”相关的文献,并提供了结果输出展示。

在.txt文件中,是无html格式的纯文本文件。参考如下:

四、具体分析

1. 输入信息

key = input("请输入你想查找的信息:")
local_folder = input("请输入你想存储的文件夹位置:")

用户需要输入要查找的关键词和存储文件夹的位置。

2. 创建文件夹

if not os.path.exists(local_folder):
    os.makedirs(local_folder)

如果文件夹不存在,则创建该文件夹。

3. 获取搜索结果总数

turl = "https://pubmed.ncbi.nlm.nih.gov/"
tdata = requests.get(turl, params={"term": key}).text

pat_alldocu = '<span class="value">(.*?)</span>'
alldocu = re.compile(pat_alldocu, re.S).findall(tdata)

发送请求到PubMed主页,根据用户输入的关键词进行搜索,并提取出总的文献数量。

4. 输入希望获取的文章数

num = int(input("请输入大致想获取的文章数目(总数为" + str(alldocu[0]) + "):"))

输入想要的页数

 

5. 逐页抓取文章信息

for j in range(0, (num - 1) // 10 + 1):
    url = f"https://pubmed.ncbi.nlm.nih.gov/?term={key}&page={str(j + 1)}"
    data = requests.get(url).text

    pat1_content_url = '<div class="docsum-wrap">.*?<.*?href="(.*?)".*?</a>'
    content_url = re.compile(pat1_content_url, re.S).findall(data)

 

根据每页的内容抓取文献摘要的URL。

6. 设置请求头

hd = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3748.400 QQBrowser/10.5.3863.400'
}

设置请求头以模拟浏览器请求,避免被服务器拒绝。

7. 下载并保存文章摘要

首先循环遍历当前页面抓取到的所有文章URL,然后拼接出文章的完整URL,发送HTTP GET请求获取文章详细页面的HTML内容。使用try-except块捕获请求过程中的任何异常。使用正则表达式从URL中提取PMID。如果提取失败,则跳过这篇文章。使用正则表达式匹配摘要内容所在的HTML部分。利用BeautifulSoup解析HTML,将摘要部分提取为纯文本。使用PMID作为文件名,构造完整的文件路径。最后,将提取到的摘要内容写入本地文件中,文件名为PMID,格式为txt。

for i in range(0, len(content_url)):
    if downloaded_count >= num:
        break

    curl = "https://pubmed.ncbi.nlm.nih.gov" + content_url[i]
    try:
        cdata = requests.get(curl, headers=hd).text

        # 提取PMID
        pmid_match = re.search(r'\/(\d+)\/*$', content_url[i])
        if pmid_match:
            pmid = pmid_match.group(1)
        else:
            continue  # 如果没有找到PMID, 跳过这篇文章

        pat3_content = '<div class="abstract-content selected".*?>(.*?)</div>'
        content_html = re.compile(pat3_content, re.S).findall(cdata)[0]

        # 使用BeautifulSoup解析HTML,并获取纯文本内容
        soup = BeautifulSoup(content_html, 'html.parser')
        content_text = soup.get_text(strip=True)

        # 使用PMID作为文件名
        file_name = f"{pmid}.txt"
        file_path = os.path.join(local_folder, file_name)

        # 写入摘要内容到文件
        with open(file_path, "w", encoding="utf-8") as file:
            file.write(content_text)

        downloaded_count += 1  # 成功下载后,计数器增加

    except Exception as err:
        print(f"出现相关错误: {err}")
        continue  # 错误时继绌尝试下一篇文章

逐个访问文章的详细页面,提取摘要并保存到本地文件。使用PMID作为文件名确保文件唯一性。

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要导出PubMed文献,你需要使用Python编写一个爬虫来获取PubMed文献的信息。具体步骤如下: 1. 安装所需的Python库,包括requests, BeautifulSoup和pandas。 2. 使用requests库从PubMed网站获取文献信息。你可以使用PubMed的搜索功能来获取你感兴趣的文章或主题的链接,然后使用requests库来获取链接中的HTML代码。 3. 使用BeautifulSoup库解析HTML代码,提取每篇文献的元数据。你可以从HTML代码中提取标题、作者、发表日期、摘要等信息。 4. 将文献信息存储到DataFrame中。使用pandas库来存储文献信息,并将其导出为CSV或Excel文件。 下面是一个简单的Python程序,用于获取PubMed文献信息并将其导出为CSV文件: ``` import requests from bs4 import BeautifulSoup import pandas as pd # 搜索主题 query = 'cancer' # 构造URL url = f'https://pubmed.ncbi.nlm.nih.gov/?term={query}' # 获取HTML代码 response = requests.get(url) html = response.text # 解析HTML代码 soup = BeautifulSoup(html, 'html.parser') articles = soup.find_all('article') # 提取文献信息 metadata = [] for article in articles: # 获取标题 title = article.find('a', {'class': 'docsum-title'}).text.strip() # 获取作者 authors = article.find('span', {'class': 'docsum-authors'}).text.strip() # 获取发表日期 date = article.find('span', {'class': 'docsum-journal-citation-date'}).text.strip() # 获取摘要 abstract = article.find('div', {'class': 'docsum-content'}).text.strip() # 存储元数据 metadata.append({'Title': title, 'Authors': authors, 'Date': date, 'Abstract': abstract}) # 将元数据存储到DataFrame中 df = pd.DataFrame(metadata) # 导出为CSV文件 df.to_csv('pubmed.csv', index=False) ``` 这段代码会在你的程序所在目录下生成一个名为pubmed.csv的文件,其中包含PubMed文献的元数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值