您当前的位置:首页 > 文章 > 使用Python爬虫将网页搜索结果写入MSSQL数据库

使用Python爬虫将网页搜索结果写入MSSQL数据库

作者:J符离 时间:2023-08-25 阅读数:301 人阅读

 

如上图,某网站每天会公布城市的新建商品房可售、未售、签约情况,现在需要把这些数据获取下来,并写入数据库中。整个过程分为2大部分,第一部分是网页的解析,将目标信息获取,第二部分是数据库的连接,将数据存入数据库。

一、数据爬取

数据爬取还是老套路了,这个网页极其友好,没有什么动态加载或反爬机制等,所以直接用网页下载器requests+网页解析器BeautifulSoup+select语法即可。有一点需要注意的是,为了方便后面将数据写入数据库,在获取数据后,需要将数据整理成tuple格式。

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()#关闭数据库

本站大部分文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了您的权益请来信告知我们删除。邮箱:1451803763@qq.com