多线程下载《人民日报》pdf
运行前先手动创建文件夹:D:/人民日报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
day = rq
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
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} 秒。")
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。 优化如下,去掉多线程,下载当天20版(现在最多是20版内容),自动在脚本所在路径创建文件夹,可以配合电脑计划任务每天自动执行
# -*- coding: utf-8 -*-
# @Time : 2024/3/27 17:31
# @AuThor : 寒山独见君
# 博客地址:https://blog.csdn.net/weixin_42133116?spm=1011.2124.3001.5343
# @file : 人民日报.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() vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。
好的。谢谢提醒。 感谢分享,实用技巧{:300_966:} vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。
why不能pa? 谢谢分享!! vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。
提醒的挺有道理的,要是看的话不是可以在线选日期看的吗?
谢谢分享! laok518 发表于 2024-3-25 09:47
提醒的挺有道理的,要是看的话不是可以在线选日期看的吗?
下载下来也有用处。下载的pdf是双层的,里面的文本可以用软件(如anytxtsearcher之类)搜索。如果下载下来,就可以快速搜索关于某一关键词的内容出现在哪些日期版面。写论文做课题,就可以快速找到大量的素材。也就是便于检索。 这个挺有用,学习了。