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)
还没有任何评论哟~
