使用python+ BeautifulSoup+selenium爬取百度学术文献的引用

因为课题研究的需要,我需要爬取百度学术文献的引用,这里做一下记录。首先需要安装selenimu和beautifulsoup。这两个我都选择使用pip安装。安装完成后,下载chromedriver,并进行环境配置,这部分网上有教程,我也是根据教程完成的。

安装、配置完成后就可以进行爬取了。首先在百度学术首页输入关键词,打开要爬取的页面。我们先来看,如果自己复制粘贴的过程是怎样的,第一步需要点击“<>引用”,

第二步鼠标点击“BibTex”,

第三步就是获取具体的参考文献。

爬取完当前参考文献后,关掉第三步里的窗口,关掉第二步里的引用,继续点击下一条文献的引用,直到本页爬取完毕,点击下一页继续进行爬取。这是一个大体的流程,使用selenium我也是这样做的。

在引用上右键单击,选择检查,查看引用的xpath,除此之外还需要BibTex的xpath。

下面是代码。

from bs4 import BeautifulSoup
from selenium import webdriver
import time

'''
判断元素是否存在
'''
def isElementExist(driver, element):
    flag = True
    try:
        driver.find_element_by_xpath(element)
        return flag

    except:
        flag = False
        return flag


url = 'https://xueshu.baidu.com/s?wd=study&tn=SE_baiduxueshu_c1gjeupa&sc_f_para=sc_tasktype%3D%7BfirstSimpleSearch%7D&sc_hit=1&ie=utf-8&sort=sc_time'  # 所要爬取的百度学术的页面
i = 1  # 页码
j = 1  # 当前页面的文献计数,一个页面有十篇文献
refs = []  # 存储参考文献

driver = webdriver.Chrome("C:/Users/AppData/Local/Google/Chrome/Application/chromedriver.exe")
driver.get(url)
time.sleep(10)
while i <= 20:
    while j <= 400:  # 我随便设置的不会到的文献数
        print(j)
        h1 = driver.window_handles
        print('h1=', h1)
        driver.switch_to.window(driver.window_handles[0])  # 切换到第一个window
        if j % 10 != 1:
            driver.find_element_by_xpath('//*[@id="sc_quote_wr"]/div[1]/a').click()  # 不是第一条参考文献的话,关掉引用
            time.sleep(2)
        if j % 10 == 0:  # 判断当前文献是不是当前页面的最后一条  //*[@id="sc_quote_wr"]/div[2]/div[2]/a[1]
            break
        else:
            xpath = '//*[@id="' + str(j) + '"]/div[2]/div/a[2]'  # 引用的xpath,该xpath的不同在于str(j)的位置,从1开始每条文献加1,下一页也在上一页最后一条文献的基础上加1
            time.sleep(2)
            if isElementExist(driver, xpath):
                driver.find_element_by_xpath(xpath).click()  # 点击引用
                time.sleep(5)
                if isElementExist(driver, '//*[@id="sc_quote_wr"]/div[2]/div[2]/a[1]'):
                    driver.find_element_by_xpath('//*[@id="sc_quote_wr"]/div[2]/div[2]/a[1]').click()  # 点击bibtex
                else:
                    driver.find_element_by_xpath('//*[@id="sc_quote_wr"]/div[1]/a').click()  # 关掉引用
                    j = i * 10
                    break
                h2 = driver.window_handles
                print('h2=', h2)
                driver.switch_to.window(driver.window_handles[1])  # 转到第二个window,爬取具体内容
                content = driver.page_source.encode('utf-8')
                soup = BeautifulSoup(content, 'lxml')
                ref = soup.get_text()
                refs.append(ref)
                j += 1
                driver.close()
            else:
                j = i * 10
                break
    print(j)
    if i == 1:
        driver.find_element_by_xpath('//*[@id="page"]/a[8]').click()  # 点击下一页,第一页的下一页的xpath和其他页的下一页的xpath不同
        time.sleep(5)
    else:
        driver.find_element_by_xpath('//*[@id="page"]/a[9]').click()
        time.sleep(5)
    i += 1
    j += 1

driver.quit()

with open('F:/Experiment/BaiduXueshu/Englishoutput/study.txt', 'a', encoding='utf-8') as f:  # 写入文件
    for ref in refs:
        f.write(str(ref) + '\n')

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值