You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何完整导出JSON字典?Python爬虫运行时仅能导出最后一页数据

Python爬虫仅导出最后一页数据解决方法

问题根因

  • job_list()函数内部每次被调用时,都会重新初始化局部列表job_list,单页爬取完成后局部变量直接销毁,前序页面的数据没有被全局留存
  • 存在命名冲突问题:函数名和内部存储数据的列表重名,作用域混乱
  • 函数没有设置返回值,外层构造JSON时调用的job_list实际是函数对象,无法拿到多页累加的爬取结果

修正后完整代码

import requests
import bs4
import time
import random
import json

# 单页爬取函数,返回当前页的职位列表
def crawl_single_page(url):
    htmlFile = requests.get(url)
    objSoup = bs4.BeautifulSoup(htmlFile.text,'lxml')
    jobs = objSoup.find_all('article',class_='js-job-item')
    single_page_jobs = []
    for job in jobs:        
        cust_name = job.get('data-cust-name')
        print("公司名稱:",cust_name)
        job_name = job.get('data-job-name')
        print("職稱名稱:",job_name)
        j_dict = {'公司名稱':cust_name, '職務名稱': job_name}
        single_page_jobs.append(j_dict)
    return single_page_jobs

# 全局总列表,存储所有页面的爬取数据
all_jobs = []
url_H = 'https://www.104.com.tw/jobs/search/?ro=0&kwop=7&keyword=藥師&order=1&asc=0&page='
url_T = '&mode=s&jobsource=2021indexpoc'
page_total = 2

for page in range(page_total):
    url = url_H+str(page+1)+url_T
    current_page_data = crawl_single_page(url)
    # 把当前页数据追加到总列表
    all_jobs.extend(current_page_data)
    print('-'*70)
    time.sleep(random.randint(3,5))
        
myjob = {'Job':all_jobs}

fn = '104爬蟲.json'
with open(fn, "w", encoding='utf-8') as fnObj:
    json.dump(myjob,fnObj,indent=2,ensure_ascii=False)

关键调整说明

  • 把原job_list函数重命名为crawl_single_page,避免和存储变量命名冲突
  • 函数执行完成后返回当前页爬取到的职位列表
  • 外层新增全局总列表all_jobs,每次爬完一页就把当前页数据追加到总列表中
  • 写入JSON时使用总列表all_jobs构造数据,保证所有页面数据都被导出
  • 补充了文件打开时的encoding='utf-8'参数,避免部分环境下中文乱码

内容的提问来源于stack exchange,提问作者QQdingyen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:27:07