如上图,某网站每天会公布城市的新建商品房可售、未售、签约情况,现在需要把这些数据获取下来,并写入数据库中。整个过程分为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()#关闭数据库