Advertisement

python爬取网页数据并自动写入SQLserver数据库

阅读量:

如图所示, 某网站每日都会发布城市新建商品房可售、未售及签约的相关数据, 现在需要对这些信息进行提取, 并将其存储到数据库中。整个操作流程共包含两个主要环节: 第一部分是针对网页内容进行解析, 实现目标信息的提取; 第二部分则是建立与数据库的连接, 实现数据的存储功能。

一、数据爬取

在处理数据抓取时仍是一种较为常见的做法,
该网站界面设计非常友好,
无需担心其具备动态加载功能或其他反爬措施,
因此可以直接采用requests库与BeautifulSoup进行网页解析,并结合[select]元素(参考此处)的方法即可完成数据抓取。
需要注意的一点是,在完成数据提取后需将数据转换为元组格式。

复制代码
 import requests

    
 import time
    
 from bs4 import BeautifulSoup
    
 import pandas as pd
    
 import datetime
    
 import pymssql
    
  
    
 def doSth():
    
     # 定义解析网页的函数
    
     def get_html(url):
    
     res = requests.get(url)
    
     res.encoding = 'utf-8'
    
     soup = BeautifulSoup(res.text,'lxml')
    
     return soup 
    
  
    
     # 将数据爬取并打包成tuple格式  
    
     data_xj = []
    
     data_ks = []
    
     data_ws = []
    
     time = datetime.date.today() - datetime.timedelta(days=1) #获取昨天的日期
    
     yes_time_nyr = time.strftime('Y'+'%Y'+'M'+'%m')#月份格式
    
     soure_xj = '每日新建商品房签约信息'+str(time)
    
     soure_ks = '每日新建商品房可售信息'+str(time)
    
     soure_ws = '每日新建商品房未售信息'+str(time)
    
     http = 'http://www.gzcc.gov.cn/data/Category_177/Index.aspx'
    
     soup = get_html(http)
    
     
    
     #插入每日新建商品房签约信息
    
     items_xj = soup.select('table[class="resultTableD"]')[2]
    
     res_xj = items_xj.select('tr[bgcolor="#ffffff"]')
    
     for i in res_xj:
    
     data_xj.append((yes_time_nyr,time,soure_xj,)+tuple(i.text.split())[0:1]+('住宅',) + tuple(i.text.split())[1:3])
    
     data_xj.append((yes_time_nyr,time,soure_xj,)+tuple(i.text.split())[0:1]+('商业',) + tuple(i.text.split())[3:5])
    
     data_xj.append((yes_time_nyr,time,soure_xj,)+tuple(i.text.split())[0:1]+('办公',) + tuple(i.text.split())[5:7])
    
     data_xj.append((yes_time_nyr,time,soure_xj,)+tuple(i.text.split())[0:1]+('车位',) + tuple(i.text.split())[7:9])
    
     #data.append(tuple(i.text.split())[:1] +(time,)+ tuple(i.text.split())[1:])#将list中的每个元素转换为数组
    
     
    
     #每日新建商品房可售信息
    
     items_ks = soup.select('table[class="resultTableD"]')[0]
    
     res_ks = items_ks.select('tr[bgcolor="#ffffff"]')
    
     for j in res_ks:
    
     data_ks.append((yes_time_nyr,time,soure_ks,)+tuple(j.text.split())[0:1]+('住宅',) + tuple(j.text.split())[1:3])
    
     data_ks.append((yes_time_nyr,time,soure_ks,)+tuple(j.text.split())[0:1]+('商业',) + tuple(j.text.split())[3:5])
    
     data_ks.append((yes_time_nyr,time,soure_ks,)+tuple(j.text.split())[0:1]+('办公',) + tuple(j.text.split())[5:7])
    
     data_ks.append((yes_time_nyr,time,soure_ks,)+tuple(j.text.split())[0:1]+('车位',) + tuple(j.text.split())[7:9])
    
     
    
     #每日新建商品房未售信息
    
     items_ws = soup.select('table[class="resultTableD"]')[1]
    
     res_ws = items_ws.select('tr[bgcolor="#ffffff"]')
    
     for k in res_ws:
    
     data_ws.append((yes_time_nyr,time,soure_ws,)+tuple(k.text.split())[0:1]+('住宅',) + tuple(k.text.split())[1:3])
    
     data_ws.append((yes_time_nyr,time,soure_ws,)+tuple(k.text.split())[0:1]+('商业',) + tuple(k.text.split())[3:5])
    
     data_ws.append((yes_time_nyr,time,soure_ws,)+tuple(k.text.split())[0:1]+('办公',) + tuple(k.text.split())[5:7])
    
     data_ws.append((yes_time_nyr,time,soure_ws,)+tuple(k.text.split())[0:1]+('车位',) + tuple(k.text.split())[7:9])

二、连接数据库并写入数据

连接数据库需要用到pymssql包,如果需要安装,打开命令行:

复制代码
    pip install pymssql

这个包是专门用来进行数据库交互操作的,操作步骤分2步:

1、创建链接:使用connect()创建连接并获取Connection对象

2、数据库交互:从Connection对象中获取Cursor对象,并调用该Cursor对象的各项功能以实现数据库间的互动交流

3、关闭链接

复制代码
 #将数据写入数据库

    
     #连接数据库
    
     server = "服务器名,如果是本地数据库IP用127.0.0.1"
    
     user = "用户名"
    
     password = "密码"
    
     database = "数据库名"
    
     conn = pymssql.connect(server, user, password, database)
    
     cursor = conn.cursor()
    
     if not cursor:
    
     raise(NameError,"连接数据库失败")
    
     else:
    
     print('OK')
    
     #写入数据
    
     sql_xj = "INSERT INTO table1 ([年月],[日期],[来源],[区域],[类型],[套数],[面积]) VALUES (%s,%s,%s,%s,%s,%d,%d)"
    
     cursor.executemany(sql_xj, data_xj)
    
     sql_ks = "INSERT INTO table2 ([年月],[日期],[来源],[区域],[类型],[套数],[面积]) VALUES (%s,%s,%s,%s,%s,%d,%d)"
    
     cursor.executemany(sql_ks, data_ks)
    
     sql_ws = "INSERT INTO table3 ([年月],[日期],[来源],[区域],[类型],[套数],[面积]) VALUES (%s,%s,%s,%s,%s,%d,%d)"
    
     cursor.executemany(sql_ws, data_ws)
    
     # 如果没有指定autocommit属性为True的话就需要调用commit()方法
    
     conn.commit()
    
     print(time,'写入数据库成功')
    
     conn.close()#关闭数据库

全部评论 (0)

还没有任何评论哟~