开发Python网络爬虫应用,爬取链家新房楼盘信息保存到mongodb中,并分析相关数据

news2025/1/22 9:24:05

这里写自定义目录标题

  • 爬取代码
  • 分析数据
  • 问题

爬取代码

import requests
import time
from lxml import html
from pymongo import MongoClient
import random

BASEURL = 'https://cq.fang.lianjia.com/loupan/'

# 获取某市区域的所有链接
def get_areas(url):
    print('获取区县列表')
    # 设置请求头
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
    # 获取请求页面数据
    res = requests.get(url, headers=headers)
    content = html.fromstring(res.text)
    # 获取区县名称文本
    areas = content.xpath('//div[@class="filter-by-area-container"]/ul[@class="district-wrapper"]/li/text()')
    # 区县太多,只设置主城九区
    areas = ['江北', '渝北', '渝中', '沙坪坝', '九龙坡', '南岸', '大渡口', '巴南', '北碚']
    # areas = ['大足', '武隆区', '石柱', '涪陵', '綦江','长寿', '江津', '合川', '南川', '璧山', '铜梁', '潼南', '万州', '梁平', '云阳', '黔江', '双桥 ', '永川', '丰都', '秀山土家族苗族自治县', '忠县', '巫山县', '荣昌区', '奉节县', '开州区', '垫江县', '酉阳土家族苗族自治县', '彭水苗族土家族自治县', '巫溪县', '城口县']
    print(areas)
    # 获取区县名称拼写
    areas_link = content.xpath('//div[@class="filter-by-area-container"]/ul[@class="district-wrapper"]/li/@data-district-spell')
    # 区县太多,只设置主城九区
    areas_link = ['jiangbei', 'yubei', 'yuzhong', 'shapingba', 'jiulongpo', 'nanan', 'dadukou', 'banan', 'beibei']
    # areas_link = ['dazu', 'wulongqu', 'shizhu', 'fuling', 'qijiang', 'changshou1', 'jiangjing', 'hechuang', 'nanchuang', 'bishan', 'tongliang', 'tongnan', 'wanzhou', 'liangping', 'yunyang', 'qianjiang', 'shuangqiao1', 'yongchuan', 'fengdu1', 'xiushantujiazumiaozuzizhixian', 'zhongxian', 'wushanxian1', 'rongchangqu', 'fengjiexian', 'kaizhouqu', 'dianjiangxian', 'youyangtujiazumiaozuzizhixian', 'pengshuimiaozutujiazuzizhixian', 'wuxixian', 'chengkouxian']
    # print(areas_link)
    if not areas:
        print("主站页面未获取成功,请手动查看页面是否需要人机验证!")
        return
    # 遍历获取所有区县的链接
    for i in range(0, len(areas)):
        area = areas[i]

        area_link = areas_link[i]
        # print(area_link)
        link = url+area_link
        print("当前区县:",area," ",link)
        get_pages(area, link)


#通过获取某一区域的页数,来拼接某一页的链接
def get_pages(area, area_link):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36'}
    res = requests.get(area_link, headers=headers)
    content = html.fromstring(res.text)
    #链家新房页面统计每个区域的楼盘个数
    try:
        count = int(content.xpath('//div[@class ="page-box"]/@data-total-count')[0])
    except:
        print(count)
    #转换成页面,获取每个页面的楼盘信息
    if count%10 :
        pages = count//10+1
    else:
        pages = count//10
    print("这个区域有" + str(pages) + "页")

    for page in range(1, pages+1):
        url = area_link+'/pg' + str(page)
        print("开始抓取第" + str(page) +"页的信息")
        get_house_info(area, url)


#获取某一区域某一页的详细房租信息
def get_house_info(area, url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.5359.125 Safari/537.36'}
    time.sleep(1+2*random.random()) # 间隔随机1-3秒避免访问太密集触发反扒机制
    try:
        # 获取页面信息
        print(url)
        res = requests.get(url, headers=headers)
        content = html.fromstring(res.text)
        data = []  # 构造一个列表存放当前页面所有楼盘详情
        for i in range(10): # 每页有10条楼盘信息
            try:
                # 获取楼盘详情:
                #获取编号
                project_id = content.xpath("//ul[@class='resblock-list-wrapper']/li/@data-project-name")[i]
                print(project_id,end=',')
                #详情页url
                detail_url = BASEURL+"p_"+project_id
                print(detail_url,end=',')
                # 获取标题
                title = content.xpath("//ul[@class='resblock-list-wrapper']/li/a/@title")[i]
                print(title,end=',')
                # 获取详细小区信息
                detail_area= content.xpath("//ul[@class='resblock-list-wrapper']/li//div[@class='resblock-location']/span[2]/text()")[i]
                print(detail_area,end=',')
                # 获取详细地址
                detail_place = content.xpath("//ul[@class='resblock-list-wrapper']/li//div[@class='resblock-location']/a/text()")[i]
                print(detail_place,end=',')
                # 获取小区类型
                type = content.xpath("//ul[@class='resblock-list-wrapper']/li//div[@class='resblock-name']/span[1]/text()")[i]
                print(type,end=',')
                sale_status = content.xpath("//ul[@class='resblock-list-wrapper']/li//div[@class='resblock-name']/span[2]/text()")[i]
                print(sale_status,end=',')
                # 获取面积
                try:
                    square = content.xpath("//ul[@class='resblock-list-wrapper']/li//div[@class='resblock-area']/span/text()")[i]
                except:
                    square = ""
                print(square,end=',')
                # 获取价格
                price = content.xpath("//ul[@class='resblock-list-wrapper']/li//div[@class='main-price']/span[1]/text()")[i]
                #价格待定的楼盘设置price为0
                if price=='价格待定':
                    price = None
                else:
                    price = int(price)
                print(price,end=',')
                #获取标签tag
                tag = content.xpath("/html/body/div[3]/ul[2]/li[{}]/div/div[5]/span/text()".format(i+1))
                print(tag,end='\n')
                
            except:
                break
            
            doc = {
                "project_id":project_id,
                "detail_url":detail_url,
                "area":area,
                "title":title,
                "detail_area":detail_area,
                "detail_place":detail_place,
                "type":type,
                "sale_status":sale_status,
                "square":square,
                "price":price,
                "tag":tag
            }    
            data.append(doc)
        save_data(data) #保存到mongodb中,该方法框架已写好,需要自己实现细节   
        print('continue the next page...')
    except:
        print(res.text)
        print(url)
        print('详情页面未获取成功,请手动查看页面是否需要人机验证!')
        time.sleep(30)
        

def save_data(data=None,host="127.0.0.1",port=27017,db_name="lianjia",col_name="loupan"):
   
    '''
    将解析到的楼盘详情数据存储到MongoDB数据库中
    :param data: 楼盘详情数据
    :param host: mongodb服务器地址
    :param port: mongodb服务端口
    :param db_name: mongodb数据库名称
    :param col_name: mongodb数据集合名称
    :return:
    '''
    #1.创建连接数据库对象
    #2.连接数据库
    #3.连接集合并实现插入
    
    pass

def main():
    print('开始!')
    # 重庆主站URL
    url = 'https://cq.fang.lianjia.com/loupan/'
    # 访问主站URL获取区县信息
    get_areas(url)
    
    

if __name__ == '__main__':
    main()
    

分析数据

  1. 分析各个区新楼盘的平均价格、房屋占比情况等等
    在这里插入图片描述
    在这里插入图片描述

问题

  1. 问题一
    没有相应的包,截图省略

解决方案:通过pip安装下面三个包即可

pip install requests
pip install lxml
pip install pymongo
  1. 问题二
    count = int(content.xpath(‘//div[@class =“page-box”]/@data-total-count’)[0])
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^
    IndexError: list index out of range
    在这里插入图片描述
    解决办法:打开对应的网页(https://cq.fang.lianjia.com/loupan/jiangbei)进行人机验证即可。这里是因为拿不到data-total-count值报错

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1347637.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QT上位机开发(抽奖软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 用抽奖软件抽奖,是一种很常见的抽奖方式。特别是写这篇文章的时候,正好处于2023年12月31日,也是一年中最后一天…

蓝牙物联网智能门控系统设计方案

随着电子信息技术的飞速发展,物联网技术提升到国家战略高度,研发和应用进程加速并不断取得实质性进展。物联网核心技术包括传感测试技术、网络通信技术、云计算等,具有广域覆盖、大容量、超低功耗和低成本等特点,目前在远程监控、…

win11 电脑睡眠功能失效了如何修复 win11 禁止鼠标唤醒

1、win11睡眠不管用怎么办,win11电脑睡眠功能失效了如何修复 在win11系统中拥有许多令人激动的新功能和改进,有些用户在使用win11电脑时可能会遇到一个问题:睡眠模式不起作用。当他们尝试将计算机置于睡眠状态时,却发现系统无法进…

学习SpringCloud微服务

SpringCloud 微服务单体框架微服务框架SpringCloud微服务拆分微服务差分原则拆分商品服务拆分购物车服务拆分用户服务拆分交易服务拆分支付服务服务调用RestTemplate远程调用 微服务拆分总结 服务治理注册中心Nacos注册中心服务注册服务发现 OpenFeign实现远程调用快速入门引入…

Plantuml之JSON数据语法介绍(二十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒…

Spring Cloud + Vue前后端分离-第10章 基于阿里云OSS的文件上传

源代码在GitHub - 629y/course: Spring Cloud Vue前后端分离-在线课程 Spring Cloud Vue前后端分离-第10章 基于阿里云OSS的文件上传 前面介绍的文件上传是基于本地文件服务器的文件上传,但是自己搭文件服务器会有很多运维的问题,比如磁盘满了要扩容…

VMware虚拟机之文件夹共享jdk和tomcat安装防火墙设置

目录 一. 配置文件夹共享功能 1.1 为什么需要配置文件夹共享功能 1.2 配置文件共享功能 1.3 普通共享和高级共享的区别 1.3.1 普通共享 1.3.2 高级共享 1.3.3 总结 二. jdk的配置 2.1 安装jdk 2.2 配置jdk的环境配置jdk 2.3 配置成功 三. TomCat的配置 四. 防火墙设置 4.1…

【VMware】Windows安装MySQL(5.78版本)及网络配置---图文并茂详细介绍

一 安装MySQL准备工作 ① 连接虚拟机传输MySQL压缩包 先查看虚拟机中的地址 命令: ipconfig 主机连接 在主机连接虚拟机后,将mysql压缩包和Navicat安装包复制到虚拟机下即可 ②解压MySQL压缩包 ③ my文件拷贝mysql安装根目录下 如下图的第一步&…

云卷云舒:构建业务型电信智能运维方法

1 引言 智能运维(AIOps-Algorithmic IT Operations基于算法的IT运维)是人工智能技术在IT运维领域的运用,引用Gartner 的报告的一段话“未来几年,将近50%的企业将会在他们的业务和IT运维方面采用AIOps,远远高于今天的10…

windows怎么在cmd中通过命令关闭防火墙

windows怎么在cmd中通过命令关闭防火墙 1.打开终端(cmd) 2.关闭防火墙 输入命令: netsh advfirewall set allprofiles state off

2023 年四川省职业院校技能大赛(高职组)应用软件系统开发赛项样题

2023 年四川省职业院校技能大赛 (高职组)应用软件系统开发赛项样题 目录 竞赛说明 二、竞赛内容 三、竞赛成果物提交​编辑 四、文档及组件 五、竞赛注意事项 模块一:系统需求分析 二、任务要求 三、竞赛任务 任务 1:智造双碳—能…

Docker的一个简单例子(一)

文章目录 环境示例准备构建启动/停止容器更新应用分享应用 参考 环境 RHEL 9.3Docker Community 24.0.7 示例 准备 从github克隆 getting-started-app 项目: git clone https://github.com/docker/getting-started-app.git查看项目: ➜ getting-s…

C#编程-编写和执行C#程序2

C#编程-编写和执行C#程序 问题陈述 Dvid所在的团队正在为网球比赛开发自动排名软件。他负责创建一个程序来接受网球选手的以下详细信息并将其显示在屏幕上: 1.姓名 2.排名 您需要帮助David创建该程序。 要创建所需的程序,David需要执行以下步骤: 1.打开“记事本”。 2.在“…

2023-12-17 LeetCode每日一题(使用最小花费爬楼梯)

2023-12-17每日一题 一、题目编号 746. 使用最小花费爬楼梯二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。 你…

CCNP课程实验-05-Comprehensive_Experiment

目录 实验条件网络拓朴配置实现基础配置实现IGP需求:1. 根据拓扑所示,配置OSPF和EIGRP2. 在R3上增加一个网段:33.33.33.0/24 (用Loopback 1模拟) 宣告进EIGRP,并在R3上将EIGRP重分布进OSPF。要求重分布进OSPF后的路由Tag值设置为6…

使用STM32实现多设备UART通信指南

本文将介绍如何在STM32上实现多设备UART通信,包括配置多个UART接口、数据的发送和接收,以及如何有效地进行多设备通信。我们将使用STM32CubeMX和HAL库来演示配置过程,并给出相关的示例代码和技巧。UART(Universal Asynchronous Re…

【Java】JUC并发编程(重量锁、轻量锁、偏向锁)

JUC并发编程 预备: 创建一个maven工程,导入lombok和logback的依赖。 1、基础概念 1、进程与线程 **进程:**程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU ,数…

MongoDB的基本使用

MongoDB的引出 使用Redis技术可以有效的提高数据访问速度,但是由于Redis的数据格式单一性,无法操作结构化数据,当操作对象型的数据时,Redis就显得捉襟见肘。在保障访问速度的情况下,如果想操作结构化数据,…

【操作系统】存储器管理

目录 4.1 存储器的层次结构 4.1.1 多级存储结构 4.1. 2 可执行存储器 4.1.3 高速缓存和磁盘缓存 4.2 程序的装入和链接 4.2.1 程序的装入 4.2.2 程序的链接 1.静态链接(Static Linking)方式 (1) 对相对地址进行修改。 (2) 变换外部调用符号。 2. 装入时动态链接(Load-t…

2013年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

“一元复始,万象更新。行而不辍,未来可期。” 努力学习和奋斗的时光总是过得飞快,不知不觉,2024年已经悄然而至,今天是2024年1月1日,六分成长祝所有的读者朋友和孩子们新年快乐!学习进步&#…