一、缘 起
要买房,但是大西安现在可谓是一房难求,大家都争先恐后地排队交资料、摇号。截止到现在,笔者已经参与过6个楼盘的摇号/选房,但种种原因,依然没买到合适的房子,无奈,一首 凉~ 凉~ 回荡在心~
。。。。。。
—— 来自《 定时从某网站爬取压缩包 》
在上一篇文章 定时从某网站爬取压缩包 的基础上,这次实现的功能是从房管局信息登记网站爬取数据并写入csv文件。
二、思 路
首先,使用Python urlopen方法获取页面源码
然后,调用Python BeautifulSoup方法库,实现HTML页面数据灵活提取
最后,将提取出来的页面数据写入csv文件并打开
三、说 明
- Python3.6 + BeautifulSoup库 + .bat脚本
- 主脚本为getRegisDatas.py、writeCsv.py为写csv文件的脚本、openCsv.bat为打开csv文件的脚本,爬取的数据写入regisData.csv文件中
四、实 现
先上两张房管局网站
- getRegisData.py
- 主脚本定义四个函数,分别为:get_soup()、get_page_url()、get_result_url()、get_regis_data()
- 每次运行前会先删除csv文件,再重新生成csv文件并写入数据
- 调用write_csv函数写入数据到csv文件
- 注意:每次运行脚本前确保关闭csv文件,否则csv文件被占用程序会报异常
from autoGetRegisDatas.writeCsv import write_csv
from bs4 import BeautifulSoup
from urllib import request
import os
import re
def get_soup(url):
"""
将页面用BeautifulSoup库处理
:return:
"""
header = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:59.0) Gecko/20100101 Firefox/59.0"
}
req = request.Request(url, headers=header)
html = request.urlopen(req).read().decode(\'utf-8\')
soup = BeautifulSoup(html, \'html.parser\')
return soup
def get_page_url(url):
"""
从登记结束页面爬取所有分页url,存入列表中
:param url:
:return:
"""
page_url = []
paging = get_soup(url).find_all(href=re.compile(\'page\'))
if paging is not []:
for paging_i in range(len(paging)-1):
page_url.append(url.split(\'xmgs\')[0] + paging[paging_i][\'href\'])
return page_url
def get_result_url(url):
"""
从登记结束页面爬取所有的结果公示url
:return:
"""
result_url = []
result_list = get_soup(url).find_all(\'span\', string=\'结果公示\')
for result_list_i in result_list:
result_url.append(url.split(\'xmgs\')[0] + result_list_i[\'onclick\'].split("=\'")[1].split("\'")[0])
if get_page_url(url) is not []:
for page_i in get_page_url(url):
result_list = get_soup(page_i).find_all(\'span\', string=\'结果公示\')
for result_list_i in result_list:
result_url.append(url.split(\'xmgs\')[0] + result_list_i[\'onclick\'].split("=\'")[1].split("\'")[0])
return result_url
def get_regis_data(result_url):
"""
从结果公示页面获取每个楼盘登记的数据
:return:
"""
for result_url_i in result_url:
regis_data = []
gs = get_soup(result_url_i)
house_name = gs.find(string=re.compile(\'意向登记结果公示\')).split(\' 意向\')[0].strip()
regis_data.append(house_name)
all_data = gs.find_all(\'font\')
for data_i in all_data:
regis_data.append(data_i.string.strip())
write_csv(regis_data)
os.remove(\'regisData.csv\')
url1 = \'http://124.115.228.93/zfrgdjpt/xmgs.aspx?state=4\'
url2 = \'http://124.115.228.93/zfrgdjpt/xmgsca.aspx?state=4\'
lst = [url1, url2]
write_csv([\'项目名\', \'房源数\', \'登记数\', \'资料核验数\', \'核验通过数\', \'刚需数\', \'普通数\', \'未通过数\'])
for lst_i in lst:
get_regis_data(get_result_url(lst_i))
os.system("openCsv.bat")
print(\'ok!\')
-
writeCsv.py
用于给csv文件写爬取的数据
import csv
def write_csv(row_list):
"""
数据写入csv文件
:return:
"""
with open(\'regisData.csv\', \'a\', newline=\'\') as csvfile:
writer = csv.writer(csvfile, dialect=\'excel\')
writer.writerow(row_list)
-
openCsv.bat
用于打开regisData.csv文件夹
start %~dp0\regisData.csv
五、最 后
Git地址:https://gitee.com/freedomlidi/autoGetRegisDatas.git