吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1675|回复: 21
收起左侧

[Python 原创] 多线程下载《人民日报》pdf

  [复制链接]
zjg121 发表于 2024-3-24 17:06
运行前先手动创建文件夹:D:/人民日报



[Python] 纯文本查看 复制代码
import os
import time
import requests
from PyPDF2 import PdfMerger
import concurrent.futures


# 下载单个PDF文件的函数
def download_pdf(url):
    # 发送GET请求获取文件内容
    response = requests.get(url)

    # 检查响应状态码
    if response.status_code != 200:
        print(f"文件 {url} 不存在,跳过。")
        return None

        # 生成本地文件名
    filename = os.path.join(pdf_folder, url.split('/')[-1])

    # 将文件内容保存到本地磁盘
    with open(filename, 'wb') as f:
        f.write(response.content)

    print(f"已下载文件 {filename}")
    return filename


# 开始计时
start_time = time.time()
rq = input("请输入一个8位数日期,如20210101格式:")
year = rq[:4]
month = rq[4:6]
day = rq[6:]
pdf_urls = []
for i in range(1,10):
    ii = ("0"+str(i))[-2:]
    pdf_urls.append(f"http://paper.people.com.cn/rmrb/images/{year}-{month}/{day}/{ii}/rmrb{rq}{ii}.pdf")

# 创建保存PDF文件的文件夹
pdf_folder = rf"D:/经济日报/linshi"
os.makedirs(pdf_folder, exist_ok=True)

# 使用 ThreadPoolExecutor 来执行下载任务
with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:  # 可以设置最大工作线程数
    future_to_url = {executor.submit(download_pdf, url): url for url in pdf_urls}

    # 检查下载状态并处理结果
    for future in concurrent.futures.as_completed(future_to_url):
        url = future_to_url[future]
        try:
            data = future.result()  # 获取结果,如果文件不存在则为None
        except Exception as exc:
            print(f"生成文件 {url} 时出错: {exc}")
        else:
            if data is not None:  # 只计数成功的下载
                print(f"已下载文件 {data}")

            # 打印已下载的PDF文件数量

# 创建一个PdfFileMerger对象
merger = PdfMerger()

# 遍历文件夹中的所有PDF文件,并将它们添加到合并器中
for filename in os.listdir(pdf_folder):
    if filename.endswith(".pdf"):
        file_path = os.path.join(pdf_folder, filename)
        merger.append(file_path)

    # 定义输出PDF文件的路径和名称
pdf_folder2=rf"D:/人民日报"
output_filename = os.path.join(pdf_folder2, "人民日报" + rq + ".pdf")

# 将合并的PDF写入输出文件
with open(output_filename, "wb") as outfile:
    merger.write(outfile)
    merger.close()
# 删除原始PDF文件
for filename in os.listdir(pdf_folder):
    if filename.endswith(".pdf") and filename != "merged.pdf":
        file_path = os.path.join(pdf_folder, filename)
        os.remove(file_path)
os.rmdir(pdf_folder)
print(f"合并完成,已生成 {output_filename}")

# 结束计时
end_time = time.time()

# 计算并打印运行时间
elapsed_time = end_time - start_time
print(f"总共下载PDF文件,用时 {elapsed_time:.2f} 秒。")
pp.png
qq.png

免费评分

参与人数 3吾爱币 +8 热心值 +3 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
marcyan + 1 谢谢@Thanks!
vethenc + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。
小邑走天下 发表于 2024-3-27 19:36
优化如下,去掉多线程,下载当天20版(现在最多是20版内容),自动在脚本所在路径创建文件夹,可以配合电脑计划任务每天自动执行

[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
# @Time : 2024/3/27 17:31
# [url=home.php?mod=space&uid=686208]@AuThor[/url] : 寒山独见君
# 博客地址:https://blog.csdn.net/weixin_42133116?spm=1011.2124.3001.5343
# [url=home.php?mod=space&uid=267492]@file[/url] : 人民日报.py

import datetime
import os
import time
import requests
from PyPDF2 import PdfMerger


pdf_folder = '人民日报'
today = datetime.date.today()
formatted_date = today.strftime("%Y-%m/%d")
filename_num = formatted_date.replace("-", "").replace("/", "")
pdf_cache = pdf_folder + f"/cache/{filename_num}"
if not os.path.exists(pdf_folder):
	os.makedirs(pdf_folder)
if not os.path.exists(pdf_cache):
	os.makedirs(pdf_cache)
# 下载单个PDF文件的函数
def download_pdf(url):
	try:
		# 发送GET请求获取文件内容
		response = requests.get(url)
		# 检查响应状态码
		if response.status_code != 200:
			print(f"文件 {url} 不存在,跳过。")
			return None
		# 生成本地文件名
		filename = os.path.join(pdf_cache, url.split('/')[-1])
		# 将文件内容保存到本地磁盘
		with open(filename, 'wb') as f:
			f.write(response.content)
		print(f"已下载文件 {filename}")
		return filename
	except Exception as e:
		line_err = f'error line:{e.__traceback__.tb_lineno}'
		print(f"异常行-{line_err}  异常信息:{str(e)}")

# 组合今天的各版下载链接列表
def url_list():
	try:
		pdf_urls = []
		for i in range(1, 21):
			if i < 10:
				ban_i = ("0" + str(i))[-2:]
			else:
				ban_i =  str(i)
			# http://paper.people.com.cn/rmrb/images/2024-03/27/01/rmrb2024032701.pdf
			pdf_urls.append(f"http://paper.people.com.cn/rmrb/images/{formatted_date}/{ban_i}/rmrb{filename_num}{ban_i}.pdf")
	except Exception as e:
		line_err = f'error line:{e.__traceback__.tb_lineno}'
		print(f"异常行-{line_err}  异常信息:{str(e)}")
		pdf_urls = []
	return pdf_urls
# 合并各版pdf
def pdf_merge():
	try:
		# 创建一个PdfFileMerger对象
		merger = PdfMerger()
		for filename in os.listdir(pdf_cache):
			if filename.endswith(".pdf"):
				file_path = os.path.join(pdf_cache, filename)
				merger.append(file_path)
		output_filename = os.path.join(pdf_folder, "人民日报" + filename_num + ".pdf")
		with open(output_filename, "wb") as outfile:
			merger.write(outfile)
			merger.close()
		# 删除原始PDF文件
		# for filename in os.listdir(pdf_cache):
		# 	if filename.endswith(".pdf") and filename != "merged.pdf":
		# 		file_path = os.path.join(pdf_cache, filename)
		# 		os.remove(file_path)
	except Exception as e:
		line_err = f'error line:{e.__traceback__.tb_lineno}'
		print(f"异常行-{line_err}  异常信息:{str(e)}")
# 合并各版pdf
def main():
	try:
		start_time = time.time()
		pdf_urls = url_list()
		for url_i in pdf_urls:
			download_pdf(url_i)
		pdf_merge()
		# 结束计时
		end_time = time.time()
		# 计算并打印运行时间
		elapsed_time = end_time - start_time
		print(f"总共下载PDF文件,用时 {elapsed_time:.2f} 秒。")
	except Exception as e:
		line_err = f'error line:{e.__traceback__.tb_lineno}'
		print(f"异常行-{line_err}  异常信息:{str(e)}")

if __name__ == '__main__':
	main()
 楼主| zjg121 发表于 2024-3-24 19:18
vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。

好的。谢谢提醒。
vethenc 发表于 2024-3-24 19:44
感谢分享,实用技巧
sai609 发表于 2024-3-24 20:33
vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。

why不能pa?
duso 发表于 2024-3-24 22:18
谢谢分享!!
laok518 发表于 2024-3-25 09:47
vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。

提醒的挺有道理的,要是看的话不是可以在线选日期看的吗?
wwd2018 发表于 2024-3-25 11:30

谢谢分享!
 楼主| zjg121 发表于 2024-3-25 12:37
laok518 发表于 2024-3-25 09:47
提醒的挺有道理的,要是看的话不是可以在线选日期看的吗?

下载下来也有用处。下载的pdf是双层的,里面的文本可以用软件(如anytxtsearcher之类)搜索。如果下载下来,就可以快速搜索关于某一关键词的内容出现在哪些日期版面。写论文做课题,就可以快速找到大量的素材。也就是便于检索。
tco2k 发表于 2024-3-25 17:04
这个挺有用,学习了。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 19:45

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表