真的有超级久没怎么用过Python,只有偶尔在爬金蝶系统中的摊销信息时用上。每月的工资报表转凭证的模板也是在大半年前写的,每次都是无脑生成,再也没有碰过。我感觉我的技能已经快忘光了,现在自己就是个每天上班混日子的闲鱼。
最近发现一个比联行号网站更好的地方,就是这个金蝶官方提供的联行号查询系统。
网址:https://web20.kingdee.com/eb_cloud_cnaps/home
Yaodo·2024-01-06·88 次阅读
真的有超级久没怎么用过Python,只有偶尔在爬金蝶系统中的摊销信息时用上。每月的工资报表转凭证的模板也是在大半年前写的,每次都是无脑生成,再也没有碰过。我感觉我的技能已经快忘光了,现在自己就是个每天上班混日子的闲鱼。
最近发现一个比联行号网站更好的地方,就是这个金蝶官方提供的联行号查询系统。
网址:https://web20.kingdee.com/eb_cloud_cnaps/home
其实在这个银企的网址查询已经很方便,但是为了稍微唤醒一下我的记忆,所以准备整个爬虫试试。
只改了scrapy框架的爬虫和pipeline,总共代码也没有几行。
因为爬取所有信息需要先选择银行id和省份id,所以先通过requests偷一下所有银行和省份的列表,然后通过一个循环发起请求。
spider-lhh.py
import scrapy import requests class LhhSpider(scrapy.Spider): name = "lhh" allowed_domains = ["web20.kingdee.com"] def get_area_list(self): area_url = 'https://web20.kingdee.com/eb_cloud_cnaps/api/areas?level=0&parentId=' r = requests.get(area_url) return r.json()['data'] def get_bank_list(self): bank_url = 'https://web20.kingdee.com/eb_cloud_cnaps/api/banks' r = requests.get(bank_url) return r.json()['data'] def start_requests(self): area_list = self.get_area_list() bank_list = self.get_bank_list() for bank in bank_list: bankCode = bank['id'] for area in area_list: province = area['id'] branches_url = 'https://web20.kingdee.com/eb_cloud_cnaps/api/bank/ebcnap/branches' formdata = { 'bankCode': bankCode, 'province': province, 'city': '', 'district': '', 'keywords': '', } yield scrapy.FormRequest(branches_url, formdata=formdata, callback=self.parse) def parse(self, response): branches_list = response.json()['data'] if len(branches_list)>0: item = { 'url':response.url, 'data':branches_list, } yield item
因为每次返回的都是一个蛮整齐的列表,所以我也不再单独搞item了,每次把列表当做item生成一行JSON,最后再整合成一个大的JSON。
pipelines.py
from scrapy.exporters import JsonLinesItemExporter import json class KingdeePipeline: def __init__(self): self.fp = open('lhh.json', 'wb') self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False) def process_item(self, item, spider): self.exporter.export_item(item) return item def close_spider(self, spider): li = [] with open("lhh.json", 'r', encoding='utf-8') as fp: lines = fp.readlines() for line in lines: li = li + json.loads(line)['data'] with open('bank_list.json', 'w', encoding='utf-8') as fp: json.dump(li, fp, ensure_ascii=False)
爬了20万条好像也没用上几分钟,这个速度真的是可以了。
Comments | NOTHING