huazi

huazi

用Python写一个小的爬虫工具

事情是这样的,公司是用的第三方支付工具 ping++,工作需要将他们文档中的银行编号和银行名称转成 Json 字符串放在本地使用。
具体链接在这:https://www.pingxx.com/api# 银行编号说明
那么问题来了,对于这个银行编号表格,改怎么弄呢,总不能挨个复制吧。这样效率也太低了,不是一个程序猿的作风。于是我找 ios 同事要了一份他们解析好的 json 数据。。。哈哈哈。。就是这么简单粗暴。。要确实要了,但还是要自己弄一下,要善于将生活中可以写代码处理的事用代码去解决。
确定了要做什么事就好办了,首先想到的就是用 Python 爬虫去解析网页,然后分析数据处理。

组成爬虫的关键模块#

  • URL 管理器
    用于对需要爬取的 URL 和已经爬取过的 URL 进行管理,可以用 set 管理也可以用其他工具处理,这里只是对单个固定网页爬取,就用字符串代替了
  • HTML 下载器
    将 URL 管理器中的对应的 url 的网页下载下来,存为字符串,然后可以将这个字符串传给网页解析器解析。这里用的是 Python 自带的 urllib 模块,在 Python2.7 中该模块就是有名的 urllib2,Python3.0 中将 urllib2 统一放到 urllib.request 下,使用方法略有不同,自行 google
  • HTML 解析器
    一方面会解析出有价值的数据,另一方面,由于每一个页面都有很多指向其它页面的网页,这些 URL 被解析出来之后,可以补充进 URL 管理器,以备之后爬取。这里用的第三方模块 BeautifulSoup,需要安装,安装方法如下:
$ easy_install beautifulsoup4

或者

pip install beautifulsoup4

下载网页#

import urllib.request

response = urllib.request.urlopen("https://www.pingxx.com/api#银行编号说明")
print(response.read())

没错就需要两行代码就可以下载一个网页,其实一行也可以

解析网页#

上面下的网页就是一个 html 的源码,要解析它,BeautifulSoup 支持多种方式的解析,获取自己想要的数据。这里就需要去网站看一看源码,我们可以使用 Command+option+J 审查元素,来看一下我们需要数据处的源码的一些可用的地方,以方便爬取,下图使我们定位到的源码

Paste_Image.png

查看之后,分析需要的数据在那个 div 下的 table 里,我们需要获取 table,然后解析 table 就可以了,但是 div 不太好直接拿到,但是有个

<h2 id="银行编号说明">银行编号说明</h2>

比较好拿,于是就先取他,再拿他的父节点的然后再取 table
代码如下:

import urllib.request
from bs4 import BeautifulSoup

response = urllib.request.urlopen("https://www.pingxx.com/api#银行编号说明")
soup = BeautifulSoup(response, "html.parser")
table = soup.find("h2", id="银行编号说明").parent.find("table").find("tbody")

这样就获取到了 table,剩下的就简单了,就是处理 table 了。先获取所有的 tr,再获取每个 tr 中的 td,然后获取需要 td 中的值进行拼接 Json 字符串。
完整代码如下:

import urllib.request
from bs4 import BeautifulSoup

response = urllib.request.urlopen("https://www.pingxx.com/api#银行编号说明")
soup = BeautifulSoup(response, "html.parser")
table = soup.find("h2", id="银行编号说明").parent.find("table").find("tbody")

bankJson = "["
for row in table.findAll('tr'):
    if len(row) > 2:
        cells = row.findAll('td')
        bank_code = cells[0].find(text=True)
        bank_name = cells[1].find(text=True)
        bankJson = bankJson + "{" + "\"code\":\"" + bank_code + "\"," + "\"name\":\"" + bank_name + "\"},"

bankJson = bankJson[0:len(bankJson) - 1] + "]"
print(bankJson)

运行代码就获取到打印的结果:

[{"code":"0100","name":"中国邮政储蓄银行"},{"code":"0102","name":"工商银行"},{"code":"0103","name":"农业银行"},{"code":"0104","name":"中国银行"},{"code":"0105","name":"建设银行"},{"code":"0301","name":"交通银行"},{"code":"0302","name":"中信银行"},{"code":"0303","name":"光大银行"},{"code":"0304","name":"华夏银行"},{"code":"0305","name":"民生银行"},{"code":"0306","name":"广发银行"},{"code":"0308","name":"招商银行"},{"code":"0309","name":"兴业银行"},{"code":"0310","name":"浦发银行"},{"code":"0311","name":"恒丰银行"},{"code":"0313","name":"临沂市商业银行"},{"code":"0316","name":"浙商银行"},{"code":"0317","name":"渤海银行"},{"code":"0318","name":"平安银行"},{"code":"0328","name":"新韩银行(中国)"},{"code":"0329","name":"韩亚银行(中国)"},{"code":"0336","name":"企业银行"},{"code":"0401","name":"上海银行"},{"code":"0402","name":"厦门银行"},{"code":"0403","name":"北京银行"},{"code":"0404","name":"烟台市商业银行"},{"code":"0405","name":"福建海峡银行"},{"code":"0406","name":"吉林银行"},{"code":"0408","name":"宁波银行"},{"code":"0412","name":"温州银行"},{"code":"0413","name":"广州银行"},{"code":"0414","name":"汉口银行"},{"code":"0418","name":"洛阳银行"},{"code":"0420","name":"大连银行"},{"code":"0422","name":"河北银行"},{"code":"0423","name":"杭州商业银行"},{"code":"0424","name":"南京银行"},{"code":"0427","name":"乌鲁木齐市商业银行"},{"code":"0428","name":"绍兴银行"},{"code":"0433","name":"葫芦岛市商业银行"},{"code":"0434","name":"天津银行"},{"code":"0435","name":"郑州银行"},{"code":"0436","name":"宁夏银行"},{"code":"0438","name":"齐商银行"},{"code":"0439","name":"锦州银行"},{"code":"0440","name":"徽商银行"},{"code":"0441","name":"重庆银行"},{"code":"0442","name":"哈尔滨银行"},{"code":"0443","name":"贵阳银行"},{"code":"0447","name":"兰州银行"},{"code":"0448","name":"南昌银行"},{"code":"0449","name":"晋商银行"},{"code":"0450","name":"青岛银行"},{"code":"0455","name":"日照市商业银行"},{"code":"0456","name":"鞍山银行"},{"code":"0458","name":"青海银行"},{"code":"0459","name":"台州银行"},{"code":"0461","name":"长沙银行"},{"code":"0463","name":"赣州银行"},{"code":"0465","name":"营口银行"},{"code":"0467","name":"阜新银行"},{"code":"0474","name":"内蒙古银行"},{"code":"0475","name":"湖州市商业银行"},{"code":"0476","name":"沧州银行"},{"code":"0479","name":"包商银行"},{"code":"0481","name":"威海商业银行"},{"code":"0483","name":"攀枝花市商业银行"},{"code":"0485","name":"绵阳市商业银行"},{"code":"0490","name":"张家口市商业银行"},{"code":"0492","name":"龙江银行"},{"code":"0495","name":"柳州银行"},{"code":"0497","name":"莱商银行"},{"code":"0498","name":"德阳银行"},{"code":"0503","name":"晋城银行"},{"code":"0505","name":"东莞商行"},{"code":"0508","name":"江苏银行"},{"code":"0513","name":"承德市商业银行"},{"code":"0515","name":"德州银行"},{"code":"0517","name":"邯郸市商业银行"},{"code":"0525","name":"浙江民泰商业银行"},{"code":"0526","name":"上饶市商业银行"},{"code":"0527","name":"东营银行"},{"code":"0528","name":"泰安市商业银行"},{"code":"0530","name":"浙江稠州商业银行"},{"code":"0534","name":"鄂尔多斯银行"},{"code":"0537","name":"济宁银行"},{"code":"0547","name":"昆仑银行"},{"code":"0554","name":"邢台银行"},{"code":"0556","name":"漯河商行"},{"code":"1401","name":"上海农商银行"},{"code":"1402","name":"昆山农信社"},{"code":"1403","name":"常熟市农村商业银行"},{"code":"1404","name":"深圳农村商业银行"},{"code":"1405","name":"广州农村商业银行"},{"code":"1408","name":"佛山顺德农村商业银行"},{"code":"1409","name":"昆明农村信用社联合社"},{"code":"1410","name":"湖北农信社"},{"code":"1415","name":"东莞农村商业银行"},{"code":"1416","name":"张家港农村商业银行"},{"code":"1417","name":"福建省农村信用社联合社"},{"code":"1418","name":"北京农村商业银行"},{"code":"1419","name":"天津农村商业银行"},{"code":"1420","name":"宁波鄞州农村合作银行"},{"code":"1424","name":"江苏省农村信用社联合社"},{"code":"1428","name":"江苏吴江农村商业银行"},{"code":"1430","name":"苏州银行"},{"code":"1443","name":"广西农村信用社联合社"},{"code":"1446","name":"黄河农村商业银行"},{"code":"1447","name":"安徽省农村信用社联合社"},{"code":"1448","name":"海南省农村信用社联合社"},{"code":"1513","name":"重庆农村商业银行"},{"code":"6462","name":"潍坊市商业银行"},{"code":"6466","name":"富滇银行"},{"code":"6473","name":"浙江泰隆商业银行"},{"code":"6478","name":"广西北部湾银行"},{"code":"6567","name":"商丘商行"}]

好了,问题解决了,说实话第一次写代码去解决实际中的碰到的问题,挺好玩,带着要解决的问题去学习的效果会更好一些。感想就是在想学东西或者想做一些事情的时候,不要先想太多,比如把所有资料都准备齐、哪个人的资料好,怎么才能少走弯路,学不好做不好会怎么样,等等..... 然后你的激情就没了,这件事也就不了了之了,这些都不好。我们要的就是想做什么立刻去做,just do it。

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。