一、緣 起
要買房,但是大西安現在可謂是一房難求,大家都爭先恐后地排隊交資料、搖號。截止到現在,筆者已經參與過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