您现在的位置是:首页 > 技术教程 正文

python爬取Web of science论文信息

admin 阅读: 2024-03-27
后台-插件-广告管理-内容页头部广告(手机)

一、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爬取实战步骤

(一)导入必要的库

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import csv
  4. import time,random

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

  1. class HtmlData:
  2. def __init__(self, soup):
  3. self.title = '' # 存储文章标题
  4. self.author = '' # 存储文章作者
  5. self.abstract = '' # 存储文章摘要
  6. self.keywords = '' # 存储文章关键词
  7. self.author_data = '' # 存储作者信息
  8. self.author_unit = '' # 存储作者单位
  9. self.citation_count = '' # 存储引用数量
  10. self.data = '' # 存储数据信息
  11. self.soup = soup # 存储BeautifulSoup对象
  12. # 第二步,HtmlData类的构造函数初始化了存储文章标题、作者、摘要、关键
  13. # 词等信息的实例变量,并通过BeautifulSoup解析HTML文本提取这些信息。
  14. print(soup.prettify())
  15. self.title = soup.title.text
  16. # self.title = soup.find(attrs={'class':'title'}).text.replace('\n','') # 提取文章标题
  17. try:
  18. self.data = soup.find(attrs={'class':'block-record-info block-record-info-source'}).text # 提取数据信息
  19. except:
  20. pass
  21. items = soup.find_all(attrs={'class':'block-record-info'}) # 提取所有block-record-info元素
  22. for item in items:
  23. if len(item.attrs['class']) > 1:
  24. continue
  25. if 'By:' in item.text: # 提取作者信息和作者单位
  26. author_info = item.text.replace('By:', '').replace('\n', '').replace(' ', '').replace(' ]', ']')
  27. author_info_parts = author_info.split(',')
  28. if len(author_info_parts) > 1:
  29. self.author = author_info_parts[0].strip()
  30. self.author_unit = author_info_parts[1].strip()
  31. else:
  32. self.author = author_info_parts[0].strip()
  33. elif 'Times Cited:' in item.text: # 提取引用数量
  34. self.citation_count = item.text.replace('Times Cited:', '').strip()
  35. elif 'Abstract' in item.text: # 提取摘要信息
  36. self.abstract = item.text
  37. continue
  38. elif 'Keywords' in item.text: # 提取关键词信息
  39. self.keywords = item.text
  40. continue
  41. elif 'Author Information' in item.text: # 提取作者信息
  42. self.author_data = item.text
  43. continue

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

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

  1. def scrape_data(url):
  2. headers = {
  3. '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",
  4. }
  5. response = requests.get(url, headers=headers) # 发送HTTP请求获取页面内容
  6. if response.status_code == 200: # 检查请求的状态码是否为200(成功)
  7. html = response.text # 获取响应的HTML文本
  8. soup = BeautifulSoup(html, 'lxml') # 使用BeautifulSoup解析HTML文本
  9. html_data = HtmlData(soup) # 创建HtmlData对象进行数据提取和存储
  10. # 获取对象信息
  11. title = html_data.title # 获取标题
  12. authors = html_data.author # 获取作者
  13. author_unit = html_data.author_unit # 获取作者单位
  14. citation_count = html_data.citation_count # 获取引用数量
  15. abstract = html_data.abstract # 获取摘要
  16. keywords = html_data.keywords # 获取关键词
  17. # 存储数据到csv
  18. csv_data = [title, authors, author_unit, citation_count, abstract, keywords, url]
  19. # 构建CSV行数据
  20. print(csv_data)
  21. with open('1.csv', encoding='utf-8', mode='a', newline='') as f:
  22. csv_writer = csv.writer(f) # 创建CSV写入器
  23. csv_writer.writerow(csv_data) # 将数据写入CSV文件

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

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

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

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

  1. # 定义一个函数来获取单个页面的数据。这个函数将接受一个URL作为参数,
  2. # 并返回一个包含论文名称、作者名称、作者单位和引用数量的字典列表。
  3. def get_page_data(url):
  4. headers = {
  5. 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.79 Safari/537.36'
  6. }
  7. response = requests.get(url, headers=headers)
  8. soup = BeautifulSoup(response.text, 'html.parser')
  9. # Find the target elements based on their HTML tags and attributes
  10. # The actual tags and attributes might need to be adjusted based on the website's structure
  11. papers = soup.find_all('div', attrs={'class': 'paper'})
  12. data = []
  13. for paper in papers:
  14. name = paper.find('div', attrs={'class': 'name'}).text
  15. author = paper.find('div', attrs={'class': 'author'}).text
  16. affiliation = paper.find('div', attrs={'class': 'affiliation'}).text
  17. citations = paper.find('div', attrs={'class': 'citations'}).text
  18. data.append({
  19. 'name': name,
  20. 'author': author,
  21. 'affiliation': affiliation,
  22. 'citations': citations
  23. })
  24. return data
  25. # 定义一个函数来获取多个页面的数据。这个函数将接受一个基础URL和页面数量作为参数,
  26. # 并返回一个包含所有页面数据的字典列表。
  27. def get_multiple_pages(base_url, num_pages):
  28. all_data = []
  29. for i in range(1, num_pages+1):
  30. url = base_url + str(i)
  31. all_data.extend(get_page_data(url))
  32. time.sleep(1) # Add a delay between requests to avoid overloading the server
  33. return all_data

(五)总体代码

  1. # 导入必要的库
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import csv
  5. import time,random
  6. # 第一步,定义HtmlData类,用于存储和处理从HTML页面中提取的数据。
  7. class HtmlData:
  8. def __init__(self, soup):
  9. self.title = '' # 存储文章标题
  10. self.author = '' # 存储文章作者
  11. self.abstract = '' # 存储文章摘要
  12. self.keywords = '' # 存储文章关键词
  13. self.author_data = '' # 存储作者信息
  14. self.author_unit = '' # 存储作者单位
  15. self.citation_count = '' # 存储引用数量
  16. self.data = '' # 存储数据信息
  17. self.soup = soup # 存储BeautifulSoup对象
  18. # 第二步,HtmlData类的构造函数初始化了存储文章标题、作者、摘要、关键
  19. # 词等信息的实例变量,并通过BeautifulSoup解析HTML文本提取这些信息。
  20. print(soup.prettify())
  21. self.title = soup.title.text
  22. # self.title = soup.find(attrs={'class':'title'}).text.replace('\n','') # 提取文章标题
  23. try:
  24. self.data = soup.find(attrs={'class':'block-record-info block-record-info-source'}).text # 提取数据信息
  25. except:
  26. pass
  27. items = soup.find_all(attrs={'class':'block-record-info'}) # 提取所有block-record-info元素
  28. for item in items:
  29. if len(item.attrs['class']) > 1:
  30. continue
  31. if 'By:' in item.text: # 提取作者信息和作者单位
  32. author_info = item.text.replace('By:', '').replace('\n', '').replace(' ', '').replace(' ]', ']')
  33. author_info_parts = author_info.split(',')
  34. if len(author_info_parts) > 1:
  35. self.author = author_info_parts[0].strip()
  36. self.author_unit = author_info_parts[1].strip()
  37. else:
  38. self.author = author_info_parts[0].strip()
  39. elif 'Times Cited:' in item.text: # 提取引用数量
  40. self.citation_count = item.text.replace('Times Cited:', '').strip()
  41. elif 'Abstract' in item.text: # 提取摘要信息
  42. self.abstract = item.text
  43. continue
  44. elif 'Keywords' in item.text: # 提取关键词信息
  45. self.keywords = item.text
  46. continue
  47. elif 'Author Information' in item.text: # 提取作者信息
  48. self.author_data = item.text
  49. continue
  50. # 第三步,scrape_data函数接收一个URL作为参数,发送HTTP请求获取页面内容,使用BeautifulSoup解析HTML文本,创建HtmlData对象提取数据,并将数据写入CSV文件。
  51. def scrape_data(url):
  52. headers = {
  53. '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",
  54. }
  55. response = requests.get(url, headers=headers) # 发送HTTP请求获取页面内容
  56. if response.status_code == 200: # 检查请求的状态码是否为200(成功)
  57. html = response.text # 获取响应的HTML文本
  58. soup = BeautifulSoup(html, 'lxml') # 使用BeautifulSoup解析HTML文本
  59. html_data = HtmlData(soup) # 创建HtmlData对象进行数据提取和存储
  60. # 获取对象信息
  61. title = html_data.title # 获取标题
  62. authors = html_data.author # 获取作者
  63. author_unit = html_data.author_unit # 获取作者单位
  64. citation_count = html_data.citation_count # 获取引用数量
  65. abstract = html_data.abstract # 获取摘要
  66. keywords = html_data.keywords # 获取关键词
  67. # 存储数据到csv
  68. csv_data = [title, authors, author_unit, citation_count, abstract, keywords, url] # 构建CSV行数据
  69. print(csv_data)
  70. with open('1.csv', encoding='utf-8', mode='a', newline='') as f:
  71. csv_writer = csv.writer(f) # 创建CSV写入器
  72. csv_writer.writerow(csv_data) # 将数据写入CSV文件
  73. # 第四步,main函数生成URL列表,遍历URL列表调用scrape_data函数进行数据爬取和处理。
  74. def main():
  75. url_list = []
  76. search_keywords = 'zhejiang academy of agricultural sciences'#xianghu lab
  77. for i in range(1, 3218): # 构建URL列表
  78. url = f"http://apps.webofknowledge.com/full_record.do?product=UA&search_mode=GeneralSearch&qid=1&SID=5BrNKATZTPhVzgHulpJ&page=1&doc={i}&cacheurlFromRightClick=no"
  79. url += f"&field=Author&value={search_keywords}"
  80. url_list.append(url)
  81. time.sleep(1+random.random())
  82. # print(url_list)
  83. for url in url_list:
  84. scrape_data(url) # 遍历URL列表,爬取并处理数据
  85. if __name__ == '__main__':
  86. 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的用法

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

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

  1. # selenium 4
  2. from selenium import webdriver
  3. from selenium.webdriver.chrome.service import Service
  4. from webdriver_manager.chrome import ChromeDriverManager
  5. 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.找数据所在的地址(ur)是哪个? (网页性质分析<静态网页/动态网页>)<你要的/你不需要的》2.通过代码发送地址的请求(文本数据\js数据\css<祥式层叠表,数据\围片\...)3.数据的解析,解析你要的数据(正则表达式\css选择器 \xpath节点提取)4.数据保存(本地,数据库)。

(1)页面解析

# 据解析步聚# 1.转换数据类型(selector = parsel.Selector(html) # html字符串--> 对象# print(selector)# 2.css提取数据(# p = selector.css('p').get())。解析网页有三种方法:Xpath和正则表达式(re)及BeautifulSoup。

1)css选择器

2)Xpath

        XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的

3)正则表达式(re)

        可参考引用4。

(2)HTML元素

        备注:html解析工具:HTML格式化 、HTML压缩- 站长工具 (sojson.com)

(3)多页面爬取url

        典型的两段式爬取,每个页面有20篇文件,一共38页,分析页面url发现规律之后,只需要改变page={i},通过i的变化获取总url。在网页源代码中发现每篇文件单独的url都可以获取,任务相对比较简单。编写代码获取每篇文件的url,之后提取文字内容即可。

        可参照参考三,其介绍的两类囊括了大部分提取方式。

(4)使用xpath、bs以及正则表达式获取页面url

  1. # 导入必要的库
  2. import requests
  3. from bs4 import BeautifulSoup
  4. import csv
  5. import time,random
  6. from lxml import html
  7. import re
  8. url_list = []# 存储所有url的列表
  9. # 页面url
  10. base_url = 'https://webofscience.clarivate.cn/wos/woscc/summary/c23b8bbe-f8ca-4d1c-b3a6-0c05ee883fbd-b0d498e1/relevance/'
  11. # 遍历所有页面
  12. # 构造当前页面的url
  13. url = base_url + str(1)
  14. # 发送GET请求,获取页面内容
  15. headers = {
  16. '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",
  17. }
  18. response = requests.get(url, headers=headers)
  19. time.sleep(2)
  20. # (1)使用xpath
  21. # 使用正则表达式匹配页面内容中的链接
  22. pattern = r''
  23. links = re.findall(pattern, response.text)
  24. for link in links:
  25. # 处理相对路径并打印链接
  26. full_url = f'https://webofscience.clarivate.cn{link}'
  27. url_list.append(full_url)
  28. time.sleep(1 + random.random())
  29. # (2)使用正则表达式
  30. # # 使用lxml库解析页面内容
  31. # tree = html.fromstring(response.content)
  32. # # 查找所有标签,提取url并存储到列表中
  33. # links = tree.xpath('//a[@class="title title-link font-size-18 ng-star-inserted"]/@href')
  34. # for link in links:
  35. # # 处理相对路径并打印链接
  36. # full_url = f'https://webofscience.clarivate.cn{link}'
  37. # url_list.append(full_url)
  38. # time.sleep(1+random.random())
  39. # (3)使用bs解析
  40. # soup = BeautifulSoup(response.text, 'html.parser')
  41. # # 查找所有标签,提取url并存储到列表中
  42. # link_elements = soup.find_all('a', class_='title title-link font-size-18 ng-star-inserted', href=True)##提取不出标签为a的url链接
  43. # for link_element in link_elements:
  44. # # 处理相对路径并打印链接
  45. # href = link_element['href']
  46. # full_url = f'https://webofscience.clarivate.cn{href}'
  47. # url_list.append(full_url)
  48. # time.sleep(1+random.random())

四、参考引用

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

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

[3]Python爬虫——爬取网站多页数据_爬虫多页爬取-CSDN博客

[4]Xpath和正则表达式及BeautifulSoup的比较-CSDN博客

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索