好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 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()
|
-
-
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|