「爬蟲」從某網(wǎng)站爬取數(shù)據(jù)

一、緣 起

要買房,但是大西安現(xiàn)在可謂是一房難求,大家都爭先恐后地排隊交資料、搖號。截止到現(xiàn)在,筆者已經(jīng)參與過6個樓盤的搖號/選房,但種種原因,依然沒買到合適的房子,無奈,一首 涼~ 涼~ 回蕩在心~
。。。。。。
—— 來自《 定時從某網(wǎng)站爬取壓縮包

在上一篇文章 定時從某網(wǎng)站爬取壓縮包 的基礎(chǔ)上,這次實現(xiàn)的功能是從房管局信息登記網(wǎng)站爬取數(shù)據(jù)并寫入csv文件。

二、思 路

首先,使用Python urlopen方法獲取頁面源碼
然后,調(diào)用Python BeautifulSoup方法庫,實現(xiàn)HTML頁面數(shù)據(jù)靈活提取
最后,將提取出來的頁面數(shù)據(jù)寫入csv文件并打開

三、說 明

腳本結(jié)構(gòu)
  1. Python3.6 + BeautifulSoup + .bat腳本
  2. 主腳本為getRegisDatas.pywriteCsv.py為寫csv文件的腳本、openCsv.bat為打開csv文件的腳本,爬取的數(shù)據(jù)寫入regisData.csv文件中

四、實 現(xiàn)

先上兩張房管局網(wǎng)站

房管局登記網(wǎng)站 - 登記結(jié)束頁面

房管局登記網(wǎng)站 - 結(jié)果公示頁面

  • getRegisData.py
  1. 主腳本定義四個函數(shù),分別為:get_soup()、get_page_url()get_result_url()、get_regis_data()
  2. 每次運行前會先刪除csv文件,再重新生成csv文件并寫入數(shù)據(jù)
  3. 調(diào)用write_csv函數(shù)寫入數(shù)據(jù)到csv文件
  4. 注意:每次運行腳本前確保關(guān)閉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):
    """
    從登記結(jié)束頁面爬取所有分頁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):
    """
    從登記結(jié)束頁面爬取所有的結(jié)果公示url
    :return:
    """
    result_url = []
    result_list = get_soup(url).find_all('span', string='結(jié)果公示')
    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='結(jié)果公示')
            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):
    """
    從結(jié)果公示頁面獲取每個樓盤登記的數(shù)據(jù)
    :return:
    """
    for result_url_i in result_url:
        regis_data = []
        gs = get_soup(result_url_i)
        house_name = gs.find(string=re.compile('意向登記結(jié)果公示')).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(['項目名', '房源數(shù)', '登記數(shù)', '資料核驗數(shù)', '核驗通過數(shù)', '剛需數(shù)', '普通數(shù)', '未通過數(shù)'])
for lst_i in lst:
    get_regis_data(get_result_url(lst_i))
os.system("openCsv.bat")
print('ok!')
  • writeCsv.py
    用于給csv文件寫爬取的數(shù)據(jù)
import csv

def write_csv(row_list):
    """
    數(shù)據(jù)寫入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

五、最 后

regisData.csv

Git地址:https://gitee.com/freedomlidi/autoGetRegisDatas.git

OK!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容