如何完整导出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
相关产品推荐
相关产品推荐

