下载《经济日报》指定日期后的一周内容
本帖最后由 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()
向楼主学习,自己动手试试。感谢 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()
感谢分享 虽然不会用,但大受震撼,大佬牛哇
感谢分享
页:
[1]