爬虫中连接数据库,两种获取网页内容的方式,BeautifulSoup, 正则表达式的使用,爬json格式文件

2023-11-15

一,连接数据库

1.连接MySQL 

import pymysql

conn=pymysql.connect(host='localhost',port=3306,user='root',passwd='***',db='***', charset='utf8')
cur = conn.cursor()


# 以下两步把游标与数据库连接都关闭,这也是必须的!
cur.close()
conn.close()

往MySQL中插入数据

         try:
             cur.execute("USE ssm_crud")
             cur.execute('SET NAMES utf8')
             cur.execute('SET CHARACTER SET utf8')
             cur.execute('SET character_set_connection=utf8')
             cur.execute(
                'insert into GYZC_XCUL(索引号,信息分类,发布机构,发文日期,文号,是否有效,信息名称) values(%s,%s,%s,%s,%s,%s,%s)',
                [list[0], list[1], list[2], list[3], list[4], list[5], list[6]]
             )
           except Exception as e:
             print(e)
           finally:
             pass

 

2.连接Oracle

import cx_Oracle #oralce连接工具

conn = cx_Oracle.connect('用户名', '密码', 'localhost:1521/服务器名(service_name)')  # 连接数据库
cur = conn.cursor()  # 获取cursor

cur.close()
conn.close()

往Oracle中插入数据,并且转换数据类型

   try:
                               
         sql = "insert into swzc(uuid,xmbh,bdmc,gpjg,gpqsrq,gpjzrq,gpggq,bmjzsj,fbmtmc,bdszd,wqlb)values( '"+str(ncount)+"' ,'" +nlist_td[1].encode('GBK', 'ignore').decode('GBk') + "','" + nlist_td[0].encode('GBK', 'ignore').decode('GBk') + "','" + nlist_td[2].encode('GBK', 'ignore').decode('GBk') + "',to_date('"+nlist_td[3]+"','yyyy/mm/dd HH:MI:SS'),to_date('"+nlist_td[4]+"','yyyy/mm/dd HH:MI:SS'),'" + nlist_td[5].encode('GBK', 'ignore').decode('GBk') + "','" + nlist_td[6].encode('GBK', 'ignore').decode('GBk') + "','" + nlist_td[7].encode('GBK', 'ignore').decode('GBk') + "','" + nlist_td[8].encode('GBK', 'ignore').decode('GBk') + "','" +nlist_td[9].encode('GBK', 'ignore').decode('GBk')+ "')"
         test="to_date('"+nlist_td[3]+"','yyyy/mm/dd HH:MI:SS')"
         print(test)
         cur.execute(sql)
   except Exception as e:
           print(e)
   finally:
           pass

 

 二,获取网页内容

1.使用urllib库中的request包

from urllib.request import urlopen
import urllib.request

headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]

#将opener安装为全局
urllib.request.install_opener(opener)
thisurl = "http://gzw.guizhou.gov.cn/zwgk/xxgkml/zdlyxx/gzyy/index.json"
data = urllib.request.urlopen(thisurl).read().decode("utf-8","ignore")
#print(data)

2.使用requests包

import requests


 headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
 r = requests.get('http://www.prechina.net/channels/304.html', headers = headers)
 r.encoding = 'utf-8'
 

 三,提取所需内容,解析网页格式

1.beautifulSoup方式,该方式自动过滤网页中的标签,只提取text,省去了很多繁琐的标签过滤步骤

from bs4 import BeautifulSoup

bs = BeautifulSoup(r.content.decode("utf-8"), "lxml")
 tables = bs.find_all('table',attrs={'class':'tables_01'})
#这种情况是所遍历的子网页中有两个表但第一个表不是每次都需要提取数据,因此建立一个数组格式存储表格,若为第一个网页则遍历两个表格,其他网页只遍历第一个 
if j == 1:
      table = [tables[1],tables[0]]
else:
      table =[tables[0]]
for m in range(0,len(table)):
   for tr in table[m].findAll("tr"):
        list_td = []#只需插入第一个td中的链接
        i = 0
        for td in tr.findAll("td"):
            list_td.append(td.getText())
            #该网页中可以提取链接的有两列,我们只取其中一个就好,因此每次遍历一个新的tr中td前用i判断一下
            if i == 0:
                m = td.find('a')['href']
                list_td.append(m)
                i = i + 1
        print(list_td)

2.通过正则表达式提取所需要的内容 

import re
from bs4 import BeautifulSoup


tables = bs.find_all('table',attrs={'class':'tables_01'})
    if j == 1:
      table = [tables[1],tables[0]]
    else:
      table =[tables[0]]
    for m in range(0,len(table)):
      for tr in table[m].findAll("tr"):
        list_td = []
        i = 0
        for td in tr.findAll("td"):
            if i == 0:
                m = td.find('a')['href']
                i = i + 1
                headers = {
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'}
                rn = requests.get("http://www.prechina.net" + m, headers=headers)
                print("http://www.prechina.net" + m)
                #print(ncount)
                bsn = BeautifulSoup(rn.content.decode("utf-8","ignore"), "lxml")
                if len(bsn.text)>1000:
                    tablesn = bsn.find_all('table', attrs={'class': 'tables_02'})
                    table03 = tablesn[2]
                    table01 = tablesn[0]
                    nlist_td = []  # 只需插入第一个td中的链接
                    pat = '项目编号</th>.*?<td>(.*?)</td>'
                    rst = re.compile(pat, re.S).findall(table01.__str__())
                    if len(re.compile('资产描述</td>.*?<td colspan=".*?">(.*?)</td>',re.S).findall(table03.__str__())) < 1:
                        pat1 = '资产现状</td>.*?<td colspan=".*?">(.*?)</td>'
                    else:
                        pat1 = '资产描述</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst1 = re.compile(pat1,re.S).findall(table03.__str__())

                    if len(re.compile('标的所在地</td>.*?<td colspan=".*?">(.*?)</td>', re.S).findall(table03.__str__())) <1:
                        pat2 = '地理位置</td>.*?<td colspan=".*?">(.*?)</td>'
                    else:
                        pat2 = '标的所在地</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst2 = re.compile(pat2, re.S).findall(table03.__str__())

                    pat3 = '权证编号</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst3 = re.compile(pat3, re.S).findall(table03.__str__())
                    if len(rst3) < 1:
                        rst3 = ['机械设备及其他类无权证编号']

                    pat4 = '建筑面积</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst4 = re.compile(pat4, re.S).findall(table03.__str__())
                    if len(rst4) < 1:
                        rst4 = ['机械设备及其他类无建筑面积']
                    pat5 = '抵押、租赁等他项权利情况</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst5 = re.compile(pat5, re.S).findall(table03.__str__())
                    pat6 = '权利人是否行使优先受让权 </td>.*?<td colspan=".*?">(.*?)</td>'
                    rst6 = re.compile(pat6, re.S).findall(table03.__str__())
                    pat7 = '评估机构</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst7 = re.compile(pat7, re.S).findall(table03.__str__())
                    pat8 = '核准(备案)机构</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst8 = re.compile(pat8, re.S).findall(table03.__str__())
                    pat9 = '核准(备案)日期</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst9 = re.compile(pat9, re.S).findall(table03.__str__())
                    pat10 = '评估基准日</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst10 = re.compile(pat10, re.S).findall(table03.__str__())
                    mtd = table03.find_all('td', attrs={'colspan': '2','class':'th2'})
                    if len(mtd) < 1:
                        mtd = table03.find_all('td', attrs={'colspan': '4', 'class': 'th2'})
                    if len(mtd[0].text) < 1:
                        rst11 = " "
                    else:
                        rst11 = mtd[0].text

                    mtd1 = table03.find_all('td', attrs={'colspan': '3', 'class': 'th2'})
                    if len(mtd1) < 1:
                        mtd1 = table03.find_all('td', attrs={'colspan': '5', 'class': 'th2'})
                    if len(mtd[0].text) < 1:
                        rst12 = " "
                    else:
                        rst12 = mtd[0].text
                    pat13 = '转让标的对应评估值</td>.*?<td colspan=".*?">(.*?)</td>'
                    rst13= re.compile(pat13, re.S).findall(table03.__str__())
                    zyxx = table03.find_all('tr')
                    zyxx01=zyxx[len(zyxx)-1].find_all('td')
                    rst14=zyxx01[0].text

                    nlist_td.extend(rst)
                    nlist_td.extend(rst1)
                    nlist_td.extend(rst2)
                    nlist_td.extend(rst3)
                    nlist_td.extend(rst4)
                    nlist_td.extend(rst5)
                    nlist_td.extend(rst6)
                    nlist_td.extend(rst7)
                    nlist_td.extend(rst8)
                    nlist_td.extend(rst9)
                    nlist_td.extend(rst10)
                    nlist_td.append(rst11)
                    nlist_td.append(rst12)
                    nlist_td.extend(rst13)
                    nlist_td.append(rst14) 

最后举一个爬取json文件的例子 ,多加了将json字符串转换成python字典这一步骤

# json解析库,对应到lxml
import json
# json的解析语法,对应到xpath
import jsonpath
from urllib.request import urlopen
import pymysql
import urllib.request
import requests
from bs4 import BeautifulSoup
import  re
#头文件格式header=("User-Agent",具体用户代理值)
conn = pymysql.connect(host='localhost', port=3306, user='root', passwd='***', db='***', charset='utf8')
cur = conn.cursor()
headers = ("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# data = opener.open(url).read().decode("utf-8","ignore")
#将opener安装为全局
urllib.request.install_opener(opener)
thisurl = "http://gzw.guizhou.gov.cn/zwgk/xxgkml/zdlyxx/gzyy/index.json"
data = urllib.request.urlopen(thisurl).read().decode("utf-8","ignore")
#print(data)
#将json字符串转换成python字典
json_dic = json.loads(data)

syh = jsonpath.jsonpath(json_dic, "$..idxID")
title = jsonpath.jsonpath(json_dic, "$..Title")
PubDate = jsonpath.jsonpath(json_dic, "$..PubDate")
fileNum = jsonpath.jsonpath(json_dic, "$..fileNum")
url = jsonpath.jsonpath(json_dic, "$..url")
node_num=len(syh)
for i in range(0,node_num):
     if title[i].find('薪酬') != -1:
        print(syh[i], title[i], PubDate[i], fileNum[i], url[i])
        urlSec='http://gzw.guizhou.gov.cn/zwgk/xxgkml/zdlyxx/gzyy/' +url[i]
     #headers={
      #   'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
     #}
        dataSec = urllib.request.urlopen(urlSec).read()
        dataSec = dataSec.decode("utf-8","ignore")
     #bs = BeautifulSoup( dataSec.content.decode("utf-8"), "lxml")
     #data = bs.find("div",{"class":"xxgk_xl_top"})
     #print(data)
    # for li in  bs.find("div",{"class":"xxgk_xl_top"}).findAll("li"):

        list = []
        pat1 = '索引号:</a>.*?<span>(.*?)</span>'
        rst1 = re.compile(pat1, re.S).findall(dataSec)  # 成功

        pat2 = '信息分类:</a>.*?<span>(.*?)</span>'
        rst2 = re.compile(pat2, re.S).findall(dataSec)

        pat3 = '发布机构:</a>.*?var str_1 = "(.*?)";'  # 把所有字段的正则写出来
        rst3 = re.compile(pat3, re.S).findall(dataSec)

        pat4 = '发文日期:</a>.*? var str_1 = "(.*?)";'
        rst4 = re.compile(pat4, re.S).findall(dataSec)

        pat5 = '文号:</a>.*?<span>(.*?)</span>'
        rst5 = re.compile(pat5, re.S).findall(dataSec)

        pat6 = "是否有效:</a>.*?isok='(.*?)';"  # 1或空为是,2为否
        rst6 = re.compile(pat6, re.S).findall(dataSec)
        if rst6 == '' or '1':
             rst6 = '是'
        elif rst6 == '2':
             rst6 = '否'

        pat7 = '信息名称:</a>.*?<span>(.*?)</span>'
        rst7 = re.compile(pat7, re.S).findall(dataSec)

        list.append(rst1)
        list.append(rst2)
        list.append(rst3)
        list.append(rst4)
        list.append(rst5)
        list.append(rst6)
        list.append(rst7)
        print(list)

        if list.__len__() > 6:
           try:
             cur.execute("USE ssm_crud")
             cur.execute('SET NAMES utf8')
             cur.execute('SET CHARACTER SET utf8')
             cur.execute('SET character_set_connection=utf8')
             cur.execute(
                'insert into GYZC_XCUL(索引号,信息分类,发布机构,发文日期,文号,是否有效,信息名称) values(%s,%s,%s,%s,%s,%s,%s)',
                [list[0], list[1], list[2], list[3], list[4], list[5], list[6]]
             )
           except Exception as e:
             print(e)
           finally:
             pass
conn.commit()
# 以下两步把游标与数据库连接都关闭,这也是必须的!
cur.close()
conn.close()


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫中连接数据库,两种获取网页内容的方式,BeautifulSoup, 正则表达式的使用,爬json格式文件 的相关文章

  • elasticsearch实现入库分词,查询不分词,实现like关键字%

    因为在工作中遇到一个需求 需要对请求内容实现类似于mysql的 like 关键字 模糊匹配功能 同时要保证效率大数据量效率问题 因此不能使用wildcard在网上看了很多也不太好使 自己琢磨了一下成功了 该功能仅对非中文存储的字段有效果 使
  • Blender软硬边

    https www youtube com watch v CdHXpHPWKYo blender这里的算法感觉就是根据角度做自动平滑 然后mark sharp它就不平滑 貌似有bug 加修改器貌似可以解决这个问题 凹面貌似也有点问题 设置
  • 结合Android Studio和MAT检测并简单分析内存泄露

    1 什么是GC 在分析内存泄露之前首先要了解一下GC GC Garbage Collection 就是Java中常提到的垃圾回收 指的是JVM会自动回收不在被引用的内存数据 2 什么是GC Roots GC Roots即Java虚拟机当前存

随机推荐

  • SAP-基于批次特定计量单位的应用-01-产品数量管理

    原文链接 https mp weixin qq com s zknWGuz2lU387vAGSiykw 大家可以关注我个人公众号 所有分享内容 会在公众号第一时间推送 且阅读排版更好 愿大家的学习 轻松且愉快 如果大家觉得有用 希望转发关注
  • 计算机打字正确姿势,电脑打字手指的正确姿势,涨知识了

    近年来 随着科技水平的提高 电脑已经成为了必不可少的工具了 能够为工作和学习提供一定的便利性 今天来给大家说说在电脑上打字手指应如何摆放 以帮助提高打字的速度 熟悉键盘 01 在开始打字前 首先要对键盘上每个字母对应的位置有一定的了解 不仅
  • LeGO-LOAM代码详细注释版

    学习LeGO LOAM时 写的代码注释github代码链接 一部分注释来自github用户wykxwyc 一部分来自网上查阅 还有一部分是自己的理解 持续更新中
  • C语言---离散数学实验--图的基本概念及其应用

    目录 欧拉图的判定 实验内容 编辑 无向图的判断 算法展示 源码 有向图的判断 算法展示 源码 求欧拉路 算法展示 整体源码 对无向图的判断 对有向图的判断 二叉树的应用 源码 源码下载 实验目的 掌握判断欧拉图的方法 掌握求最优二叉树的方
  • kubeadm常用

    kubeadm常用 配置kubeadm自动补全 初始化一个master节点 导出kubeadm默认配置文件 将node节点加入集群 生成node配置 升级k8s版本 kubeadm升级node 维护或下线node节点 管理kubeadm j
  • 1-2 VS2019常用调试方法(断点设置、条件断点、调试按钮、逐过程、逐语句、监视变量、快速监视)

    文章目录 前言 1 打印数据 2 普通断点 2 1断点快捷键 3 条件断点与条件追踪 4 单步调试 5 添加监视 5 1快速监视 前言 主要调试方法 1 打印数据 2 普通断点 3 条件断点与条件追踪 4 单步调试 5 添加监视 1 打印数
  • JavaWeb自我学习——Request(请求)

    目录 Request 1 继承体系 2 获取请求数据 通用方式获取请求参数 idea模板创建servlet 请求参数中文乱码处理 Tomcat 8 0之后 已将GET请求乱码问题解决 设置默认的解码方式为UTF 8 3 请求转发 请求转发资
  • 中小企业在数字化转型上所面对的问题都有哪些?_光点科技

    随着科技的飞速发展 数字化转型已经成为企业持续发展的必由之路 尤其是中小企业 数字化转型不仅可以提高效率 降低成本 还可以拓展市场 增强竞争力 然而 数字化转型并非一帆风顺 中小企业在这个过程中面临着一系列挑战和问题 1 资金问题 中小企业
  • fb设备驱动1:fb设备的显像原理和步骤

    lcd的显像原理 将DDR内存的一部分划分出来作为显存 显存与lcd显示屏幕之间做一个双向的映射 然后用户只需要将需要显示的内容放入显存之中 然后显存中的内容就会刷新到lcd的储存器中进行显示 显存 在内核之中申请一块内存作为显存 由于内核
  • #ifndef/#define/#endif使用详解

    想必很多人都看过 头文件中的 ifndef define endif 防止该头文件被重复引用 但是是否能理解 被重复引用 是什么意思 是不能在不同的两个文件中使用include来包含这个头文件吗 如果头文件被重复引用了 会产生什么后果 是不
  • spring之AOP总结

    AOP Aspect Oriented Programming 面向切面编程 指在程序运行期间 将某段代码动态的切入到指定方法的指定位置进行运行的这种编程方法 面向切面编程 专业术语 连接点 即指定位置 spring允许你使用通知的地方 每
  • 哈希表以及用js封装一个哈希表

    最近在学数据结构和算法 正好将学习的东西记录下来 我是跟着一个b站博主学习的 是使用js来进行讲解的 待会也会在文章后面附上视频链接地址 大家想学习的可以去看看 本文主要讲解哈希表 其他数据结构后续学完也会持续更新 目录 一 什么是哈希表
  • 8 种最坑的SQL错误用法

    点击上方 芋道源码 选择 设为星标 管她前浪 还是后浪 能浪的浪 才是好浪 每天 10 33 更新文章 每天掉亿点点头发 源码精品专栏 原创 Java 2021 超神之路 很肝 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网
  • 解决Windows10提示管理员已阻止你运行此应用的问题

    近日发现Windows10更新后 想查看设备管理器 在此电脑上右键点击管理后 提示 用户账户控制 管理员已阻止你运行此应用 无法打开管理 后来又发现很多重要的地方都出现这个提示 于是在网上找如何解决这个问题的办法 大部分都是修改注册表或者打
  • React的函数编程

    函数式编程的好处是什么 函数式编程是一种编程模式 在这种编程模式种最常用函数和表达式 函数式编程把函数作为一等公民 强调从函数的角度考虑问题 函数式编程倾向用一系列嵌套的函数来解决问题 函数式编程让我们的代码更清晰 每个功能都是一个函数 函
  • 「分享」最全AI合集 全是好玩意!

    哈喽 大家好 木易巷这次给大家带来了最全的AI合集 每一个都功能强大 总有一个是你需要的 话不多说 直接上 1 学英语 Replika 2 Al生成乐曲 AmperMusic IBM Watson Music 3 Al换脸 Deepfake
  • 一款好用的基于vue的录屏插件recordrtc,拿走不谢

    第一步 下载安装包 npm i recordrtc 第二步 复制代码 即可使用
  • c语言--unsigned修饰符

    在C语言中 unsigned是一种无符号整数修饰符 它可以与多个整数类型 如int short long等 结合使用 表示该整数类型只包含非负数值 unsigned修饰的整数类型不保存正负号位 因此可以用来表示更大的正整数范围 例如 uns
  • 静态代码扫描(四)——Java资源关闭研究

    最近一直在研究java资源关闭的检查规则 发现市面上开源的工具针对资源关闭的检测都存在一定不足 同时也无法满足我们业务的需求 所以火线团队针对资源关闭进行了深度的研究 取得了一些不错的进展 但是过程的艰辛也远超了我们的预料 现在就跟大家聊聊
  • 爬虫中连接数据库,两种获取网页内容的方式,BeautifulSoup, 正则表达式的使用,爬json格式文件

    一 连接数据库 1 连接MySQL import pymysql conn pymysql connect host localhost port 3306 user root passwd db charset utf8 cur conn