真的有超级久没怎么用过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