如何用Python、BeautifulSoup、Pandas读取csv中URL列表实现批量爬取
解决方案
你已经引入了pandas库,直接用它读取csv文件的第一列生成URL列表即可,无需额外手写IO逻辑,修改后的完整代码如下:
import requests import time from bs4 import BeautifulSoup import pandas as pd # ---------- 替换原有手动定义urls的部分 开始 ---------- # 情况1:你的urls.csv第一列有表头,列名为url urls = pd.read_csv("urls.csv")["url"].tolist() # 情况2:你的urls.csv没有表头,第一行就是第一个URL,用下面这行替换上面的 # urls = pd.read_csv("urls.csv", header=None)[0].tolist() # ---------- 替换部分结束 ---------- data = [] # 把函数定义移到循环外,避免重复定义开销 def get_drivers(url, toc, data): data.append({ 'url': url, 'type': 'driver', 'list': [x.get_text(strip=True) for x in toc.select('li:-soup-contains-own("Market drivers") li')] }) def get_challenges(url, toc, data): data.append({ 'url': url, 'type': 'challenges', 'list': [x.get_text(strip=True) for x in toc.select('li:-soup-contains-own("Market challenges") ul li') if 'Table Impact of drivers and challenges' not in x.get_text(strip=True)] }) # 加请求头伪装,避免被反爬拦截 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" } for url in urls: # 加超时避免请求卡住,加headers伪装 page = requests.get(url, headers=headers, timeout=10) soup = BeautifulSoup(page.text, 'html.parser') toc = soup.find("div", id="toc") # 跳过没有toc板块的页面,避免报错 if not toc: continue get_drivers(url, toc, data) get_challenges(url, toc, data) # 爬取间隔1秒,降低被封风险,可根据实际情况调整 time.sleep(1) pd.concat([pd.DataFrame(data)[['url', 'type']], pd.DataFrame(pd.DataFrame(data).list.tolist())], axis=1).to_csv('output.csv', encoding='utf-8-sig')
核心修改说明
- 直接用pandas的
read_csv方法读取urls.csv,通过tolist()直接生成和原来格式完全一致的URL列表,原有循环爬取逻辑不需要做任何改动 - 补充了反爬适配、异常跳过逻辑,适配1000条URL的批量爬取场景
- 把原本定义在循环内的函数移到全局,减少不必要的重复声明开销
内容的提问来源于stack exchange,提问作者Michael Wiz
相关产品推荐
相关产品推荐

