Python爬虫采集下载中国知网《出版来源导航》PDF文档

时隔一年,很久没更新博客了。今天给大家带来一个采集 :出版来源导航

这个是网址是中国知网的,以下代码仅限于此URL(出版来源导航)采集,知网的其他网页路径采集不一定行,大家可以试试。

以下代码注释我也不是很想写了,我利用GPT-4来帮我写注释了。希望大家能看的懂。

在发布代码前,大家先看下下载文件数据。

以上的数据基本来源于以下图片的导航中。

主要采集栏目搜索出自己想要的文档,然后进行采集下载本地中。

以下是完整代码,在使用代码请安装好对应的包,如果是pycharm 在设置 和 控制台终端 都可以安装。需要注意的是 自己需要替换 headers 内容。

我使用的环境是:

Windows 11 64位教育版

Pycharm 2023.2.3版本

python 3.6.8 

# encoding:utf-8
import json
import random
import time

import requests
from bs4 import BeautifulSoup
import csv
import os
import urllib.parse
"""

1、excel格式,只要标题加 HTML阅读连接
2、把内容写入到WORD或者直接下载PDF 
要求:全文设置关键字新农人,爬取标题、文章链接 。就这2个内容
"""

headers = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'Accept-Language': 'zh,zh-CN;q=0.9',
    'Cache-Control': 'max-age=0',
    'Connection': 'keep-alive',
    'Cookie':"请替换自己的COOKIE",
    'Referer': 'https://navi.cnki.net/',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'same-site',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
    'sec-ch-ua': '"Google Chrome";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}


def get_index(page,baseId,key_words):

    form_data = {
        'pcode': 'CCND',
        'baseId': baseId,
        'where': '%28QW%25%27%7B0%7D%27%29',
        # 'where': '%28QW%25%27%7B0%7D%27%29',
        'searchText': key_words,

        'condition': '',
        'orderby': 'FFD',
        'ordertype': 'DESC',
        'scope': '',
        'pageIndex': page,
        'pageSize': '20',
        'searchType': '全文',
    }
    headers = {
        'Accept': '*/*',
        # 'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Connection': 'keep-alive',
        'Content-Length': '223',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Cookie': "请替换自己的COOKIE",
        'Host': 'navi.cnki.net',
        'Origin': 'https://navi.cnki.net',
        'Referer': 'https://navi.cnki.net/knavi/newspapers/NMRB/detail?uniplatform=NZKPT',
        'Sec-Ch-Ua': '"Microsoft Edge";v="119", "Chromium";v="119", "Not?A_Brand";v="24"',
        'Sec-Ch-Ua-Mobile': '?0',
        'Sec-Ch-Ua-Platform': '"Windows"',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-origin',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0',
        'X-Requested-With': 'XMLHttpRequest',
    }

    url = 'https://navi.cnki.net/knavi/newspapers/search/results'
    response = requests.post(url, headers=headers, data=form_data)
    html = BeautifulSoup(response.content, 'lxml')
    for tag in html(['thead']):
        tag.extract()

    try:
        content = html.find_all('table', class_="tableStyle")[0]
    except:
        print('采集完成!')
    else:
        content_tr = content.find_all('tr')
        for ct in content_tr:
            td = ct.find('td', class_="name")
            try:
                href = td.find('a')['href']
            except:
                href = ''
            try:
                name = td.find('a').text
            except:
                name = ''
            try:
                releaseDate = ct.find_all('td', align="center")
                releaseDate = [rd.text for rd in releaseDate if '-' in str(rd.text)][0]
            except:
                releaseDate = ""
            data = [name, releaseDate, href]
            saveCsv(baseIds, data)
            get_download_urls(href)

        try:
            pageCount = html.find('input', id="pageCount")['value']
        except:
            print('爬取完成!!!')
        else:
            page += 1
            print(f'正在爬取{page + 1}页')
            t = random.randint(1, 2)
            print(f'休息 {t} 秒后继续爬取')
            time.sleep(t)
            get_index(page,baseIds)


def saveCsv(filename, content):
    "保存数据为CSV文件 list 写入"
    fp = open(f'{filename}.csv', 'a+', newline='', encoding='utf-8-sig')
    csv_fp = csv.writer(fp)
    csv_fp.writerow(content)
    fp.close()
    print(f'正在写入:{content}')


def get_download_urls(url):

    response = requests.get(url, headers=headers)
    html = BeautifulSoup(response.content, 'lxml')
    title = str(html.find('h1').text).replace('/', '').replace('\\', '')
    dlpdf = html.find('li', class_="btn-dlpdf").find('a')['href']
    downfiles(dlpdf, title)

def downfiles(url, filename):
    session = requests.Session()
    content = session.get(url=url, headers=headers).content
    with open(f'{baseIds}/{filename}.pdf', 'wb') as f:
        f.write(content)
    print(filename, '下载成功')

def create_directory(directory):
    if not os.path.exists(directory):
        os.makedirs(directory)

def text_to_urlencode(chinese_str):
    # 中文字符串
    # chinese_str = '新农人'

    # 将中文字符串编码为UTF-8格式
    chinese_bytes = chinese_str.encode('utf-8')

    # 将字节串转换为URL编码格式
    url_encoded = urllib.parse.quote(chinese_bytes, safe='/:')
    return url_encoded

if __name__ == '__main__':

    # 采集网址:https://navi.cnki.net/knavi/newspapers/search?uniplatform=NZKPT
    # 再网址搜索 相关报纸的关键词信息

    data = ['标题', '日期', '内容链接']
    pa = 0
    baseIds = 'NMRB' #
    create_directory(baseIds)
    saveCsv(baseIds, data)
    key_words = "新农人" # 关键词

    key_words = text_to_urlencode(key_words)

    get_index(pa,baseIds,key_words)

声明:代码仅限于学习,学术研究使用,请勿用于非法用途,如有利用代码去违法犯罪,与作者无关。

不懂得请留言。不一定及时回复,但肯定会回复。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/341608.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《绝地求生大逃杀》怎么买衣服 Steam商店服装购买方法

《绝地求生大逃杀》怎么买衣服?游戏中好看的服装有不少,大家可能开箱并没开出来,想买却不知具体的入手途径,今天闲游盒带来《绝地求生大逃杀》怎么买衣服 Steam商店服装购买方法,希望对各位有帮助。 打开Steam&#xf…

ffmpeg和opencv一些容易影响图片清晰度的操作

ffmpeg 转视频或者图片,不指定码率清晰度会下降 ffmpeg -i xxx.png xxx.mp4 码率也叫比特率(Bit rate)(也叫数据率)是一个确定整体视频/音频质量的参数,秒为单位处理的字节数,码率和视频质量成正比,在视频…

高效办公-电脑的基本组成

作为一位网络工程师在公司内部混久了也兼职了桌面运维了,感觉做网管也是有一些坑的,所以记录一下吧。然后忽然觉得公众号内容有点专业了,那就增加一点办公常识吧,主要是一些电脑使用方面的设置和简单优化,利人利己。 一…

RAR分卷压缩文件可以合并成一个吗?推荐2个方法!

有时候文件太大,我们在压缩RAR文件时会选择压缩成分卷文件,这样更便于传送。如果后续只想要一个压缩包,如何把RAR分卷压缩文件合并起来呢?下面小编分享2个方法,不清楚的小伙伴一起来看看吧! 方法一&#xf…

linux安装docker(入门一)

环境:centos 7(linux) 网站 官网: https://docs.docker.com/ Docker Hub 网站: https://hub.docker.com/ 容器官方概述 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &…

[分章:阅读]《我的第一本算法书》

第一章数据结构 1.链表 1、数据结构之一,线性排列数据,指针链接数据;访问O(n),删除/添加O(1) 2、类似链条。 2.数组 1、线性排列数据,含数据下标(即索引&…

Linux忘记密码

1.服务器启动界面出现3秒倒计时内,按一下“e”键 2.向右移动光标到ro\这个位置后边,插入:rw init/sysroot/bin/sh_ 切记sh_的下划线后边不要有空格,不然会报错 3.修改完成直接按CtrlX启动系统 4.输入 chroot /sysroot切换进去 5.…

Xftp连接不上Linux虚拟机的原因解决方法

前言: 在当今数字化时代,远程连接到Linux虚拟机是许多开发者和系统管理员日常工作的一部分。然而,有时候,面对Xftp连接不上Linux虚拟机的问题,我们可能感到困惑和无措。这个看似小问题可能导致工作中断,因…

【wu-framework-parent 1.2.2-JDK17-SNAPSHOT 新版本中的 ACW】

版本: 1.2.2-JDK17-SNAPSHOT 项目地址:https://gitee.com/wujiawei1207537021/wu-framework-parent/tree/master/wu-smart-intergration/wu-smart-acw 演示地址:http://124.222.48.62:30193/wu-smart-acw-ui/#/login admin/admin docker启动 docker …

移动CRM系统是什么?能帮企业做哪些事情?

移动CRM,即移动客户关系管理,是一种利用移动设备进行客户关系管理的工具。随着移动技术的飞速发展,移动CRM在商业领域得到了广泛应用。本文将对移动CRM的概念、功能和作用、价格等方面进行详细介绍。 1.移动crm的概念 移动CRM是基于客户关系…

Facebook的可访问性使命:构建无障碍社交空间

在当今数字时代,社交媒体不仅是人们交流、分享和连接的平台,更是构建开放、包容社交环境的关键。Facebook,作为全球最大的社交媒体平台之一,积极推动着可访问性使命,致力于构建一个无障碍的社交空间,使每个…

2 - 部署Redis集群架构

部署Redis集群架构 部署Redis集群部署管理主机第一步 准备ruby脚本的运行环境第二步 创建脚本第三步 查看脚本帮助信息 配置6台Redis服务器第一步 修改配置文件启用集群功能第二步 重启redis服务第三步 查看Redis-server进程状态(看到服务使用2个端口号为成功&#…

Intel Atom + Artix-7 100T FPGA,CompactRIO单板控制器

模拟和数字I/O,RMC,DisplayPort,1.33 GHz双核CPU,1 GB DRAM,4 GB存储容量,Artix-7 100T FPGA,CompactRIO单板控制器 CompactRIO控制器是搭载了实时处理器和用户可编程FPGA的嵌入式控制器。其产…

OSPF协议LSDB同步过程和邻居状态机

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

C#winform上位机开发学习笔记7-串口助手的波特率参数设置功能添加

1.功能描述 上位机与下位机进行通讯时需要用到波特率设置功能,以及尝试与下位机实体进行通讯。 2.代码部分 步骤1:串口开启按钮事件中添加代码 serialPort1.BaudRate Convert.ToInt32(comboBox14.Text, 10);//将十进制的文本转换为32位整型赋值给串…

docker配置node项目

首先在项目根目录创建Dockerfile FROM node:18.19RUN mkdir /appCOPY . /appWORKDIR /appRUN npm installEXPOSE 8081CMD ["npm","run","start"]添加.dockerignore文件 /dist /node_moduleslogs *.log npm-debug.log* yarn-debug.log* yarn-er…

《WebKit 技术内幕》学习之九(4): JavaScript引擎

4 实践——高效的JavaScript代码 4.1 编程方式 关于如何使用JavaScript语言来编写高效的代码,有很多铺天盖地的经验分享,以及很多特别好的建议,读者可以搜索相关的词条,就能获得一些你可能需要的结果。同时,本节希望…

10.1 MyBatis基础(❤❤❤❤)

10. MyBatis入门 1. 框架的作用1. MyBatis简介2. 使用细则3. 1. 框架的作用 1. MyBatis简介 2. 使用细则 3.

【小白学机器学习3】关于最简单的线性回归,和用最小二次法评估线性回归效果, 最速下降法求函数的最小值

目录 1 什么是回归分析 1.1 什么是线性回归 1.2非线性回归 2 数据和判断方法 2.1 原始数据 2.2 判断方法:最小二乘法 3 关于线性回归的实测 3.1 用直线模拟 3.2 怎么判断哪个线性模拟拟合更好呢? 3.2.1 判断标准 3.2.2 最小二乘法 3.2.3 高维…

【JavaWeb】web乱码总结

文章目录 web乱码问题一、 HTML乱码二、 Tomcat控制台乱码三、 IDEA sout 乱码四、 请求乱码4.1 GET请求乱码1. 分析:2. 演示:3. 解决: 4.2 POST请求乱码1. 分析:2. 演示:3. 解决: 五、 响应乱码1.分析&…