• 「爬虫」从某网站爬取数据


    一、缘 起

    要买房,但是大西安现在可谓是一房难求,大家都争先恐后地排队交资料、摇号。截止到现在,笔者已经参与过6个楼盘的摇号/选房,但种种原因,依然没买到合适的房子,无奈,一首 凉~ 凉~ 回荡在心~
    。。。。。。
    —— 来自《 定时从某网站爬取压缩包

    在上一篇文章 定时从某网站爬取压缩包 的基础上,这次实现的功能是从房管局信息登记网站爬取数据并写入csv文件

    二、思 路

    首先,使用Python urlopen方法获取页面源码
    然后,调用Python BeautifulSoup方法库,实现HTML页面数据灵活提取
    最后,将提取出来的页面数据写入csv文件并打开

    三、说 明

    脚本结构

    1. Python3.6 + BeautifulSoup + .bat脚本
    2. 主脚本为getRegisDatas.pywriteCsv.py为写csv文件的脚本、openCsv.bat为打开csv文件的脚本,爬取的数据写入regisData.csv文件中

    四、实 现

    先上两张房管局网站
    房管局登记网站 - 登记结束页面
    房管局登记网站 - 结果公示页面

    • getRegisData.py
    1. 主脚本定义四个函数,分别为:get_soup()get_page_url()get_result_url()get_regis_data()
    2. 每次运行前会先删除csv文件,再重新生成csv文件并写入数据
    3. 调用write_csv函数写入数据到csv文件
    4. 注意:每次运行脚本前确保关闭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
    egisData.csv
    

    五、最 后

    regisData.csv

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

    OK!

    积跬步,至千里
  • 相关阅读:
    HTML DOM-->内部样式表与外部样式表的读写
    HTML DOM-->行间样式表的读写
    HTML DOM-->获取文本节点
    HTML DOM-->获取属性节点
    HTML DOM-->获取标签(元素)节点
    HTML DOM-->简介
    JS 浏览器BOM-->setTimeout() 方法
    JS 浏览器BOM-->clearInterval() 方法
    JS 浏览器BOM-->setInterval() 方法
    JS 浏览器BOM-->onresize方法
  • 原文地址:https://www.cnblogs.com/freedomlidi/p/12431259.html
Copyright © 2020-2023  润新知