多同结构网站爬取后仅最后URL内容写入JSON问题求助
嘿,我来帮你搞定这个问题!你遇到的情况太典型了——循环处理多个URL时,结果没被正确收集,最后写入文件的时候自然只剩最后一个啦。咱们先唠唠常见的坑,再给你改好代码。
常见问题根源
- 结果没累加:如果每次循环都重新定义空的字典/列表,之前爬的内容直接被覆盖,最后自然只剩最后一个URL的数据。
- 文件写入模式错了:要是每次循环都用
open('output.json', 'w'),w模式会清空文件重写,前面的内容全被冲掉,最终只留最后一次的结果。
修正后的代码
from urllib.request import urlopen from bs4 import BeautifulSoup as soup import json # 补全后的URL列表示例 urls = [ 'https://scholarworks.gvsu.edu/books/', 'https://pdxscholar.library.pdx.edu/pdxopen/', 'https://oer.galileo.usg.edu/books/' ] # 初始化一个空列表,专门用来收集所有URL的爬取结果 all_results = [] for url in urls: try: # 打开URL并解析页面结构 uClient = urlopen(url) page_html = uClient.read() uClient.close() page_soup = soup(page_html, "html.parser") # 这里替换成你实际的内容提取逻辑,根据目标网站HTML结构调整 # 示例:提取站点标题和书籍标题列表 site_title = page_soup.title.text.strip() books = [book.text.strip() for book in page_soup.select('.book-title')] # 把当前URL的结果整理成字典,加入总结果列表 current_result = { 'url': url, 'site_title': site_title, 'books': books } all_results.append(current_result) # 终端打印当前结果,方便查看进度 print(f"已完成爬取:{url}") print(current_result) print("---") except Exception as e: # 捕获异常,避免单个URL出错导致整个程序中断 print(f"爬取{url}时出错:{str(e)}") continue # 所有URL爬取完成后,一次性写入JSON文件 with open('output.json', 'w', encoding='utf-8') as f: json.dump(all_results, f, indent=4, ensure_ascii=False) print("所有结果已成功写入output.json!")
关键修改说明
- 统一收集结果:用
all_results = []初始化一个总列表,每次爬完一个URL就把结果字典append进去,这样所有数据都会被保留下来。 - 一次性写入文件:把文件写入操作放在循环外面,用
w模式一次性写入整个列表,彻底避免多次写入覆盖内容的问题。如果URL数量极多怕中途崩溃,也可以改成边爬边追加,但需要额外处理JSON格式(直接追加字典会导致格式错误),所以一次性写入更稳妥。 - 异常处理:加了
try-except块,就算某个URL爬取失败,程序也能继续处理剩下的链接,还能打印错误信息方便排查问题。
内容的提问来源于stack exchange,提问作者brawlins4
相关产品推荐
相关产品推荐

