首页 > 其他分享 >基于BeautifulSoup实现pubmed文献摘要的爬虫与无格式输出

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

时间:2024-05-31 11:04:35浏览次数:21  
标签:url text BeautifulSoup 爬虫 content re pubmed file PMID

一、实现背景

        为了满足项目数据集的构造,我们需要针对各领域医学文献的摘要进行爬取工作,因此编写了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作为文件名确保文件唯一性。

标签:url,text,BeautifulSoup,爬虫,content,re,pubmed,file,PMID
From: https://blog.csdn.net/2201_75499442/article/details/139321124

相关文章

  • 【爬虫软件】关键词批量采集小红书笔记正文工具
    一、背景介绍1.1爬取目标熟悉我的小伙伴都了解,我之前开发过2款软件:【xhs爬虫软件】用Python开发的小红书关键词搜索批量采集工具【爬虫软件】用Python开发的小红书详情批量采集工具,含笔记正文、转评赞藏等现在介绍的这个软件,相当于以上2个软件的结合版,即根据关键词爬取笔......
  • 【如何用爬虫玩转石墨文档?】
    ......
  • 八爪鱼爬虫+Kimi AI做数据分析,同事都来围观
    因为我是做汽车行业的,可以用八爪鱼爬虫抓取汽车之家和微博上的汽车文章内容,分析各种电动汽车口碑数据。之前,我写过很多Python网络爬虫的案例,使用requests、selenium等技术采集数据,这次尝试去采集小米SU7在微博、汽车之家上的舆论数据,分析下小米SU7的口碑到底怎么样,用户关心和......
  • 简单网页爬虫(java)
    一、绪论 1.功能通过用户输入的一个网址,该程序可以不重复地打印出这个网址中涉及到的一系列其他网址信息2.预备知识1.java的基础语法2.java文本IO及异常处理二、代码实现1.代码思路创建两个数组,一个数组存取已经访问过的网址,一个数组存取准备访问地网址,大概的思想和BF......
  • 【爬虫软件】用Python开发的小红书详情批量采集工具,含笔记正文、转评赞藏等
    一、背景介绍1.1爬取目标用python开发的爬虫采集软件,可自动按笔记链接抓取笔记的详情数据。为什么有了源码还开发界面软件呢?方便不懂编程代码的小白用户使用,无需安装python,无需改代码,双击打开即用!软件界面截图:爬取结果截图:结果截图1:结果截图2:结果截图3:以上。1.2......
  • 云盘搜爬虫
    importrequestscookies={'__vtins__3Egp6W6ZKbl41A1y':'%7B%22sid%22%3A%20%22bc2a93f0-68aa-5609-b792-91647e3f0813%22%2C%20%22vd%22%3A%201%2C%20%22stt%22%3A%200%2C%20%22dr%22%3A%200%2C%20%22expires%22%3A%201717056272498%2C%20%22ct%22%......
  • 新一代爬虫平台!不写代码即可完成爬虫...
    大家好,我是Java陈序员。今天,给大家介绍一个优秀的爬虫平台,无需编写代码,只要通过简单的流程配置,即可实现爬虫。关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍spider-flow——新一代爬虫平台,以流程图的方式定义爬虫,是......
  • python爬虫不报错也不出结果?
    刚学爬虫对着视频想爬个网络小说但是代码写完不报错也不出结果,大佬们帮忙看看啥情况importreimportrequestsfromlxmlimportetreeheaders={"User-Agent":"Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/125.0.0......
  • Python网络爬虫的时候json=就是让你少写个json.dumps()
    大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和我一样会有一个疑问吧,为啥这次要用json=data啊?因为请求头的content-type这里对......
  • python 队列生产者消费者爬虫
    当使用Python编写一个基于队列的生产者消费者爬虫时,我们通常会使用threading或multiprocessing模块来处理并发,并使用queue模块来管理数据队列。下面是一个详细的示例,该示例展示了如何使用生产者线程生成URL,消费者线程爬取这些URL的内容。请注意,这里为了简化示例,我们将不会实际进......