您好,欢迎来到二三娱乐。
搜索
您的当前位置:首页Python+Selenium,让浏览器自动帮你下文献

Python+Selenium,让浏览器自动帮你下文献

来源:二三娱乐

在做学术、搞科研的过程中,我们往往需要针对一个特定的主题下载海量的文献。在把几百篇文献下载到电脑的过程中,假如遇到不够友好的数据库不提供批量下载的功能,怎么办?我恰好遇到了这样的批量下载的科研任务和批量下载功能受限的数据库网站……

一、需求分析

搞科研很重要的一步就是找文献,其中最基础的工作是先在特定主题词下找到文献。那我们需要浏览器做的事情就清楚了,就是帮我们下文献,特别是海量的文献。

二、流程分析

我们知道,在输入主题词后,下载文献的过程重重复复就是那几个步骤:

  1. 点击下载按钮;
  2. 开始下载,下载完成;
  3. 回到列表页面;
  4. 点击下一个文献,继续下载;
  5. 完成这一个页面的下载流程后,点击下一页,重复上述过程。

这么简单的流程,为啥不能交给电脑呢?点击下载按钮,实质上就是打开下载链接,那么我们可以将上述过程简化为两步:

  1. 获取所有下载链接;
  2. 分别点击每一个下载链接进行下载。

三、编程实现

1、Python

2、Selenium

在解压、安装完成后,需要把这个.exe放到python的lib文件夹,我的文件夹路径是:F:\SOFTWARE\Anaconda3\Library\bin。之后,使用如下代码测试是否Selenuim能用。

from selenium import webdriver
driver = webdriver.Chrome()

3、网站分析

一般按F12可以进入浏览器的开发者工具,选取这个元素,发现还真是。

之后,我们选取“下一页”的元素。

4、阅读文档

1)等待页面加载完成
等待页面加载完成(Waits)可以分为显式等待和隐式等待。显式等待就像我们等网页加载好再操作一样,浏览器等待网页加载完再进行操作。

#显式等待
from selenium import webdriver
from  import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "myDynamicElement"))
    )
finally:
    driver.quit()

2)查找元素
经过分析,本次编程使用到的元素主要是<a>,css选择器主要是class和id,那么可以通过xpath、class_name、id_name、css_selector等方式查找元素。代码如下:

driver.find_element_by_xpath("//form[@id='loginForm']")
driver.find_elements(By.XPATH, '//button')
driver.find_element_by_class_name('content')
driver.find_element_by_id('loginForm')
driver.find_element_by_css_selector('p.content')

3)点击效果
要实现点击效果,只需要在查找的元素之后,加上.click()。

#例如
driver.find_element_by_xpath("//form[@id='loginForm']").click()

5、编程过程

首先,是要引进我们用到的库。

import os
from time import sleep
from selenium import webdriver

from  import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

按照我们设计的流程编写程序的主干部分,涉及到具体函数先编个名字取代。

if __name__ == "__main__":
    #1、初始化
    browser = browser_init(True)
    openPage(browser)
    paper_downloadLinks = []
    
    #2、翻页,批量选取链接
    pageNum = 10
    curPage = 1
    while curPage < pageNum:
        switchNextPage(browser)
        get_download_page(browser,paper_downloadLinks)
        print("第%d页"% curPage)
        curPage += 1
        
    browser.quit()
    print("采集了%d条数据"% len(paper_downloadLinks))

    #3、下载
    driver=browser_init(False)
    fail_downLoadUrl=[] 
    do_download(driver,paper_downloadLinks,fail_downLoadUrl)

具体函数如下:

def browser_init(isWait):
    options = webdriver.ChromeOptions()
    prefs = {
        'profile.default_content_settings_popups': 0,
        'download.default_directory': 'F:/desktop_data/元分析文献数据/wiley'
    }
    options.add_experimental_option('prefs', prefs)
    browser = webdriver.Chrome()
    if isWait:
        browser.implicitly_wait(10)
    return browser

def openPage(browser):
    

def get_download_page(browser, paper_downloadLinks):
    for link in browser.find_elements_by_css_selector('a[href^=\/content\/pdf]'):

        dlink=link.get_attribute('href')
        url = dlink
        paper_downloadLinks.append(url)

def switchNextPage(browser):
    browser.find_element(By.XPATH, '//a[@class="next"]').click()
        
def do_download(driver,urls,fail_downLoadUrl):
    for url in urls:
        print(url)     
        try:
            sleep(5)
            driver.get(url)
            print("download success")
        except Exception as e:
            print("download fail")
            fail_downLoadUrl.append(url)

四、结果

嗯,写好代码之后,就该干嘛干嘛,让Chrome自动帮你下载文献吧,中间可以打把游戏什么的(逃)。python基础不扎实改编个现成的代码都显得吃力,嗯……我需要提高的地方还有很多。希望这篇文章能够帮到同在学术半道上的你。

结果演示

Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务