import os from io import BytesIO import pycurl from PyPDF2 import PdfReader DOWNLOAD_DIR = "./" # 随机User-Agent列表 USER_AGENTS = [ "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0", ] def get_random_user_agent(): """获取随机User-Agent""" import random return random.choice(USER_AGENTS) def download_pdf(pdf_url, filename): """ 使用pycurl下载PDF文件(模拟curl请求) 参数: pdf_url (str): PDF文件的URL filename (str): 保存文件名(不含路径) 返回: bool: 是否下载成功 """ save_path = os.path.join(DOWNLOAD_DIR, filename) buffer = BytesIO() c = pycurl.Curl() try: # 设置curl选项 c.setopt(pycurl.URL, pdf_url) c.setopt(pycurl.WRITEDATA, buffer) c.setopt(pycurl.FOLLOWLOCATION, True) c.setopt(pycurl.MAXREDIRS, 5) c.setopt(pycurl.CONNECTTIMEOUT, 30) c.setopt(pycurl.TIMEOUT, 300) # 设置防爬虫headers headers = [ f"User-Agent: {get_random_user_agent()}", "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Referer: https://data.eastmoney.com/", "Accept-Language: zh-CN,zh;q=0.9", ] c.setopt(pycurl.HTTPHEADER, headers) # 执行下载 c.perform() # 验证响应 if c.getinfo(pycurl.HTTP_CODE) != 200: print(f"下载失败 HTTP {c.getinfo(pycurl.HTTP_CODE)}") return False # 保存文件 with open(save_path, "wb") as f: f.write(buffer.getvalue()) print(f"✓ 成功下载 {filename}") return True except pycurl.error as e: errno, errstr = e.args print(f"pycurl错误({errno}): {errstr}") return False except Exception as e: print(f"下载异常: {str(e)}") return False finally: c.close() buffer.close() if __name__ == "__main__": url_list = [ "https://pdf.dfcfw.com/pdf/H3_AP202508061722531920_1.pdf?1754495126000.pdf", ] url_list = [x.split("?")[0] for x in url_list] for url in url_list: name = url.split("_")[1] download_pdf(url, f"{name}.pdf")