Python抓取期刊ISO缩写

想法的来源

在投稿SCI期刊时,某些期刊要求引用文献部分要引用期刊的缩写。期刊的缩写有两种,JCR缩写和ISO缩写,二者对于某些期刊是不同的。而所用的文献管理软件Noteexpress中自带的是JCR缩写形式,ISO期刊需要逐条查询并导入,因此产生了从JCR官网上自动查询并抓取缩写的想法。

确定方法

由于博主之前完全没有接触过爬虫,对于python的了解也很少,甚至连其基本的语法都不清楚,因此在确定爬取方法的过程中走了一些弯路。刚开始采用的是requests_html模块,此模块对于部分网页是很好用的,但是在抓取jcr官网时,总是得不到对应的内容(有人说是因为web of science jcr是勇javascript进行动态渲染的,具体的原因我还不清楚),后来发现可以用selenium进行模拟浏览器访问,尝试之后发现非常直观而且上手非常容易,因此采用这种方式进行抓取。

抓取期刊信息过程

我的目的是抓取某个(或者多个)领域的期刊相关信息,包括JCR缩写、ISO缩写,ISSN,IF和分区等信息。首先,确定JCR的网址为https://jcr.clarivate.com/jcr/browse-journals,在这个网站上,可以通过领域筛选期刊并查看其信息。手动查询的过程为:筛选期刊,点击期刊打开其详情页,然后抓取对应的信息。我们要做的就是通过selenium来自动完成我们的操作。

主要过程如下

配置selenium

selenium的安装方法与python其他的模块并无不同,网上教程很多,此处不再赘述。需要注意的是,需要浏览器对应的webdriver,作为系统自动调用的浏览器程序。chrome,edge和firefox浏览器都有其对应的webdriver,安装时选取的webdriver安装包需要与系统已经安装的浏览器版本相对应。

使用selenium打开网站

这步的主要操作是,导入selenium,打开对应的webdriver,在webdriver中访问网站,然后进入期刊浏览页。

具体的代码如下,其中maximize_window()是最大化窗口。

from selenium import webdriver, common
url = 'https://jcr.clarivate.com/jcr/browse-journals'
driver = webdriver.Firefox()
driver.maximize_window()
driver.get(url)
driver.implicitly_wait(30)

进入期刊浏览页

JCR首页为

需要点击如图所示按钮,进入期刊浏览页。只要让浏览器模拟点击这个位置即可。那么,问题来了,浏览器怎么知道你要点击哪里呢?

网页的每一个区域都有其对应的元素,确定了对应的元素,便可以确定其位置,还可以访问元素中的文本等信息。因此,我们只要确定Brouse journals按钮对应的元素,便可确定其位置,并进行点击操作(实际上,selenium可以直接对元素进行点击,不需要先获取其位置)。selenium提供了多种选取元素的方法,可以通过title, selector, id等获取。作为菜鸡,我最常用的是通过selector和id。如下图所示,在浏览器中按F12,查看网站的元素,可以选中目标元素,复制其selector。id也可以通过查看元素的属性获取,具体的可以看相关教程,比较简单。

 获取到元素后,就可以对元素进行点击操作,进入下一页,代码如下

driver.find_element_by_css_selector('body > div.incites-jcr3-fe-root > div.incites-jcr3-fe-home.ng-star-inserted > '
                                    'div > div > div.col-sm-8.col-md-8.col-lg-8 > section.list-of-pages-section > div '
                                    '> div.col-sm-3.col-md-3.col-lg-3.pr-0.pl-0.action').click()

 上述代码中,括号中的文本就是对应元素的selector

点击筛选器并进行筛选

由于我并不需要获取全部sci期刊的信息(selenium的速度比较慢),只需要获取相关领域的期刊信息,因此需要通过筛选器来筛选所需要的领域中的期刊。具体的操作过程为:点击筛选器按钮,选择categories栏,而后选中对应的领域,点击apply按钮应用选择,等待网页刷新。整个过程中,模拟操作还是依次点击对应的按钮,不需要新的知识。

    def JournalFilter(driver, cate_array):
        """
        根据指定分类,筛选期刊
        :param driver: a webdriver object in selenium
        :param cate_array: a list of int number, represents the categories using to filtered
        :return: if succeed, return 1
        """
        # find the filter icon
        icon_filter_up = driver.find_element_by_css_selector(
            'body > div.incites-jcr3-fe-root > div.incites-jcr3-fe-browse-journals.ng-star-inserted > div > div.row.mr-0.ml-0.bottom-space > div.col-sm-1.col-md-1.col-lg-1.filter-col-pad')
        icon_filter_up.find_element_by_css_selector('#initial > mat-sidenav-content').click()
        ############ 然后,找到对应的categories并点击
        icon_category_up = icon_filter_up.find_element_by_id('collapsed').find_element_by_css_selector(
            '#collapsed > div > div > section.accordion-section')
        icon_category = icon_category_up.find_element_by_id('panel-1')
        icon_category.click()
        driver.implicitly_wait(30)
        ############## ----------- 寻找并点击7个领域
        # cate_array = [61, 111, 118, 119, 121, 193, 269]
        category_expended = driver.find_element_by_id('expandedCategories')
        search_area = category_expended.find_element_by_id('cdk-accordion-child-21')
        for i in range(len(cate_array)):
            area_icon = search_area.find_element_by_id('mat-checkbox-' + str(cate_array[i]))
            area_label = area_icon.find_element_by_css_selector('#mat-checkbox-' + str(cate_array[i]) + ' > label')
            area_label.click()
        ## -------------- 点击apply 进行筛选 -------------##
        apply_icon = category_expended.find_element_by_css_selector(
            '#expandedCategories > div > div > section.btn-section > button.mat-focus-indicator.cdx-but-md.apply-btn-style.pull-right.mat-flat-button.mat-button-base')
        apply_icon.click()
        return 1

此处需要注意的有两点:

1 通过浏览器源码复制得到的某些元素的selector可能会比较短,因此无法直接获取对应的元素,需要先获取其父元素,然后通过其父元素获取我们需要的元素。以筛选器为例说明,筛选器按钮直接复制得到的selector是#initial > mat-sidenav-content,不能直接用于选取元素,因此需要先获取#initial对应的父元素。在上述代码中,icon_filter_up是筛选器的父元素,我们需要的筛选器按钮是其下属的 mat-sidenav-content元素。

2 cate_array为数组,其中的元素用于确定领域对应的元素。以automation&control system领域为例,其id为‘mat-checkbox-61’,最后的数字61便可以看作其编号,是网站开发者给定的。因此,同各国指定不同的数字,便可选取不同的领域。

打开期刊详情页

筛选出需要的期刊后,可依次打开对应的期刊详情页,获取所需信息。此部分的主要操作就是,依次点击期刊名,然后切换到期刊详情页。

1 对期刊名的点击操作和前文没有什么区别,即“依次选择对应的元素,对元素执行点击操作”此处不再赘述。需要注意的是,期刊数量过多时,不能在一页中全部显示,因此需要进行翻页操作,翻页操作也可以通过对应元素的点击来实现。

2 标签页的切换。点击期刊后,浏览器会自动打开一个新标签页,对新标签页的操作需要首先通过selenium切换到对应的此标签页。代码如下

tabs = driver.window_handles
driver.switch_to.window(tabs[1])

第一行用于获取浏览器所有标签页的句柄,第二行代码是切换到新标签页(新标签页的索引默认是1,旧标签页的索引默认是0)。

获取期刊缩写

打开并切换到详情页后,可根据自己的需要对期刊的信息进行抓取。

以期刊的JCR缩写为例,其对应的selector为'body > div.incites-jcr3-fe-journal-profile-page-root > div.incites-jcr3-fe-journal-profile.ng-star-inserted > div.incites-jcr3-fe-journal-information > div > div.col-sm-6.col-md-6.col-lg-6.summary-tile > div > div:nth-child(3)'。JCR缩写为元素中的text属性,因此代码如下

title_e = container.find_element_by_css_selector('p.title')
Abb_JCR = container.find_element_by_css_selector('div > div:nth-child(3) > p.content-text').text

在使用selenium中,遇到了一些问题,具体可见selenium中遇到的问题​​​​​​​

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值