python爬取Web of science论文信息

news2024/11/28 15:57:37

一、python爬取WOS总体思路

(一)拟实现功能描述

wos里面,爬取论文的名称,作者名称,作者单位,引用数量
要求:英文论文、期刊无论好坏
检索关键词:zhejiang academy of agricultural sciences、 xianghu lab

(二)操作思路介绍

        在Python中,有多种思路可以用来爬取Web of Science(WOS)上的信息。以下是其中几种常见的思路:

  1. 使用HTTP请求库和HTML解析库:这是最常见的爬取网页数据的方法之一。你可以使用Python的 requests 库发送HTTP请求获取网页内容,然后使用 BeautifulSoup 或其他HTML解析库对网页进行解析和提取所需的信息。

  2. 使用API:有些网站提供API接口,允许开发者通过API直接获取数据。如果WoS提供API,你可以通过调用API进行数据获取,通常这种方式更加稳定和高效。

  3. 使用自动化工具:有些情况下,使用传统的HTTP请求和HTML解析方式难以实现数据的完整爬取,例如需要登录或执行JavaScript等情况。此时,你可以使用自动化工具,如 Selenium,来模拟用户操作浏览器,实现完整的页面渲染和数据提取。

        无论选择哪种思路,都需要先了解目标网站的页面结构和数据提取的逻辑。可以通过分析网页源代码、使用浏览器开发者工具等方式来理解网页的结构和数据的位置。

  (三)操作步骤分解

          以操作思路三为例,在WOS上爬取英文论文的名称、作者名称、作者单位和引用数量,以满足给定的检索关键词(zhejiang academy of agricultural sciences和xianghu lab)的操作步骤:

  1. 确定使用的爬虫库:可以使用Python的Selenium库进行网页自动化操作,实现模拟浏览器操作的效果。

  2. 安装必要的依赖库:需要安装Selenium库,以及用来管理Chrome浏览器驱动的webdriver-manager库。可以使用pip命令安装相关依赖库。

  3. 导入必要的模块:需要导入Selenium库的Webdriver和Service类,webdriver_manager库的ChromeDriverManager类,以及time库,用于实现等待页面元素加载的效果。

  4. 设置Chrome浏览器驱动并启动浏览器:通过创建ChromeDriverManager实例来管理Chrome浏览器驱动,并使用webdriver的Chrome类来启动浏览器。

  5. 打开Web of Science网站:使用driver.get()方法打开Web of Science网站,并使用time库实现等待页面加载,确保可以正常爬取相关信息。

  6. 在搜索框中输入关键词并进行搜索:使用find_element()方法找到搜索框的元素,并使用send_keys()方法输入需要搜索的关键词。然后,使用find_element()方法找到搜索按钮的元素,并使用click()方法点击搜索按钮,实现对关键词的检索。

  7. 切换到结果列表视图:使用find_element()方法找到结果列表视图下拉框的元素,并使用click()方法切换到结果列表视图。使用time库实现等待视图切换,确保可以正常爬取相关信息。

  8. 循环遍历每个检索结果,提取所需信息:使用find_elements()方法找到每个检索结果的元素列表,循环遍历列表中每一个元素,使用find_element()方法分别找到论文名称、作者名称、作者单位和引用数量的元素,并使用text属性来获取对应的文本信息。(整理格式成我们所需要的样子)

  9. 关闭浏览器:使用quit()方法关闭浏览器,释放相关系统资源。

        备注:在实际操作中,需要注意遵守相关法律法规和网站的规定,以确保合规的操作。

二、python爬取实战步骤

(一)导入必要的库

import requests
from bs4 import BeautifulSoup
import csv
import time,random

(二)存储和处理从HTML页面中提取的数据。

class HtmlData:
    def __init__(self, soup):
        self.title = ''  # 存储文章标题
        self.author = ''  # 存储文章作者
        self.abstract = ''  # 存储文章摘要
        self.keywords = ''  # 存储文章关键词
        self.author_data = ''  # 存储作者信息
        self.author_unit = ''  # 存储作者单位
        self.citation_count = ''  # 存储引用数量
        self.data = ''  # 存储数据信息
        self.soup = soup  # 存储BeautifulSoup对象
# 第二步,HtmlData类的构造函数初始化了存储文章标题、作者、摘要、关键
# 词等信息的实例变量,并通过BeautifulSoup解析HTML文本提取这些信息。
        print(soup.prettify())
        self.title = soup.title.text
        # self.title = soup.find(attrs={'class':'title'}).text.replace('\n','')  # 提取文章标题

        try:
            self.data = soup.find(attrs={'class':'block-record-info block-record-info-source'}).text  # 提取数据信息
        except:
            pass
        
        items = soup.find_all(attrs={'class':'block-record-info'})  # 提取所有block-record-info元素
 
        for item in items:
            if len(item.attrs['class']) > 1:
                continue
            if 'By:' in item.text:  # 提取作者信息和作者单位
                author_info = item.text.replace('By:', '').replace('\n', '').replace('  ', '').replace(' ]', ']')
                author_info_parts = author_info.split(',')
                if len(author_info_parts) > 1:
                    self.author = author_info_parts[0].strip()
                    self.author_unit = author_info_parts[1].strip()
                else:
                    self.author = author_info_parts[0].strip()
            
            elif 'Times Cited:' in item.text:  # 提取引用数量
                self.citation_count = item.text.replace('Times Cited:', '').strip()
            elif 'Abstract' in item.text:  # 提取摘要信息
                self.abstract = item.text
                continue
            elif 'Keywords' in item.text:  # 提取关键词信息
                self.keywords = item.text
                continue
            elif 'Author Information' in item.text:  # 提取作者信息
                self.author_data = item.text 
                continue

(三)提取html文本并保存到csv文件

        scrape_data函数接收一个URL作为参数,发送HTTP请求获取页面内容,使用BeautifulSoup解析HTML文本,创建HtmlData对象提取数据,并将数据写入CSV文件。

def scrape_data(url):
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    }
    response = requests.get(url, headers=headers)  # 发送HTTP请求获取页面内容
    
    if response.status_code == 200:  # 检查请求的状态码是否为200(成功)
        html = response.text  # 获取响应的HTML文本
        soup = BeautifulSoup(html, 'lxml')  # 使用BeautifulSoup解析HTML文本
        html_data = HtmlData(soup)  # 创建HtmlData对象进行数据提取和存储
        
        # 获取对象信息
        title = html_data.title  # 获取标题
        authors = html_data.author  # 获取作者
        author_unit = html_data.author_unit  # 获取作者单位
        citation_count = html_data.citation_count  # 获取引用数量
        abstract = html_data.abstract  # 获取摘要
        keywords = html_data.keywords  # 获取关键词
        
        # 存储数据到csv
        csv_data = [title, authors, author_unit, citation_count, abstract, keywords, url]          
        # 构建CSV行数据
        print(csv_data)
        
        with open('1.csv', encoding='utf-8', mode='a', newline='') as f:
            csv_writer = csv.writer(f)  # 创建CSV写入器
            csv_writer.writerow(csv_data)  # 将数据写入CSV文件

(四)生成url列表,开始爬虫

        第四步,main函数生成URL列表,遍历URL列表调用scrape_data函数进行数据爬取和处理。

def main():
    url_list = []
    
    search_keywords = 'zhejiang academy of agricultural sciences'#xianghu lab
    
    for i in range(1, 3218):  # 构建URL列表
        url = f"http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc={i}&cacheurlFromRightClick=no"
        url += f"&field=Author&value={search_keywords}"
        url_list.append(url)
        time.sleep(1+random.random())
    # print(url_list) 
    for url in url_list:
        scrape_data(url)  # 遍历URL列表,爬取并处理数据

if __name__ == '__main__':
    main()

      (1)  备注:根据搜索完成页面进行爬取。

# 定义一个函数来获取单个页面的数据。这个函数将接受一个URL作为参数,
# 并返回一个包含论文名称、作者名称、作者单位和引用数量的字典列表。
def get_page_data(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
    }
    response = requests.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    
    # Find the target elements based on their HTML tags and attributes
    # The actual tags and attributes might need to be adjusted based on the website's structure
    papers = soup.find_all('div', attrs={'class': 'paper'})
    
    data = []
    for paper in papers:
        name = paper.find('div', attrs={'class': 'name'}).text
        author = paper.find('div', attrs={'class': 'author'}).text
        affiliation = paper.find('div', attrs={'class': 'affiliation'}).text
        citations = paper.find('div', attrs={'class': 'citations'}).text
        
        data.append({
            'name': name,
            'author': author,
            'affiliation': affiliation,
            'citations': citations
        })
    
    return data


# 定义一个函数来获取多个页面的数据。这个函数将接受一个基础URL和页面数量作为参数,
# 并返回一个包含所有页面数据的字典列表。
def get_multiple_pages(base_url, num_pages):
    all_data = []
    for i in range(1, num_pages+1):
        url = base_url + str(i)
        all_data.extend(get_page_data(url))
        time.sleep(1)  # Add a delay between requests to avoid overloading the server
    return all_data

(五)总体代码


# 导入必要的库
import requests
from bs4 import BeautifulSoup
import csv
import time,random

# 第一步,定义HtmlData类,用于存储和处理从HTML页面中提取的数据。
class HtmlData:
    def __init__(self, soup):
        self.title = ''  # 存储文章标题
        self.author = ''  # 存储文章作者
        self.abstract = ''  # 存储文章摘要
        self.keywords = ''  # 存储文章关键词
        self.author_data = ''  # 存储作者信息
        self.author_unit = ''  # 存储作者单位
        self.citation_count = ''  # 存储引用数量
        self.data = ''  # 存储数据信息
        self.soup = soup  # 存储BeautifulSoup对象
# 第二步,HtmlData类的构造函数初始化了存储文章标题、作者、摘要、关键
# 词等信息的实例变量,并通过BeautifulSoup解析HTML文本提取这些信息。
        print(soup.prettify())
        self.title = soup.title.text
        # self.title = soup.find(attrs={'class':'title'}).text.replace('\n','')  # 提取文章标题

        try:
            self.data = soup.find(attrs={'class':'block-record-info block-record-info-source'}).text  # 提取数据信息
        except:
            pass
        
        items = soup.find_all(attrs={'class':'block-record-info'})  # 提取所有block-record-info元素
 
        for item in items:
            if len(item.attrs['class']) > 1:
                continue
            if 'By:' in item.text:  # 提取作者信息和作者单位
                author_info = item.text.replace('By:', '').replace('\n', '').replace('  ', '').replace(' ]', ']')
                author_info_parts = author_info.split(',')
                if len(author_info_parts) > 1:
                    self.author = author_info_parts[0].strip()
                    self.author_unit = author_info_parts[1].strip()
                else:
                    self.author = author_info_parts[0].strip()
            
            elif 'Times Cited:' in item.text:  # 提取引用数量
                self.citation_count = item.text.replace('Times Cited:', '').strip()
            elif 'Abstract' in item.text:  # 提取摘要信息
                self.abstract = item.text
                continue
            elif 'Keywords' in item.text:  # 提取关键词信息
                self.keywords = item.text
                continue
            elif 'Author Information' in item.text:  # 提取作者信息
                self.author_data = item.text 
                continue


# 第三步,scrape_data函数接收一个URL作为参数,发送HTTP请求获取页面内容,使用BeautifulSoup解析HTML文本,创建HtmlData对象提取数据,并将数据写入CSV文件。
def scrape_data(url):
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36",
    }
    response = requests.get(url, headers=headers)  # 发送HTTP请求获取页面内容
    
    if response.status_code == 200:  # 检查请求的状态码是否为200(成功)
        html = response.text  # 获取响应的HTML文本
        soup = BeautifulSoup(html, 'lxml')  # 使用BeautifulSoup解析HTML文本
        html_data = HtmlData(soup)  # 创建HtmlData对象进行数据提取和存储
        
        # 获取对象信息
        title = html_data.title  # 获取标题
        authors = html_data.author  # 获取作者
        author_unit = html_data.author_unit  # 获取作者单位
        citation_count = html_data.citation_count  # 获取引用数量
        abstract = html_data.abstract  # 获取摘要
        keywords = html_data.keywords  # 获取关键词
        
        # 存储数据到csv
        csv_data = [title, authors, author_unit, citation_count, abstract, keywords, url]  # 构建CSV行数据
        print(csv_data)
        
        with open('1.csv', encoding='utf-8', mode='a', newline='') as f:
            csv_writer = csv.writer(f)  # 创建CSV写入器
            csv_writer.writerow(csv_data)  # 将数据写入CSV文件

# 第四步,main函数生成URL列表,遍历URL列表调用scrape_data函数进行数据爬取和处理。
def main():
    url_list = []
    
    search_keywords = 'zhejiang academy of agricultural sciences'#xianghu lab
    
    for i in range(1, 3218):  # 构建URL列表
        url = f"http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc={i}&cacheurlFromRightClick=no"
        url += f"&field=Author&value={search_keywords}"
        url_list.append(url)
        time.sleep(1+random.random())
    # print(url_list) 
    for url in url_list:
        scrape_data(url)  # 遍历URL列表,爬取并处理数据

if __name__ == '__main__':
    main()

三、python爬取过程中可能遇到的问题及解决方案

 Q1:ModuleNotFoundError: No module named 'webdriver_manager'

        参考:使用ChromeDriverManager自动更新Chromedriver_Richard.sysout的博客-CSDN博客

         解决方案:(1)安装的代码除了问题,输入的是:pip install webdrivermanager,应在控制台中输入以下内容:

pip install webdriver_manager

        (2)安装版本不对。

        这里是selenium3.x的用法

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
#安装并返回安装成功的path
driver_path=ChromeDriverManager().install()
#使用对应path下的driver驱动Chrome
driver = webdriver.Chrome(executable_path=driver_path)

        当然如果使用的是selenium4.x:

# selenium 4
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

        通过它的源码,我们可以得知,基本的逻辑是将Chromedriver安装在某个目录下,将driver的目录返回给我们,创建对象的时候,将path 作为参数传入。

Q2:用soup.find()时出现错误AttributeError NoneType object has no attribute?

参考:AttributeError NoneType object has no attribute_soup.find 未找着-CSDN博客        

原因及分析:我使用的soup.find()没有找到这个class为"ArticlePicBox Aid43 "的div中有空格。

 Q3:如何更改浏览器内开发工具的位置?

解决办法:

1.打开浏览器,点击F12,打开开发工具;
2.点击开发工具右上角的三个竖点;
3.出现若干个选项如图所示,可选择适合自己的排版(左右下或新增页);

 Q4:如何获取一个网页的User-Agent?

四、参考引用

[1]Web of science文章信息爬取_爬取web of science数据

[2]User-Agent||如何获取一个网页的User-Agent?-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1166446.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【并查集】93 岛屿数量

岛屿数量 题解1 DFS(图论经典方法)题解2 BFS(遍历(DFS展开【顺序不同】))题解3 并查集(学习理解) 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格&…

TikTok未来展望:数字创新的下一浪潮

随着全球数字时代的蓬勃发展,TikTok已经成为一个巨大的现象,吸引了数以亿计的用户,尤其是年轻一代。这个短视频分享平台已经深刻影响了社交媒体、娱乐和文化。然而,TikTok未来的发展前景如何?本文将探讨TikTok的未来展…

哈希的开放定址法的实现【C++】

哈希的开放定址法的实现【C】 1 概述2 线性探测2.1 插入2.2 查找2.3 删除2.6 完整代码2.5 线性探测的优缺点 3. 二次探测 1 概述 开放定址法也叫闭散列,是解决哈希冲突的一种方法,当发生哈希冲突之后,如果哈希表没有被装满(正常情况哈希表不会…

饥荒联机版 Don‘t Starve Together(WinMac)最新中文学习版

《饥荒联机版》是由Klei自主开发的开放世界冒险游戏。在这个游戏中,玩家将扮演各种各样的人物,这些人物不幸来到了一个神秘的异世界。在旅行中,玩家会邂逅性格各异、能力独特的同伴们,并和他们一起生存下去并征服异世界。游戏中的…

每日一题 117. 填充每个节点的下一个右侧节点指针 II (中等,树)

BFS,一层层去搜索整棵树,然后建立next关系即可,下面给出的代码的空间复杂度是O(n)的O(1) 的做法,当构建完上一层的next关系后,我们就可以像链表一样从左到右访问上一层的节点,显然在访问的过程中&#xff0…

N-132基于springboot,vue人事管理系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vueelementUI 服务端技术:springbootmybatis-plus 本项…

自定义类型结构体(下)

目录 结构体传参结构体实现位段什么是位段位段的内存分配位段的跨平台问题总结: 位段的应用位段使用的注意事项** 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒 个人主页 🥸🥸&a…

DataCastle企业风险算法赛实战(进阶难度)

目录 一、数据读取及分析 1、数据读取 2、数据分析 二、数据挖掘 三、模型构建及评估 四、划重点 推荐相关文章 去年在DataCastle上参加了华录杯算法赛,初赛前10、进复赛就没打了。相比于之前文章 kaggle风控建模实战(文末附链接)&…

智慧财务的未来

信息化时代,财务管理不再局限于传统的手工操作,而是借助RPA技术实现了自动化、智能化的转型。智慧财务作为财务管理的一种新模式,将为企业提供更加高效、便捷的服务,使企业能够更好地适应市场需求的变化,在瞬息万变的市…

批量删除文件名中的某些文字

怎么批量删除文件名中的某些文字?在整理电脑文件的时候,我们经常需要处理大量文件的重命名工作。当你的文件名称包含不必要或重复的字符时,可以进行批量删除,以使文件名称更简洁、清晰,提高可读性和识别性。例如&#…

【蓝桥杯软件赛 零基础备赛20周】第2周——常考知识点+判题

文章目录 0. 第1周答疑1. 常考知识点2. 蓝桥杯怎么判题2.1 判题系统如何判题2.2 测试数据和得分的关系2.3 自己做测试数据 3. 备赛计划4. 本周刷题 0. 第1周答疑 问题1:蓝桥杯怎么报名,什么时候报名? 答:集体报名或个人报名。大…

【word技巧】ABCD选项如何对齐?

使用word文件制作试卷,如何将ABCD选项全部设置对齐?除了一直按空格或者Tab键以外,还有其他方法吗?今天分享如何将ABCD选项对齐。 首先,我们打开【替换和查找】,在查找内容输入空格,然后点击全部…

利用关键字批量整理文件:用关键字轻松移动多个文件到指定文件夹

在日常生活和工作中,我们经常需要处理大量的文件,随着时间的推移,电脑中的文件越来越多,而文件的命名可能并不规范,导致查找和整理变得非常困难。因此,我们需要一种高效的文件管理方法,以方便我…

一种用醋酸刻蚀氧化铜的新方法

引言 由于乙酸不会氧化铜表面,因此乙酸常用于去除氧化铜而不侵蚀铜膜。乙酸还具有低表面张力,易于从表面移除。因此,不需要去离子(DI)水冲洗来移除残留的乙酸,可以防止水冲洗导致的铜再氧化。 英思特研究了在低温下用乙酸去除氧…

SSE加速随笔

Intel Intrinsics Guide 搞懂SSE 寄存器与指令数据细节 SSE指令集推出时,Intel公司在Pentium III CPU中增加了8个128位的SSE指令专用寄存器,称作XMM0到XMM7。这些XMM寄存器用于4个单精度浮点数运算的SIMD执行,并可以与MMX整数运算或x87浮点运…

01、SpringBoot + MyBaits-Plus 集成微信支付 -->项目搭建

目录 SpringBoot MyBaits-Plus 集成微信支付 之 项目搭建1、创建boot项目2、引入Swagger作用:2-1、引入依赖2-2、写配置文件进行测试2-3、访问Swagger页面2-4、注解优化显示 3、定义统一结果作用:3-1、引入lombok依赖3-2、写个统一结果的类-->RR类的…

Windows、程序员必装的工具

一、Typora 啥也不说了直接上图 Markdown语法 Typora免费版 提取码:av01 二维码: 1)页面展示 2)主题 3)偏好设置 4)Markdown语法设置偏好 5)编辑器 6)系统 二、Snipaste Snipaste…

Java反射详解:入门+使用+原理+应用场景

反射非常强大和有用,现在市面上绝大部分框架(spring、mybatis、rocketmq等等)中都有反射的影子,反射机制在框架设计中占有举足轻重的作用。 所以,在你Java进阶的道路上,你需要掌握好反射。 怎么才能学好反射,我们需要…

STM32CubeIDE安装中文语言包

软件包地址:https://archive.eclipse.org/technology/babel/update-site/R0.16.1/2018-12/ 打开IDE:Help--->Install New Software--->Add Locations:输入软件包地址 等待搜索结束:选择中文语言包,单击next进行安…

QQ邮箱发送验证码源码/API+HTML源码/支持API接口、自定义地址和内容/简单易用

源码简介: 一款支持API接口、自定义QQ邮箱地址、自定义邮箱标题和内容的源码。 近来我正在开发一款新的软件,但在注册环节中遇到了一个问题:需要使用QQ邮箱验证码。因此,我积极寻找相关的API接口或开发文档,但遗憾的…