Python BeautifulSoup多页爬虫仅写入最后一页数据到CSV如何解决
问题原因
该问题是变量覆盖+写入逻辑位置错误导致的:
- 遍历URL的循环中,
table_data变量每次都会被新页面的表格内容覆盖,整个循环结束后table_data里仅保留了最后一页的表格数据 - CSV写入逻辑放在了URL循环的外面,只会执行一次,自然只能写入最后一页的内容
- 额外的无效代码:循环里第一行的
requests.get(url)没有赋值,属于重复发的无效请求,浪费请求资源
修复方案
这里提供两种常用修复方式,按需选择即可:
方式1:逐页写入(适合数据量较大的场景,不用占用内存存储全量数据)
import requests from csv import writer from bs4 import BeautifulSoup urls = ['https://www.xxxxxxxxxxxxxxx/02-nb.php','https://www.xxxxxxxxxxxxxxx/03-np.php','https://www.xxxxxxxxxxxxxxx/04-nb.php'] # 提前打开CSV文件,避免重复开闭文件损耗性能 with open("words.csv", "wt",newline='',encoding='utf-8') as csv_file: csv_data = writer(csv_file, delimiter =',') for index,url in enumerate(urls): page = requests.get(url) soup = BeautifulSoup(page.text, 'lxml') print(soup) table_data = soup.find('table') # 直接写入当前页的表格内容 for voc in table_data.find_all('tr'): row_data = voc.find_all('td') row = [tr.text for tr in row_data] csv_data.writerow(row)
方式2:先收集所有数据再统一写入(适合小数据量场景,方便提前做数据清洗)
import requests from csv import writer from bs4 import BeautifulSoup urls = ['https://www.xxxxxxxxxxxxxxx/02-nb.php','https://www.xxxxxxxxxxxxxxx/03-np.php','https://www.xxxxxxxxxxxxxxx/04-nb.php'] all_rows = [] # 公共列表存储所有页面的行数据 for index,url in enumerate(urls): page = requests.get(url) soup = BeautifulSoup(page.text, 'lxml') print(soup) table_data = soup.find('table') for voc in table_data.find_all('tr'): row_data = voc.find_all('td') row = [tr.text for tr in row_data] all_rows.append(row) # 把当前页的行存入公共列表 # 所有页面遍历完成后统一写入文件 with open("words.csv", "wt",newline='',encoding='utf-8') as csv_file: csv_data = writer(csv_file, delimiter =',') csv_data.writerows(all_rows)
可选优化
如果每个页面的表格都带有重复表头,只想保留第一个表头,可以在循环里加判断跳过后续页面的表头:
for index,url in enumerate(urls): page = requests.get(url) soup = BeautifulSoup(page.text, 'lxml') table_data = soup.find('table') trs = table_data.find_all('tr') if index != 0: # 非第一个页面就跳过第一行表头 trs = trs[1:] for voc in trs: row_data = voc.find_all('td') row = [tr.text for tr in row_data] csv_data.writerow(row)
内容的提问来源于stack exchange,提问作者Unknow
相关产品推荐
相关产品推荐

