Python CSV链接爬取:如何保持输入输出行一致性?
解决方案:保持输入输出行一一对应的Python爬虫脚本
我完全明白你的需求:要基于现有的爬虫逻辑,实现从urls.csv读取链接时严格维持输入输出行的一一对应关系——有效链接(能成功访问且找到目标元素)输出重定向后的最终链接,无效链接(请求失败或找不到目标元素)则输出error link。
下面是完整的可运行脚本,包含异常处理、重定向追踪和行序保障逻辑:
import requests from bs4 import BeautifulSoup import csv import traceback def process_single_url(url): """处理单个URL,返回结果或error link""" result = "error link" try: # 发送请求,自动跟随重定向,设置超时避免卡住 response = requests.get(url.strip(), allow_redirects=True, timeout=10) # 仅处理状态码为2xx的成功响应 if response.status_code // 100 == 2: soup = BeautifulSoup(response.text, 'html.parser') # 定位目标div product_div = soup.find('div', class_='productsPicture') if product_div: # 提取div下a标签的href target_href = product_div.find('a')['href'] # 按需切换结果:是返回重定向后的页面URL,还是爬取到的href result = response.url # 重定向后的最终页面地址 # result = target_href # 页面中目标a标签的链接 except Exception as e: # 调试时打印异常信息,生产环境可注释 print(f"处理URL {url} 出错: {traceback.format_exc()}") return result def main(): input_path = 'urls.csv' output_path = 'results.csv' # 用列表存储结果,严格保证和输入行顺序一致 results = [] # 读取输入文件 with open(input_path, 'r', encoding='utf-8') as f: reader = csv.reader(f) for row in reader: if row: # 跳过空白行 url = row[0] results.append([process_single_url(url)]) else: # 空白行对应输出error link,可按需改为空白行 results.append(["error link"]) # 写入结果文件 with open(output_path, 'w', encoding='utf-8', newline='') as f: writer = csv.writer(f) writer.writerows(results) print(f"处理完成!结果已写入 {output_path}") if __name__ == "__main__": main()
核心细节说明:
- 行序绝对保障:先将所有URL的处理结果按输入顺序存入列表,最后一次性写入文件,彻底避免异常或异步操作打乱行对应关系。
- 重定向自动处理:
allow_redirects=True会自动跟随所有重定向,response.url就是最终跳转后的页面地址;如果你的需求是提取页面内的目标href,只需切换注释的result赋值行即可。 - 全场景异常捕获:覆盖了请求超时、DNS错误、404页面、目标元素不存在等所有可能的异常情况,确保某一行出错不会影响后续行的处理。
- 空白行兼容:自动处理
urls.csv中的空白行,对应输出error link,可根据需求修改为空白行。 - 编码防乱码:全程使用
utf-8编码读写文件,避免中文链接或内容出现乱码。
使用步骤:
- 先安装依赖库(如果还没装):
pip install requests beautifulsoup4 - 将你的
urls.csv放在脚本同一目录下,确保每行一个链接(可包含无效链接样本)。 - 运行脚本,结果会自动写入
results.csv,每行严格对应输入的一行。
内容的提问来源于stack exchange,提问作者AnotherUser31
相关产品推荐
相关产品推荐

