zjg121 发表于 2024-3-24 17:06

多线程下载《人民日报》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} 秒。")

vethenc 发表于 2024-3-24 19:04

1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。

小邑走天下 发表于 2024-3-27 19:36

优化如下,去掉多线程,下载当天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()

zjg121 发表于 2024-3-24 19:18

vethenc 发表于 2024-3-24 19:04
1.要是不看,就别下载了。
2.千万不要拿这些网站练爬虫。

好的。谢谢提醒。

vethenc 发表于 2024-3-24 19:44

感谢分享,实用技巧{:300_966:}

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

这个挺有用,学习了。
页: [1] 2 3
查看完整版本: 多线程下载《人民日报》pdf