真的有超级久没怎么用过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万条好像也没用上几分钟,这个速度真的是可以了。