zjg121 发表于 2024-3-18 21:58

下载《经济日报》指定日期后的一周内容

本帖最后由 zjg121 于 2024-3-24 12:29 编辑

20240324:实现了不需要浏览器就能下载指定日期的经济日报。
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 + "/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.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.下面代码已更新。
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)
    day = int(date_str)

    # 创建日期对象
    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:
    # 网页URL
    url = 'http://paper.ce.cn/pc/layout/' + day1[:6] + '/' + day1 + '/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
            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
            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)

    # 初始化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()

dhsfb 发表于 2024-3-19 08:33

向楼主学习,自己动手试试。感谢

zjg121 发表于 2024-3-19 07:11

1修复版面无序,2修复某版面无法下载。
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)
    day = int(date_str)

    # 创建日期对象
    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:
    # 网页URL
    url = 'http://paper.ce.cn/pc/layout/' + day1[:6] + '/' + day1 + '/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
            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
            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)

    # 初始化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


感谢分享                                                                                    
页: [1]
查看完整版本: 下载《经济日报》指定日期后的一周内容