Erlo

【爬虫实战】——利用bs4和sqlalchemy操作mysql数据库,实现网站多行数据表格爬取数据

2024-08-28 18:29:18 发布   18 浏览  
页面报错/反馈
收藏 点赞

前言

此篇接上一篇的内容,在其基础上爬取网站的多行表格数据,以及把数据写入到mysql数据库中

目录

  • 一、定位表格查找元素
  • 二、提取数据
  • 三、写入mysql数据库
  • 四、附录

一、定位表格查找元素

首先打开网站,如图需要爬取多行数据的表格,利用查找元素定位,看图中分析得知我要爬取的是tr下的td数据,所以先查找到tr行

    def script(self):
        # 先定位查找到tr行元素
        trs = self.soup().select('.content>table>tbody>tr')
        print(trs)
【查看运行结果:点击查看代码】
[2024年8月27日天津热轧板卷价格今日报价表(新)_最新价格行情走势, 品名规格(mm)材质产地价格(元/吨)涨跌备注, 热轧板卷2.0*1250*CQ235B河钢承钢3320涨10, 热轧板卷2.5*1250*CQ235B河钢唐钢3270涨10 , 热轧板卷2.5*1250*CQ235B通钢3260涨10, 热轧板卷2.5*1250*CQ235B河钢承钢3270涨10 , 热轧板卷2.75*1250*CQ235B河钢承钢3210涨10, 热轧板卷2.75*1500*CQ235B包钢3210涨10, 热轧板卷2.75*1500*CQ235B河钢承钢3210涨10, 热轧板卷2.75*1500*CQ235B河钢唐钢3210涨10, 热轧板卷2.75*1500*CQ235B通钢3200涨10, 热轧板卷3.0*1500*CQ235B包钢3190涨10, 热轧板卷3.0*1500*CQ235B河钢承钢3190涨10, 热轧板卷3.0*1500*CQ235B河钢唐钢3190涨10 , 热轧板卷3.0*1500*CQ235B通钢3180涨10, 热轧板卷3.5*1500*CQ235B包钢3160涨10, 热轧板卷3.5*1500*CQ235B河钢承钢3160涨10, 热轧板卷3.5*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷3.5*1500*CQ235B本钢3150涨10, 热轧板卷3.5*1500*CQ235B沧州中铁3170涨10, 热轧板卷3.75*1500*CQ235B包钢3160涨10 , 热轧板卷3.75*1500*CQ235B河钢承钢3160涨10, 热轧板卷3.75*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷3.75*1500*CQ235B本钢3150涨10, 热轧板卷3.75*1500*CQ235B沧州中铁3150涨10, 热轧板卷4.5*1500*CQ235B包钢3160涨10, 热轧板卷4.5*1500*CQ235B河钢承钢3160涨10, 热轧板卷4.5*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷4.5*1500*CQ235B本钢3150涨10, 热轧板卷4.5*1500*CQ235B沧州中铁3150涨10, 热轧板卷4.75*1500*CQ235B首钢3160涨10, 热轧板卷4.75*1500*CQ235B包钢3160涨10, 热轧板卷4.75*1500*CQ235B河钢承钢3160涨10, 热轧板卷4.75*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷4.75*1500*CQ235B本钢3150涨10, 热轧板卷4.75*1500*CQ235B沧州中铁3150涨10 , 热轧板卷5.5*1500*CQ235B包钢3160涨10, 热轧板卷5.5*1500*CQ235B河钢承钢3160涨10, 热轧板卷5.5*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷5.5*1500*CQ235B首钢3160涨10, 热轧板卷5.5*1500*CQ235B本钢3150涨10, 热轧板卷5.5*1500*CQ235B沧州中铁3150涨10, 热轧板卷5.75*1500*CQ235B包钢3160涨10, 热轧板卷5.75*1500*CQ235B河钢承钢3160涨10, 热轧板卷5.75*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷5.75*1500*CQ235B首钢3160涨10, 热轧板卷5.75*1500*CQ235B本钢3150涨10, 热轧板卷5.75*1500*CQ235B沧州中铁3150涨10, 热轧板卷7.5-11.75*1500*CQ235B包钢3160涨10, 热轧板卷7.5-11.75*1500*CQ235B河钢承钢3160涨10, 热轧板卷7.5-11.75*1500*CQ235B河钢唐钢3160涨10 , 热轧板卷7.5-11.75*1500*CQ235B首钢3160涨10, 热轧板卷7.5-11.75*1500*CQ235B本钢3150涨10, 热轧板卷7.5-11.75*1500*CQ235B沧州中铁3150涨10, 热轧板卷13.5*1500*CQ235B包钢3160涨10, 热轧板卷13.5*1500*CQ235B河钢承钢3160涨10, 热轧板卷13.5*1500*CQ235B河钢唐钢3160涨10, 热轧板卷13.5*1500*CQ235B首钢3160涨10, 热轧板卷13.5*1500*CQ235B本钢3150涨10, 热轧板卷13.5*1500*CQ235B沧州中铁3150涨10, 热轧板卷13.75*1500*CQ235B包钢3160涨10, 热轧板卷13.75*1500*CQ235B河钢承钢3160涨10, 热轧板卷13.75*1500*CQ235B河钢唐钢3160涨10, 热轧板卷13.75*1500*CQ235B首钢3160涨10, 热轧板卷13.75*1500*CQ235B本钢3150涨10, 热轧板卷13.75*1500*CQ235B沧州中铁3150涨10, 热轧板卷5.75*1800*CQ235B包钢3290涨10, 热轧板卷13.5*1800*CQ235B包钢3290涨10, 热轧板卷13.75*1800*CQ235B包钢3300涨10, 热轧板卷5.75*2000*CQ235B包钢3310涨10, 热轧板卷7.75*2000*CQ235B包钢3310涨10, 热轧板卷13.5*2000*CQ235B包钢3310涨10, 热轧板卷13.75*2000*CQ235B包钢3310涨10, 低合金板卷4.75*1500*CQ355B包钢3340涨10, 低合金板卷4.75*1500*CQ355B河钢承钢3340涨10, 低合金板卷4.75*1500*CQ355B河钢唐钢3340涨10, 低合金板卷4.75*1500*CQ355B通钢3330涨10, 低合金板卷4.75*1500*CQ355B本钢3330涨10, 低合金板卷5.5*1500*CQ355B包钢3340涨10, 低合金板卷5.5*1500*CQ355B河钢承钢3340涨10, 低合金板卷5.5*1500*CQ355B河钢唐钢3340涨10, 低合金板卷5.5*1500*CQ355B通钢3330涨10, 低合金板卷5.5*1500*CQ355B本钢3330涨10, 低合金板卷5.75*1500*CQ355B包钢3340涨10, 低合金板卷5.75*1500*CQ355B河钢承钢3340涨10 , 低合金板卷5.75*1500*CQ355B河钢唐钢3340涨10 , 低合金板卷5.75*1500*CQ355B通钢3330涨10, 低合金板卷5.75*1500*CQ355B本钢3330涨10, 低合金板卷9.75*1500*CQ355B包钢3340涨10, 低合金板卷9.75*1500*CQ355B河钢承钢3340涨10, 低合金板卷9.75*1500*CQ355B河钢唐钢3340涨10, 低合金板卷9.75*1500*CQ355B通钢3330涨10, 低合金板卷9.75*1500*CQ355B本钢3330涨10, 低合金板卷11.75*1500*CQ355B包钢3340涨10, 低合金板卷11.75*1500*CQ355B河钢承钢3340涨10, 低合金板卷11.75*1500*CQ355B河钢唐钢3340涨10, 低合金板卷11.75*1500*CQ355B通钢3330涨10, 低合金板卷11.75*1500*CQ355B本钢3330涨10, 低合金板卷13.75*1500*CQ355B包钢3340涨10, 低合金板卷13.75*1500*CQ355B河钢承钢3340涨10, 低合金板卷13.75*1500*CQ355B河钢唐钢3340涨10, 低合金板卷13.75*1500*CQ355B通钢3330涨10, 低合金板卷13.75*1500*CQ355B本钢3330涨10, 低合金板卷7.75*1800*CQ355B包钢3520涨10, 低合金板卷9.75*1800*CQ355B包钢3520涨10 , 低合金板卷13.5*1800*CQ355B包钢3520涨10, 低合金板卷13.75*1800*CQ355B包钢3520涨10, 低合金板卷7.75*2000*CQ355B包钢3530涨10, 低合金板卷9.75*2000*CQ355B包钢3530涨10 , 低合金板卷13.5*2000*CQ355B包钢3530涨10, 低合金板卷13.75*2000*CQ355B包钢3530涨10]

二、提取数据

我们可以看到爬取出每行的tr和tr下面的td数据,接下来利用for循环把tr每行的文字提取出来,但是前两行是我不需要的,我只要第三行之后的数据


代码如下:

    def __init__(self):


        # self.url = "https://www.cnblogs.com/Owen-ET/p/14523426.html"
        self.url = "http://www.gtgqw.com/j/showhz2136672.html"
        # url = "http://www.example.com"
        self.dic = {
            "报价": []
        }


    def script(self):

        trs = self.soup().select('.content>table>tbody>tr')
        print(trs)
        print("=========================此处代码↓========================================")
        for tr in trs:
            if (tr != trs[0])&(tr != trs[1]):
                movie = {}
                infos = list(tr.stripped_strings)
                print(infos)    # 输出结果①:把td里面的值遍历出来组成数组
                movie['pin_name'] = infos[0]
                movie['guige'] = infos[1]
                movie['caizhi'] = infos[2]
                movie['chandi'] = infos[3]
                movie['jiage'] = infos[4]
                movie['zhangdie'] = infos[5]
                # 
                self.dic["报价"].append(movie)
        print("========================此处代码↑=========================================")
        return self.dic    # 输出结果②:把每行td数组里的元素赋上键名,组成键值对
【输出结果①:点击查看代码】
['热轧板卷', '2.0*1250*C', 'Q235B', '河钢承钢', '3320', '涨10']
['热轧板卷', '2.5*1250*C', 'Q235B', '河钢唐钢', '3270', '涨10']
['热轧板卷', '2.5*1250*C', 'Q235B', '通钢', '3260', '涨10']
['热轧板卷', '2.5*1250*C', 'Q235B', '河钢承钢', '3270', '涨10']
['热轧板卷', '2.75*1250*C', 'Q235B', '河钢承钢', '3210', '涨10']
['热轧板卷', '2.75*1500*C', 'Q235B', '包钢', '3210', '涨10']
['热轧板卷', '2.75*1500*C', 'Q235B', '河钢承钢', '3210', '涨10']
['热轧板卷', '2.75*1500*C', 'Q235B', '河钢唐钢', '3210', '涨10']
['热轧板卷', '2.75*1500*C', 'Q235B', '通钢', '3200', '涨10']
['热轧板卷', '3.0*1500*C', 'Q235B', '包钢', '3190', '涨10']
['热轧板卷', '3.0*1500*C', 'Q235B', '河钢承钢', '3190', '涨10']
['热轧板卷', '3.0*1500*C', 'Q235B', '河钢唐钢', '3190', '涨10']
['热轧板卷', '3.0*1500*C', 'Q235B', '通钢', '3180', '涨10']
['热轧板卷', '3.5*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '3.5*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '3.5*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '3.5*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '3.5*1500*C', 'Q235B', '沧州中铁', '3170', '涨10']
['热轧板卷', '3.75*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '3.75*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '3.75*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '3.75*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '3.75*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '4.5*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '4.5*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '4.5*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '4.5*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '4.5*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '4.75*1500*C', 'Q235B', '首钢', '3160', '涨10']
['热轧板卷', '4.75*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '4.75*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '4.75*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '4.75*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '4.75*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '5.5*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '5.5*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '5.5*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '5.5*1500*C', 'Q235B', '首钢', '3160', '涨10']
['热轧板卷', '5.5*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '5.5*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '5.75*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '5.75*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '5.75*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '5.75*1500*C', 'Q235B', '首钢', '3160', '涨10']
['热轧板卷', '5.75*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '5.75*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '7.5-11.75*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '7.5-11.75*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '7.5-11.75*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '7.5-11.75*1500*C', 'Q235B', '首钢', '3160', '涨10']
['热轧板卷', '7.5-11.75*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '7.5-11.75*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '13.5*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '13.5*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '13.5*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '13.5*1500*C', 'Q235B', '首钢', '3160', '涨10']
['热轧板卷', '13.5*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '13.5*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '13.75*1500*C', 'Q235B', '包钢', '3160', '涨10']
['热轧板卷', '13.75*1500*C', 'Q235B', '河钢承钢', '3160', '涨10']
['热轧板卷', '13.75*1500*C', 'Q235B', '河钢唐钢', '3160', '涨10']
['热轧板卷', '13.75*1500*C', 'Q235B', '首钢', '3160', '涨10']
['热轧板卷', '13.75*1500*C', 'Q235B', '本钢', '3150', '涨10']
['热轧板卷', '13.75*1500*C', 'Q235B', '沧州中铁', '3150', '涨10']
['热轧板卷', '5.75*1800*C', 'Q235B', '包钢', '3290', '涨10']
['热轧板卷', '13.5*1800*C', 'Q235B', '包钢', '3290', '涨10']
['热轧板卷', '13.75*1800*C', 'Q235B', '包钢', '3300', '涨10']
['热轧板卷', '5.75*2000*C', 'Q235B', '包钢', '3310', '涨10']
['热轧板卷', '7.75*2000*C', 'Q235B', '包钢', '3310', '涨10']
['热轧板卷', '13.5*2000*C', 'Q235B', '包钢', '3310', '涨10']
['热轧板卷', '13.75*2000*C', 'Q235B', '包钢', '3310', '涨10']
['低合金板卷', '4.75*1500*C', 'Q355B', '包钢', '3340', '涨10']
['低合金板卷', '4.75*1500*C', 'Q355B', '河钢承钢', '3340', '涨10']
['低合金板卷', '4.75*1500*C', 'Q355B', '河钢唐钢', '3340', '涨10']
['低合金板卷', '4.75*1500*C', 'Q355B', '通钢', '3330', '涨10']
['低合金板卷', '4.75*1500*C', 'Q355B', '本钢', '3330', '涨10']
['低合金板卷', '5.5*1500*C', 'Q355B', '包钢', '3340', '涨10']
['低合金板卷', '5.5*1500*C', 'Q355B', '河钢承钢', '3340', '涨10']
['低合金板卷', '5.5*1500*C', 'Q355B', '河钢唐钢', '3340', '涨10']
['低合金板卷', '5.5*1500*C', 'Q355B', '通钢', '3330', '涨10']
['低合金板卷', '5.5*1500*C', 'Q355B', '本钢', '3330', '涨10']
['低合金板卷', '5.75*1500*C', 'Q355B', '包钢', '3340', '涨10']
['低合金板卷', '5.75*1500*C', 'Q355B', '河钢承钢', '3340', '涨10']
['低合金板卷', '5.75*1500*C', 'Q355B', '河钢唐钢', '3340', '涨10']
['低合金板卷', '5.75*1500*C', 'Q355B', '通钢', '3330', '涨10']
['低合金板卷', '5.75*1500*C', 'Q355B', '本钢', '3330', '涨10']
['低合金板卷', '9.75*1500*C', 'Q355B', '包钢', '3340', '涨10']
['低合金板卷', '9.75*1500*C', 'Q355B', '河钢承钢', '3340', '涨10']
['低合金板卷', '9.75*1500*C', 'Q355B', '河钢唐钢', '3340', '涨10']
['低合金板卷', '9.75*1500*C', 'Q355B', '通钢', '3330', '涨10']
['低合金板卷', '9.75*1500*C', 'Q355B', '本钢', '3330', '涨10']
['低合金板卷', '11.75*1500*C', 'Q355B', '包钢', '3340', '涨10']
['低合金板卷', '11.75*1500*C', 'Q355B', '河钢承钢', '3340', '涨10']
['低合金板卷', '11.75*1500*C', 'Q355B', '河钢唐钢', '3340', '涨10']
['低合金板卷', '11.75*1500*C', 'Q355B', '通钢', '3330', '涨10']
['低合金板卷', '11.75*1500*C', 'Q355B', '本钢', '3330', '涨10']
['低合金板卷', '13.75*1500*C', 'Q355B', '包钢', '3340', '涨10']
['低合金板卷', '13.75*1500*C', 'Q355B', '河钢承钢', '3340', '涨10']
['低合金板卷', '13.75*1500*C', 'Q355B', '河钢唐钢', '3340', '涨10']
['低合金板卷', '13.75*1500*C', 'Q355B', '通钢', '3330', '涨10']
['低合金板卷', '13.75*1500*C', 'Q355B', '本钢', '3330', '涨10']
['低合金板卷', '7.75*1800*C', 'Q355B', '包钢', '3520', '涨10']
['低合金板卷', '9.75*1800*C', 'Q355B', '包钢', '3520', '涨10']
['低合金板卷', '13.5*1800*C', 'Q355B', '包钢', '3520', '涨10']
['低合金板卷', '13.75*1800*C', 'Q355B', '包钢', '3520', '涨10']
['低合金板卷', '7.75*2000*C', 'Q355B', '包钢', '3530', '涨10']
['低合金板卷', '9.75*2000*C', 'Q355B', '包钢', '3530', '涨10']
['低合金板卷', '13.5*2000*C', 'Q355B', '包钢', '3530', '涨10']
['低合金板卷', '13.75*2000*C', 'Q355B', '包钢', '3530', '涨10']
【输出结果②:点击查看代码】
{'报价': [{'pin_name': '热轧板卷', 'guige': '2.0*1250*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3320', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.5*1250*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3270', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.5*1250*C', 'caizhi': 'Q235B', 'chandi': '通钢', 'jiage': '3260', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.5*1250*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3270', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.75*1250*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3210', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.75*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3210', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3210', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3210', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '2.75*1500*C', 'caizhi': 'Q235B', 'chandi': '通钢', 'jiage': '3200', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.0*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3190', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.0*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3190', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.0*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3190', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.0*1500*C', 'caizhi': 'Q235B', 'chandi': '通钢', 'jiage': '3180', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.5*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.5*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.5*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3170', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.75*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.75*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '3.75*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.5*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.5*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.5*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q235B', 'chandi': '首钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q235B', 'chandi': '首钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q235B', 'chandi': '首钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.5-11.75*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.5-11.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.5-11.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.5-11.75*1500*C', 'caizhi': 'Q235B', 'chandi': '首钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.5-11.75*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.5-11.75*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1500*C', 'caizhi': 'Q235B', 'chandi': '首钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢承钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q235B', 'chandi': '河钢唐钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q235B', 'chandi': '首钢', 'jiage': '3160', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q235B', 'chandi': '本钢', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q235B', 'chandi': '沧州中铁', 'jiage': '3150', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*1800*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3290', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*1800*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3290', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*1800*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3300', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '5.75*2000*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3310', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '7.75*2000*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3310', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.5*2000*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3310', 'zhangdie': '涨10'}, {'pin_name': '热轧板卷', 'guige': '13.75*2000*C', 'caizhi': 'Q235B', 'chandi': '包钢', 'jiage': '3310', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢承钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢唐钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q355B', 'chandi': '通钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '4.75*1500*C', 'caizhi': 'Q355B', 'chandi': '本钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢承钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢唐钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q355B', 'chandi': '通钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.5*1500*C', 'caizhi': 'Q355B', 'chandi': '本钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢承钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢唐钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q355B', 'chandi': '通钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '5.75*1500*C', 'caizhi': 'Q355B', 'chandi': '本钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*1500*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢承钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢唐钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*1500*C', 'caizhi': 'Q355B', 'chandi': '通钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*1500*C', 'caizhi': 'Q355B', 'chandi': '本钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '11.75*1500*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '11.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢承钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '11.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢唐钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '11.75*1500*C', 'caizhi': 'Q355B', 'chandi': '通钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '11.75*1500*C', 'caizhi': 'Q355B', 'chandi': '本钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢承钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q355B', 'chandi': '河钢唐钢', 'jiage': '3340', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q355B', 'chandi': '通钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*1500*C', 'caizhi': 'Q355B', 'chandi': '本钢', 'jiage': '3330', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '7.75*1800*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3520', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*1800*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3520', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.5*1800*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3520', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*1800*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3520', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '7.75*2000*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3530', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '9.75*2000*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3530', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.5*2000*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3530', 'zhangdie': '涨10'}, {'pin_name': '低合金板卷', 'guige': '13.75*2000*C', 'caizhi': 'Q355B', 'chandi': '包钢', 'jiage': '3530', 'zhangdie': '涨10'}]}

三、写入mysql数据库

把上一步提取到的数据,利用sqlalchemy操作写入mysql数据库中,首先前提

    def mysql(self):

        # 替换为你的数据库连接信息
        DATABASE_URI = 'mysql+pymysql://root:1234567@localhost:3306/baojia'

        # 创建数据库引擎
        engine = create_engine(DATABASE_URI)
        Session = sessionmaker(bind=engine)
        session = Session()

        # 定义JSON数据和表结构
        json_data = self.script()['报价']

        # 假设你有一个名为users的表
        metadata = MetaData(bind=engine)
        users_table = Table('banjuan', metadata, autoload_with=engine)

        # 解析JSON数据并插入到数据库
        for entry in json_data:
            ins = users_table.insert().values(pin_name=entry['pin_name'],
                                              guige=entry['guige'],
                                              caizhi=entry['caizhi'],
                                              chandi=entry['chandi'],
                                              jiage=entry['jiage'],
                                              zhangdie=entry['zhangdie'])
            session.execute(ins)

        # 提交更改
        session.commit()

配置数据库解析:'mysql+pymysql://root:1234567@localhost:3306/baojia'
可以参考我的相关文章也有说明:Owen_ET-《【测试平台开发】——05Flask后端api开发实战(二)—— SqlAlchemy *****

【mysql】:使用的mysql数据库

【pymysql】:使用pymysql的引擎

【://scott】:数据库用户名

【:tiger】:数据库密码

【@localhost】:数据库地址

【/foo】:数据库的库名称

手动创建表结构:数据库名为【baojia】、表名为【banjuan】,以及各个字段值的类型、长度等

其中id设置为自动增加并且设置为键

【运行结果:查看数据库】

运行之后,mysql数据库的数据就插进来了

【完整代码】

import re
import json
import requests
from bs4 import BeautifulSoup as bs
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine, Table, MetaData


class BS:


    def __init__(self):


        # self.url = "https://www.cnblogs.com/Owen-ET/p/14523426.html"
        self.url = "http://www.gtgqw.com/j/showhz2136672.html"
        # url = "http://www.example.com"
        self.dic = {
            "报价": []
        }



    def soup(self):

        res = requests.get(self.url)
        soup = bs(res.text, 'html.parser')
        return soup


    def script(self):

        trs = self.soup().select('.content>table>tbody>tr')
        print(trs)
        print("=================================================================")
        print("=================================================================")
        for tr in trs:
            if (tr != trs[0])&(tr != trs[1]):
                movie = {}
                infos = list(tr.stripped_strings)
                print(infos)
                movie['pin_name'] = infos[0]
                movie['guige'] = infos[1]
                movie['caizhi'] = infos[2]
                movie['chandi'] = infos[3]
                movie['jiage'] = infos[4]
                movie['zhangdie'] = infos[5]
                self.dic["报价"].append(movie)
        print("=================================================================")
        print("=================================================================")
        return self.dic

    def data(self):

        # 生成json文件
        with open("报价.json", 'w', encoding='utf8') as f:
            json.dump(self.script(), f, ensure_ascii=False, indent=4)


    def mysql(self):

        # 替换为你的数据库连接信息
        DATABASE_URI = 'mysql+pymysql://root:1234567@localhost:3306/baojia'

        # 创建数据库引擎
        engine = create_engine(DATABASE_URI)
        Session = sessionmaker(bind=engine)
        session = Session()

        # 定义JSON数据和表结构
        json_data = self.script()['报价']

        # 假设你有一个名为users的表
        metadata = MetaData(bind=engine)
        users_table = Table('banjuan', metadata, autoload_with=engine)

        # 解析JSON数据并插入到数据库
        for entry in json_data:
            ins = users_table.insert().values(pin_name=entry['pin_name'],
                                              guige=entry['guige'],
                                              caizhi=entry['caizhi'],
                                              chandi=entry['chandi'],
                                              jiage=entry['jiage'],
                                              zhangdie=entry['zhangdie'])
            session.execute(ins)

        # 提交更改
        session.commit()


if __name__ == '__main__':
    print(BS().mysql())

四、附录

参考其他的文章:

from sqlalchemy import create_engine, Table, MetaData
from sqlalchemy.orm import sessionmaker
import json
 
# 替换为你的数据库连接信息
DATABASE_URI = 'mysql+pymysql://user:password@localhost:3306/database'
 
# 创建数据库引擎
engine = create_engine(DATABASE_URI)
Session = sessionmaker(bind=engine)
session = Session()
 
# 定义JSON数据和表结构
json_data = '[{"id": 1, "name": "Alice", "age": 30}, {"id": 2, "name": "Bob", "age": 25}]'
 
# 假设你有一个名为users的表,有id, name, age字段
metadata = MetaData(bind=engine)
users_table = Table('users', metadata, autoload_with=engine)
 
# 解析JSON数据并插入到数据库
data = json.loads(json_data)
for entry in data:
    ins = users_table.insert().values(id=entry['id'], name=entry['name'], age=entry['age'])
    session.execute(ins)
 
# 提交更改
session.commit()

登录查看全部

参与评论

评论留言

还没有评论留言,赶紧来抢楼吧~~

手机查看

返回顶部

给这篇文章打个标签吧~

棒极了 糟糕透顶 好文章 PHP JAVA JS 小程序 Python SEO MySql 确认