在线批量PDF爬取失败:原因分析与解决方法
PDF爬取失败的原因及修复方案
失败原因
- 请求被网站拦截:很多网站会校验请求的
User-Agent字段,你的代码直接用requests.get()发送请求,没有设置合法的用户代理标识,被服务器判定为非浏览器请求,返回403或其他错误,导致PDF下载失败。 - 异常捕获太宽泛:代码里用
except:捕获所有异常,没法定位具体问题(比如请求超时、PDF格式异常、权限限制等),排查故障困难。 - 变量作用域问题:
text_content定义在循环内的try块里,一旦请求失败,这个变量就没被初始化,最后打印会报错;同时多URL场景下,每次循环会覆盖之前的提取结果。
修复后的代码
import fitz import requests import io import re # 模拟浏览器的请求头,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } url_pdf = [ "https://wcsecure.weblink.com.au/pdf/ASN/02528656.pdf", "https://livent.com/wp-content/uploads/2022/07/Livent_2021SustainabilityReport-English.pdf", "https://www.minviro.com/wp-content/uploads/2021/10/Shifting-the-lens.pdf" ] # 用字典存储每个URL对应的提取结果,避免覆盖 all_text_content = {} for url in url_pdf: print(f"正在处理: {url}") try: # 带请求头发送请求,设置超时防止卡住 response = requests.get(url, headers=headers, timeout=15) # 检查请求是否成功,4xx/5xx状态码直接抛出异常 response.raise_for_status() pdf_file = io.BytesIO(response.content) pdf_reader = fitz.open(stream=pdf_file, filetype="pdf") text_content = '' for page in range(pdf_reader.page_count): text_content += pdf_reader.load_page(page).get_text() all_text_content[url] = text_content print(f"{url} 文本提取成功") except requests.exceptions.RequestException as e: print(f"{url} 请求失败: {str(e)}") except Exception as e: print(f"{url} 处理失败: {str(e)}") # 输出所有成功提取的内容(这里只打印前500字符,避免输出过多) for url, content in all_text_content.items(): print(f"\n--- {url} 提取内容预览 ---") print(content[:500])
关键修改说明
- 添加请求头:设置
User-Agent模拟浏览器请求,绕过网站基础反爬机制。 - 细化异常捕获:拆分请求相关异常和其他异常,明确错误类型,方便排查问题。
- 校验请求状态:用
response.raise_for_status()及时发现4xx/5xx等请求错误。 - 优化结果存储:用字典关联URL和提取内容,避免多URL场景下的结果覆盖。
- 设置超时:
timeout=15避免请求长时间无响应卡住程序。
内容的提问来源于stack exchange,提问作者Bitopan Gogoi
相关产品推荐
相关产品推荐

