吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1087|回复: 5
收起左侧

[Python 原创] 下载《经济日报》指定日期后的一周内容

[复制链接]
zjg121 发表于 2024-3-18 21:58
本帖最后由 zjg121 于 2024-3-24 12:29 编辑

20240324:实现了不需要浏览器就能下载指定日期的经济日报。
[Python] 纯文本查看 复制代码
import os
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from PyPDF2 import PdfMerger
from time import sleep

headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 SE 2.X MetaSr 1.0"
}
rq = input("请输入要8位数字的日期,如20220509:")
url = "http://paper.ce.cn/pc/layout/" + rq[:6] + "/" + rq[6:] + "/node_02.html"
# 将日期字符串转换为日期对象
date_obj = datetime.strptime(rq, "%Y%m%d")
date_folder = date_obj.strftime("%Y-%m-%d")

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

response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, "lxml")
input_tags = soup.find(attrs={"id": "layoutlist"}).find_all("input")

pdf_links = []
for input_tag in input_tags:
    # 更可靠的链接提取方法,根据网页结构进行调整
    link_part = input_tag.get("value")
    if link_part and link_part.startswith("http"):
        pdf_links.append(link_part)
    else:
        # 如果value不是完整的URL,则根据页面结构拼接
        base_url = "http://paper.ce.cn/pc/"
        pdf_links.append(base_url + link_part[link_part.find("/"):].replace("/../../", ""))
for idx, pdf_link in enumerate(pdf_links, start=1):
    idx1 = "0" + str(idx)
    idx2 = idx1[-2:]
    try:
        # 使用流式下载
        with requests.get(pdf_link, stream=True, headers=headers) as pdf_response:
            pdf_response.raise_for_status()  # 检查请求是否成功
            file_name = f"{date_folder}_{idx2}.pdf"
            file_path = os.path.join(pdf_folder, file_name)
            with open(file_path, mode="wb") as pdf_file:
                for chunk in pdf_response.iter_content(chunk_size=8192):  # 8192 bytes per chunk
                    if chunk:
                        pdf_file.write(chunk)
        print(f"下载完成: {file_name}")
    except requests.RequestException as e:
        print(f"下载失败: {pdf_link}, 错误: {e}")
    except Exception as e:
        print(f"发生未知错误: {e}")
# 定义包含要合并的PDF文件的文件夹路径
pdf_folder = rf"D:/经济日报/{date_folder}"

# 创建一个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}")





20240323:1.是不是可以下载后pdf后,存入蓝奏云,给不会下载的亲提供现成的pdf链接?
2.下面代码已更新。
[Python] 纯文本查看 复制代码
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time
from datetime import datetime, timedelta
import os
from PyPDF2 import PdfMerger
 
 
def get_next_seven_days(date_str):
    # 假设输入的日期格式为 YYYYMMDD
    year = int(date_str[:4])
    month = int(date_str[4:6])
    day = int(date_str[6:])
 
    # 创建日期对象
    start_date = datetime(year, month, day)
 
    # 生成接下来七天的日期
    dates = []
    for i in range(7):
        dates.append(start_date + timedelta(days=i))
 
        # 格式化输出日期
    formatted_dates = [(date.strftime('%Y%m%d') for date in dates)]
    return formatted_dates
 
 
# 指定包含PDF文件的文件夹路径
folder_path = 'C:/Users/31394/Downloads'  # 替换为你的PDF文件夹路径
folder_path2 = 'F:/a'  # 替换为你的PDF文件夹路径
browser = webdriver.Edge()
browser.maximize_window()
browser.get('http://paper.ce.cn/')
time.sleep(3)
# 示例输入
input_date = input('开始日期为八位数,如20230913。请输入开始日期:')
next_seven_days = get_next_seven_days(input_date)
 
# 输出结果
for day1 in next_seven_days[0]:
    # 网页URL
    url = 'http://paper.ce.cn/pc/layout/' + day1[:6] + '/' + day1[6:8] + '/node_01.html'  # 替换为你想打开的网页URL
    print(url)
    # 打开网页
    browser.get(url)
    time.sleep(3)
    try:
        # 假设链接都在某个列表的li元素中
        links = browser.find_elements(By.CLASS_NAME, 'posRelative')  # 使用合适的CSS选择器
        n=len(links)
        # 点击前十个链接
        for j1 in range(n):
            links = browser.find_elements(By.CLASS_NAME, 'posRelative')  # 使用合适的CSS选择器
            j = links[j1]
            link = j.find_element(By.TAG_NAME, 'a')
            link.click()
            time.sleep(0.2)
            links = browser.find_elements(By.CLASS_NAME, 'posRelative')  # 使用合适的CSS选择器
            j = links[j1]
            link = j.find_element(By.TAG_NAME, 'a').find_element(By.TAG_NAME, 'a')
            link.click()
 
            # 等待页面加载或者跳转
            time.sleep(0.2)  # 这里简单地使用sleep等待,但更好的方式是使用WebDriverWait等待某个元素出现
 
    except NoSuchElementException:
        print("没有找到链接")
    except Exception as e:
        print(f"发生错误:{e}")
        break  # 如果发生错误,退出循环
    time.sleep(2)
    # 获取文件夹中所有的PDF文件及其修改时间
    pdf_files = [(f, os.path.getmtime(os.path.join(folder_path, f))) for f in os.listdir(folder_path) if f.endswith('.pdf')]
 
    # 按修改时间排序
    pdf_files.sort(key=lambda x: x[1])
 
    # 初始化PDF合并器
    merger = PdfMerger()
 
    # 遍历排序后的PDF文件并添加到合并器中
    for pdf_file, mtime in pdf_files:
        file_path = os.path.join(folder_path, pdf_file)
        with open(file_path, 'rb') as infile:
            merger.append(infile)
 
            # 指定合并后PDF文件的保存路径和名称
    output_file = os.path.join(folder_path2, '经济日报' + day1 + '.pdf')
 
    # 合并PDF文件并保存
    merger.write(output_file)
    merger.close()
 
    # 删除原始PDF文件
    for pdf_file, _ in pdf_files:
        file_path = os.path.join(folder_path, pdf_file)
        os.remove(file_path)
 
    print(f'Merged PDF saved as {output_file} and original files deleted.')
 
# 关闭浏览器
browser.quit()


微信截图_20240318215656.png
微信图片_20240324120854.png

免费评分

参与人数 2吾爱币 +1 热心值 +2 收起 理由
jbbj + 1 谢谢@Thanks!
qq63 + 1 + 1 谢谢@Thanks!

查看全部评分

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

dhsfb 发表于 2024-3-19 08:33
向楼主学习,自己动手试试。感谢
 楼主| zjg121 发表于 2024-3-19 07:11
1修复版面无序,2修复某版面无法下载。
[Python] 纯文本查看 复制代码
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time
from datetime import datetime, timedelta
import os
from PyPDF2 import PdfMerger


def get_next_seven_days(date_str):
    # 假设输入的日期格式为 YYYYMMDD
    year = int(date_str[:4])
    month = int(date_str[4:6])
    day = int(date_str[6:])

    # 创建日期对象
    start_date = datetime(year, month, day)

    # 生成接下来七天的日期
    dates = []
    for i in range(7):
        dates.append(start_date + timedelta(days=i))

        # 格式化输出日期
    formatted_dates = [(date.strftime('%Y%m%d') for date in dates)]
    return formatted_dates


# 指定包含PDF文件的文件夹路径
folder_path = 'C:/Users/31394/Downloads'  # 替换为你的PDF文件夹路径
folder_path2 = 'F:/a'  # 替换为你的PDF文件夹路径
browser = webdriver.Edge()
browser.maximize_window()
browser.get('http://paper.ce.cn/')
time.sleep(3)
# 示例输入
input_date = input('开始日期为八位数,如20230913。请输入开始日期:')
next_seven_days = get_next_seven_days(input_date)

# 输出结果
for day1 in next_seven_days[0]:
    # 网页URL
    url = 'http://paper.ce.cn/pc/layout/' + day1[:6] + '/' + day1[6:8] + '/node_01.html'  # 替换为你想打开的网页URL
    print(url)
    # 打开网页
    browser.get(url)
    time.sleep(3)
    try:
        # 假设链接都在某个列表的li元素中
        links = browser.find_elements(By.CLASS_NAME, 'posRelative')  # 使用合适的CSS选择器
        n=len(links)
        # 点击前十个链接
        for j1 in range(n):
            links = browser.find_elements(By.CLASS_NAME, 'posRelative')  # 使用合适的CSS选择器
            j = links[j1]
            link = j.find_element(By.TAG_NAME, 'a')
            link.click()
            time.sleep(0.2)
            links = browser.find_elements(By.CLASS_NAME, 'posRelative')  # 使用合适的CSS选择器
            j = links[j1]
            link = j.find_element(By.TAG_NAME, 'a').find_element(By.TAG_NAME, 'a')
            link.click()

            # 等待页面加载或者跳转
            time.sleep(0.2)  # 这里简单地使用sleep等待,但更好的方式是使用WebDriverWait等待某个元素出现

    except NoSuchElementException:
        print("没有找到链接")
    except Exception as e:
        print(f"发生错误:{e}")
        break  # 如果发生错误,退出循环
    time.sleep(2)
    # 获取文件夹中所有的PDF文件及其修改时间
    pdf_files = [(f, os.path.getmtime(os.path.join(folder_path, f))) for f in os.listdir(folder_path) if f.endswith('.pdf')]

    # 按修改时间排序
    pdf_files.sort(key=lambda x: x[1])

    # 初始化PDF合并器
    merger = PdfMerger()

    # 遍历排序后的PDF文件并添加到合并器中
    for pdf_file, mtime in pdf_files:
        file_path = os.path.join(folder_path, pdf_file)
        with open(file_path, 'rb') as infile:
            merger.append(infile)

            # 指定合并后PDF文件的保存路径和名称
    output_file = os.path.join(folder_path2, '经济日报' + day1 + '.pdf')

    # 合并PDF文件并保存
    merger.write(output_file)
    merger.close()

    # 删除原始PDF文件
    for pdf_file, _ in pdf_files:
        file_path = os.path.join(folder_path, pdf_file)
        os.remove(file_path)

    print(f'Merged PDF saved as {output_file} and original files deleted.')

# 关闭浏览器
browser.quit()
wojiushiliu 发表于 2024-3-19 11:38
TGLG 发表于 2024-3-22 17:00
虽然不会用,但大受震撼,大佬牛哇
poptop 发表于 2024-4-2 12:11

感谢分享                                                                                    
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-12-15 10:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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