用Python自动化爬取CNKI知网数据(批量下载PDF论文)

用Python自动化爬取CNKI知网数据(批量下载PDF论文)

手动下载CNKI知网论文,是一个重复性的工作。重复性的大工作量的工作就可以用爬虫小机器人帮我们完成,我们可以在一旁忙其他的。
俗话说的好,“可见即可爬”,像知网我们就可以用 selenium模拟 我们在网上下载的CNKI知网论文步骤。只要我们把程序运行起来,它就会自动的帮我们下载保存到我们指定的路径。这样我们可以腾出很多时间来。

要有一定的爬虫基础

如果不能运行,就可能是知网进行了网页更新(一种反爬技术),只要修改 网页定位 就行

废话不多说,直接上代码

源代码代码展示:

import time
import xlrd
import os
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from numpy import *

class cnki():
    def __init__(self, save_Path):
        self.save_Path = 'E:\\cnki\\{}'.format(save_Path)    # 创建保存文件夹
        # 定义一个无界面的浏览器
        self.options = webdriver.ChromeOptions()
        self.prefs = {
     'profile.default_content_settings.popups': 0,
                 'profile.managed_default_content_settings.images': 2,
                 'download.default_directory': self.save_Path}
        self.options.add_experimental_option('prefs', self.prefs)
        self.options.add_argument('--headless')
        self.options.add_argument('--disable-gpu')
        self.browser = webdriver.Chrome(executable_path='D:\Chrome\chromedriver.exe', chrome_options=self.options)  
        # 300s无响应就down掉
        self.wait = WebDriverWait(self.browser, 300)
        # 定义窗口最大化
        self.browser.maximize_window()

    def getHtml(self, zy_mc, zy_str):
        try:
            self.browser.get('https://kns.cnki.net/kns8/AdvSearch?dbprefix=SCDB&&crossDbcodes=CJFQ%2CCDMD%2CCIPD%2CCCND%2CCISD%2CSNAD%2CBDZK%2CCJFN%2CCCJD')
            # PDF那个按钮
            self.wait.until(EC.element_to_be_clickable(
                (By.XPATH, '//ul[@class="search-classify-menu"]/li[4]'))).click()
            input = self.wait.until(
                EC.presence_of_element_located((By.XPATH, '//textarea[@class="textarea-major ac_input"]'))
            )
            # 清除里面的数字
            input.clear()
            input.send_keys(zy_str)
            self.wait.until(
                EC.element_to_be_clickable((By.XPATH, '//input[@class="btn-search"]'))
            ).click()
            time.sleep(3)
            total = self.browser.find_element_by_xpath('//*[@id="countPageDiv"]/span/em').text
            print(zy_mc+"一共有"+total+"条数据")
            page = int(total)//20+1
            a = 1
            for p in range(page):
                for i in range(1, 21):
                    link = self.browser.find_element_by_xpath('//*[@id="gridTable"]/table/tbody/tr[%d]/td[2]/a' % i)
                    print(link)
                    flag1 = self.isElementExist('//*[@id="gridTable"]/table/tbody/tr[%d]/td[2]' % i)
                    if flag1:
                        self.browser.execute_script("arguments[0].scrollIntoView();", link)
                        time.sleep(3)
                        actions = ActionChains(self.browser)
                        actions.move_to_element(link)
                        actions.click(link)
                        actions.perform()
                        time.sleep(10)
                        windows = self.browser.window_handles
                        self.browser.switch_to.window(windows[-1])
                        time.sleep(3)
                        try:
                            flag2 = self.isElementExist('//*[@id="pdfDown"]')
                            if flag2:
                                pdf = self.browser.find_element_by_xpath('//*[@id="pdfDown"]')
                                self.browser.execute_script("arguments[0].scrollIntoView();", pdf)
                                time.sleep(3)
                                self.wait.until(EC.presence_of_element_located(
                                    (By.XPATH, '//*[@id="pdfDown"]'))).click()
                            else:
                                pass
                        except Exception as e:
                            print(e)
                        time.sleep(10)
                        self.browser.close()
                        time.sleep(5)
                        self.browser.switch_to.window(windows[0])
                        print("-----正在爬取--" + zy_mc + '--药品的第' + str(int(p)+1) + '页' + str(a) + "条数据------")
                        a = a + 1
                    else:
                        break
                flag3 = self.isElementExist('//*[@id="PageNext"]')
                # 点击下一页
                if flag3:
                    time.sleep(10)
                    next_page = self.browser.find_element_by_xpath('//*[@id="PageNext"]')
                    self.browser.execute_script("arguments[0].scrollIntoView();", next_page)
                    self.wait.until(EC.element_to_be_clickable(
                        (By.XPATH, '//*[@id="PageNext"]'))).click()
                    time.sleep(15)
                else:
                    break
        except Exception as e:
            print(e)
    # 该方法用来确认元素是否存在,如果存在返回flag=true,否则返回false
    def isElementExist(self, element):
        flag = True
        try:
            self.browser.find_element_by_xpath(element)
            return flag
        except:
            flag = False
            return flag

def main():
    try:
        data = xlrd.open_workbook('药名.xlsx')
        table = data.sheets()[0]  # 获取第一页
        zymc_lists = table.col_values(0)
        zcy_lists = table.col_values(1)
        for i in range(0, 17):
            str1 = zymc_lists[i]
            str2 = zcy_lists[i]
            print(str2)
            print(30 * '==' + str(i) + 30 * '==')
            c = cnki(str1)
            time.sleep(15)
            c.getHtml(str1, str2)
            time.sleep(5)

    except Exception as e:
        print(e)
    finally:
        pass


if __name__ == '__main__':
    main()

运行结果展示:

用Python自动化爬取CNKI知网数据(批量下载PDF论文)_第1张图片

自动生成保存路径:

用Python自动化爬取CNKI知网数据(批量下载PDF论文)_第2张图片

下载PDF文档:

用Python自动化爬取CNKI知网数据(批量下载PDF论文)_第3张图片

源码下载

你可能感兴趣的:(爬虫,爬虫,selenium,cnki,xpdf)