如何将URL列表与对应爬虫结果匹配追加为DataFrame两列
代码补充修改方案
你现有代码存在两个核心问题:一是没有做爬取结果的有序存储,无法和URL做一一绑定;二是文本清洗逻辑缩进错误,写在了移除script/style标签的内层循环里,会重复执行文本提取操作。按以下步骤补充修改即可得到目标结构的DataFrame:
- 新增pandas库导入,用于生成结构化DataFrame
- 初始化空列表作为结果存储容器,按爬取顺序依次存入URL和对应文本的配对数据,保证顺序和原URL列表完全对应
- 修正文本清洗逻辑的缩进,把提取、清洗文本的代码移到移除冗余标签的循环外层,避免重复计算
- 单次请求、文本清洗完成后,将当前URL和对应清洗后的文本组成元组,追加到结果存储列表中
- 所有链接爬取完成后,将存储的配对列表传入DataFrame构造方法,指定列名即可
修改后完整代码
from bs4 import BeautifulSoup import requests from time import sleep from random import randint import pandas as pd urls = ['url1','url2'] # 初始化结果存储列表 scrape_results = [] # 请求头可以放在循环外,不需要每次请求重新定义 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',} for link in urls: sleep(randint(11,23)) try: req = requests.get(link, headers=headers, timeout=10) # 请求失败直接抛出异常,避免解析错误页面 req.raise_for_status() soup = BeautifulSoup(req.content, features="lxml") # 移除script、style标签 for script in soup(["script", "style"]): script.extract() # 文本清洗逻辑移到内层循环外,避免重复执行 text = soup.get_text() lines = (line.strip() for line in text.splitlines()) chunks = (phrase.strip() for line in lines for phrase in line.split(" ")) text = '\n'.join(chunk for chunk in chunks if chunk) # 将当前url和对应爬取结果配对存入列表 scrape_results.append((link, text)) except Exception as e: # 请求/解析失败时存入错误信息,保证长度和url列表一致,不会错位 scrape_results.append((link, f"爬取失败: {str(e)}")) # 生成目标DataFrame df = pd.DataFrame(scrape_results, columns=['col1', 'col2']) print(df)
额外优化点:把固定的请求头移到了循环外,不需要每次请求重复定义;新增了请求异常捕获,单个链接爬取失败不会中断整个任务,同时能保证结果行数和URL列表长度完全一致,不会出现匹配错位。
运行后输出的结构和预期完全一致:
| col1 | col2 |
|---|---|
| url1 | A Details |
| url2 | B Details |
内容的提问来源于stack exchange,提问作者Dre Day
相关产品推荐
相关产品推荐

