从shenfenzheng网站获取身份证号码等信息

这个程序是最初学Beautiful Soup时,写的一个程序。
因为相对以前的正则什么的,获取一组数据还是有点麻烦的,这边分割,那边分割。程序代码也没有那么简单直观。
如图,是我们今天要获取数据的网页
网页信息
本次我们用到的的库(不是python 自带的库)有BeautifulSoup && pymysql
这两个库安装很方便,配置好了pip环境后,直接输入命令 pip install BeautifulSoup4 安装BeautifulSoup库;输入pip install PyMySQL安装pymysql。库名不区分大小写。
使用BeautifulSoup时,需要查询元素位置,怎么做到呢?
以谷歌浏览器为例,按 F12键(快捷键:Ctrl + shift + C),可审核元素。
代码中使用:bsobjs = bsobj.findAll(“tr”,{“bgcolor”:”#FFFFFF”})
tr:是一个tag,即标签名
bgcolor:是一个key,即tr里面的一个键
‘#FFFFFF’:是一个value,即bgcolor对应的值
具体怎么使用BeautifulSoup可百度一下,轻松解决。
使用pymysql一是为了数据便于重复利用,二是那会刚学习pymysql,就顺便用上了。使用数据库时候,不管正常情况下,异常情况下都要确保程序不用时,关闭连接。
下面直接上代码:

# coding=utf-8

import urllib.request
from bs4 import BeautifulSoup
from urllib.error import HTTPError
import pymysql
import time

def getHtml(url):
    """获取指定url下的数据,若获取数据成功,返回数据结果;若失败返回 None"""
    try:
        req = urllib.request.Request(url) #发起请求
        req.add_header("User-Agent",
                       "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 \
                       (KHTML, like Gecko) Chrome/49.0.2623.108 Safari/537.36") #添加浏览器头文件
        html = urllib.request.urlopen(req) #
        time.sleep(0.5)
        return html

    except HTTPError as e: #捕获异常
        print("HTTPError:"+str(e))
        return None
    except Exception as e: #捕获异常
        print("Exception:"+str(e))
        return None

def connectMysql(database="shenfenzheng"):
    """连接数据库,若数据库连接正常,返回数据库连接对象;若数据库连接异常,捕获异常,返回 None"""
    host = "localhost" #数据库地址
    user = "root" #数据库用户名
    passward = "123456" #数据库密码
    database = database #数据库名
    charset = "utf8" #数据库编码
    try:
        #连接数据库,并返回数据库连接对象
        return pymysql.connect(host=host, user=user, passwd=passward, database=database, charset=charset)
    except Exception as e: #捕获异常
        print("Database connect Error:"+str(e))
        return None

URL = "http://shenfenzheng.293.net/" #获取身份证数据等信息的网址
sum = 0
#数据库与游标对象理解,一家店有很多员工,一个数据库连接相当于一个连接,一个员工相当于一个游标对象;
#一家店可以有多名员工,一个员工同一时间只能做一件事;同样一个数据库连接可以有多个游标对象,
#但是一个游标对象在同一时间只能做一件事,所以在多线程的时候可以只连接数据库一次,但创建多个游标对象。
conn = connectMysql() #连接数据库
cur = conn.cursor() #创建游标对象
while conn:
    html = getHtml(URL) #获取网页信息
    bsobj = BeautifulSoup(html) #创建BeautifulSoup对象
    bsobjs = bsobj.findAll("tr",{"bgcolor":"#FFFFFF"}) #获取'tr'标签下,所有'bgcolor'的值是'#FFFFFF'的对象信息
    for bsobj in bsobjs:
        bsobj = bsobj.findAll("td") #获取第一个'tr'标签下,'bgcolor'的值是'#FFFFFF',所有含有'td'标签的信息
        nameAndIDCard = bsobj[0].get_text() #获取第一个'td'对象信息,本处指姓名与身份证
        print("nameAndIDCard:"+nameAndIDCard) #查看姓名及身份证信息
        nameAndIDCard = str(nameAndIDCard).split(" ") #分割姓名与身份证信息
        name = nameAndIDCard[0] #姓名
        idCard = nameAndIDCard[1] #身份证

        gender = bsobj[1].get_text() #获取第二个'td'对象信息,本处指性别
        print("gender:"+gender) #查看性别

        age = bsobj[2].get_text() #获取第二个'td'对象信息,本处指年龄
        print("age:"+age) #查看年龄

        address = bsobj[3].get_text() #获取第三个'td'对象信息,本处指所属地区
        print("address:"+address) #查看所属地区
        print("sum:",sum)
        try:
            cur.execute("insert into id_card(name,id_card,gender,age,address) value(%s,%s,%s,%s,%s)",(name,idCard,gender,age,address)) #插入姓名,身份证,性别,年龄,所属地区信息到数据库
            conn.commit() #提交执行上述sql语句
        except Exception as e: #若插入数据到数据库有问题(eg:字段长度问题等),捕获异常
            print("Add data to database Error:"+str(e))
        sum += 1
    if sum >= 300: #如果插入数据达到300条,结束程序
        cur.close() #用完后一定关闭,不关闭,会占用资源。就像打开文件,用完后需要关闭一样。
        conn.close() #数据库连接用完后也要关闭连接,不然连接多了,没有释放,数据库会连接不上。一般mysql默认安装的话 是15个用户同时连接。
        break

BeautifulSoup 元素:
审核元素
代码执行情况:
代码执行结果
数据库插入数据情况:
数据库数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值