python 《第七谈》简单的抓取数据,联行号为例

环境:mac os x

python3

简单的抓取数据保存到数据库,异常数据保存到text文件中,以抓取银行联行号为例

一、先找到我们所需要的数据接口地址

1. 获取省url,共获取31个省(包含直辖市)

定义省url

 proUrl = 'http://www.zybank.com.cn/eportal/ui?moduleId=0e014749013b439aab3f22c794bd61ea&struts.portlet.action=/portlet/cnaps-front!queryAreaInfo.action'

《python 《第七谈》简单的抓取数据,联行号为例》 数据库中展示省.jpg

2. 获取所有城市,需要用省中数据

拼接到末尾
定义市url

cityUrl = 'http://www.zybank.com.cn/eportal/ui?moduleId=0e014749013b439aab3f22c794bd61ea&struts.portlet.action=/portlet/cnaps-front!queryAreaInfo.action&parentcode='

《python 《第七谈》简单的抓取数据,联行号为例》 数据库中展示市.jpg

3. 获取所需的银行列表,这里总计有101家银行

定义银行列表url

bankUrl = 'http://www.zybank.com.cn/eportal/ui?moduleId=0e014749013b439aab3f22c794bd61ea&struts.portlet.action=/portlet/cnaps-front!queryBankNames.action'

《python 《第七谈》简单的抓取数据,联行号为例》 数据库中展示银行列表.jpg

4. 获取联行号url,需要用到市和银行列表数据,数据不重复(140041条)

定义联行号url

bankLhhUrl = 'http://www.zybank.com.cn/eportal/ui?moduleId=0e014749013b439aab3f22c7bd61ea&struts.portlet.action=/portlet/cnaps-front!queryCnaps.action&areacode=%s&clscode=%s'

《python 《第七谈》简单的抓取数据,联行号为例》 数据库中展示联行号.jpg

5. 引入所需功能文件 urllib、json、mysql.connector

urllib提供了一系列用于操作URL的功能。
urllib的request模块可以非常方便地抓取URL内容(发送一个GET请求到指定的页面,然后返回HTTP的响应)。
JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。
mysql.connector,因为这里使用的是mysql数据库,所以需要mysql.connector驱动,如果没有需要执行

$ python -m pip install mysql-connector

这里不做过多的阐述。

import urllib
import json
import mysql.connector

6.编写GET网络请求

因为数据可以通过GET方法直接获取,所以只写了一个GET请求

def getResponseData(url):
    # get请求
    resu = urllib.request.urlopen(
        url,
        data=None, timeout=10)
    data = resu.read().decode()
    response = json.loads(data)
    return response

7.尝试链接数据库

mydb = mysql.connector.connect(
    host='localhost',
    user='root',
    password='root',
    charset='utf8'
)
mycursor = mydb.cursor()
# 创建数据库
# mycursor.execute('CREATE DATABASE lhh_db character set utf8;') #create database test_db character set utf8;
# 使用数据库表
mycursor.execute('use lhh_db;')
# 创建表
# mycursor.execute('CREATE TABLE bankLHH(lname varchar(255),tel varchar(20),cls_code varchar(30),drec_code varchar(30),city_code varchar(20),EFFDATE date,bank_code varchar(30));')
# mycursor.execute('CREATE TABLE province (position varchar(30),areaname varchar(30),areacode varchar(15),parentcode varchar(15));')
# mycursor.execute('CREATE TABLE bankList(bankname varchar(30),clscode varchar(20));')
# mycursor.execute('CREATE TABLE cityList(position varchar(30),areaname varchar(30),areacode varchar(15),parentcode varchar(15));')

要保证数据不重复记得设置唯一键

8.编写数据保存text方法

  1. 先定义一个要保存的路径
sqlText = '/D:/address/lhh/sql.text'
  1. 编写功能代码
#保存到本地文件
def saveData(data,path):
    try:
        fo = open(path, 'a+', encoding='utf-8')  # 打开文件 这里网络数据流的编码需要和写入的文件编码一致
        fo.write(str(data))  # 写入文件
        fo.close()  # 关闭文件
    except:
        print(data)
    else:
        print('保存成功')

9. 编写保存数据库方法代码

# 保存数据到数据库
def saveDataToDataBase(sql):
    try:
        mycursor.execute(sql)
        mydb.commit()
    except:
        saveData(sql,sqlUrl)
    else:
        print('向数据库插入数据成功')

10. 获取省、市、银行列表、银行支行联行号数据,并保存到数据库

  1. 编写获取当前选择省下面的城市
# 获取对应的城市
def getCity(pro):
    url =cityUrl + pro['areacode']
    return getResponseData(url)
  1. 编写获取当前城市及银行下的支行联行号数据
# 获取对应的银行数据联行号
def getBankNo(ccode,bcode):
    url = bankLhhUrl % (ccode,bcode[0:3])
    return getResponseData(url)
#保存所有的城市到数据库中
def saveCityToDataBase():
    # 获取所有省份
    pros = getResponseData(proUrl)
    # 循环所有省
    for pro in pros:
        citys = getCity(pro)
        # 循环省下面所有城市并获取该城市中所有支行联行号
        for city in citys:
            sql = 'INSERT INTO cityList1(position,areaname,areacode,parentcode) VALUES(\'%s\',\'%s\',\'%s\',\'%s\')' % (
            city['position'], city['areaname'], city['areacode'], city['parentcode'])
            saveDataToDataBase(sql)
# saveCityToDataBase()

#保留所有银行到数据库
def saveBankToDataBase():
    # 获取所有银行
    bankList = getResponseData(bankList)
    for bank in bankList:
        sql = 'INSERT INTO bankList(bankname,clscode) VALUES(\'%s\',\'%s\')' % (bank['bankname'], bank['clscode'])
        saveDataToDataBase(sql)
# saveBankToDataBase()

#查询数据库数据
def getDataFromDataBase(sql):
    mycursor.execute(sql)
    result = mycursor.fetchall()  # fetchall() 获取所有记录
    return result

#获取联行号
def getLHH():
    # 获取所有城市code记录
    sql = 'select areacode from cityList1;'
    cityCodeList = getDataFromDataBase(sql)
    # 获取银行code列表
    bankCodeSql = 'select clscode from bankList;'
    bankCodeList = getDataFromDataBase(bankCodeSql)
    print(bankCodeList)
    for ccode in cityCodeList:
        for bcode in bankCodeList:
            lhhList = getBankNo(ccode[0],bcode[0])
            for lhh in lhhList:
                lhhSql = 'insert into bankLHH(lname,tel,cls_code,drec_code,city_code,EFFDATE,bank_code) VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\');' % (lhh['lname'],lhh['tel'],lhh['cls_code'],lhh['drec_code'],lhh['city_code'],lhh['EFFDATE'],lhh['bank_code'])
                saveDataToDataBase(lhhSql)

太困了~ 有时间把最后一条再整理一下,要执行好久、好久、好久………
2019-04-20

    原文作者:怪咖先森_zys
    原文地址: https://www.jianshu.com/p/c4797f06e987
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞