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

这里写自定义目录标题

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

爬取代码

import requests
import time
from lxml import html
from pymongo import MongoClient
import randomBASEURL = '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_linkprint("当前区县:",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+1else:pages = count//10print("这个区域有" + 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=',')#详情页urldetail_url = BASEURL+"p_"+project_idprint(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为0if price=='价格待定':price = Noneelse:price = int(price)print(price,end=',')#获取标签tagtag = content.xpath("/html/body/div[3]/ul[2]/li[{}]/div/div[5]/span/text()".format(i+1))print(tag,end='\n')except:breakdoc = {"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.连接集合并实现插入passdef main():print('开始!')# 重庆主站URLurl = '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://xiahunao.cn/news/2660774.html

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

相关文章

云手机引领社交平台运营新潮流

在网络高度发展的今天,社交平台已经成为企业宣传推广的关键渠道之一。传统的社交运营方式已经无法满足效率的要求,云手机因而开始引领社交平台运营的新潮流。本文将深入探讨云手机如何重新定义社交平台运营,为用户和企业带来更为便捷、智能的…

定期修改公司数据协议的重要性

目录 ​编辑 为公司和客户数据提供更好的安全性 利用现代数据分析工具 标准化您的数据收集流程 改善数据的使用 增强您的营销和销售活动 定义数据分类指南 创建更具凝聚力和协作性的团队 遵守法律法规 结论 企业主可以使用许多对其成功至关重要的工具&#…

[BUG] Hadoop-3.3.4集群yarn管理页面子队列不显示任务

1.问题描述 使用yarn调度任务时,在CapacityScheduler页面上单击叶队列(或子队列)时,不会显示应用程序任务信息,root队列可以显示任务。此外,FairScheduler页面是正常的。 No matching records found2.原…

计算机视觉与自然语言处理(Open AI)

1.语音识别技术 语音识别是将语音转换为文本的技术, 是自然语言处理的一个分支。通过特征的提取、模式的匹配将语音信号变为文本或命令,以实现机器识别和理解语音。 按照应用场景的不同,可以大致分为三类; • 电信级系统应用&…

VS配置PCO相机SDK环境

VS配置PCO相机SDK环境 概述:最近要用到一款PCO相机,需要协调其他部件实现一些独特的功能。因此需要用到PCO相机的SDK,并正确配置环境。良好的环境是成功的一半。其SDK可以在官网下载,选择对应版本的安装即可。这里用的是pco.cpp.1.2.0 Windows,VS 2022 专业版。 链接: P…

数据结构 day6 栈+队列+二分查找+插入排序

插入排序 #include <stdio.h> #include<string.h> #include<stdlib.h> int main(int argc, const char *argv[]) {int a[]{41,50,66,38,32,49,18};int nsizeof(a)/sizeof(a[0]);int i,j,t;for(i1;i<n;i){int ta[i];for(ji-1;j>0;j--){if(t<a[j]){a…

【MATLAB】交叉验证求光滑因子的广义神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 交叉验证求光滑因子的广义神经网络时序预测算法的基本原理如下&#xff1a; 首先&#xff0c;我们需要了解什么是交叉验证和光滑因子。交叉验证是一种评估模型性能的常用方法&#xff0c…

基于源码去理解Iterator迭代器的Fail-Fast与Fail-Safe机制

原创/朱季谦 在Java编程当中&#xff0c;Iterator迭代器是一种用于遍历如List、Set、Map等集合的工具。这类集合部分存在线程安全的问题&#xff0c;例如ArrayList&#xff0c;若在多线程环境下&#xff0c;迭代遍历过程中存在其他线程对这类集合进行修改的话&#xff0c;就可…

009:vue结合el-table实现表格行拖拽排序(基于sortablejs)

文章目录 1. 实现效果2. 安装 sortablejs 插件3. 完整组件代码4. 注意点 1. 实现效果 2. 安装 sortablejs 插件 sortablejs 更多用法 cnpm i --save sortablejs3. 完整组件代码 <template><div class"home"><div class"body"><el-ta…

可以加速 Pandas(即使在 CPU 环境中)而无需编码...... FireDucks

引言 使用 Pandas 处理大量数据时&#xff0c;是否曾因处理时间过长而感到沮丧&#xff1f; 显然&#xff0c;一个库已经发布&#xff0c;可以在不改变现有代码的情况下加速 Pandas。 由 NEC Laboratories 发布的名为 FireDucks 的库的 Beta 版本可以免费使用。 而且&#xff…

浅谈WPF之控件模板Control Template和数据模板Data Template

WPF不仅支持传统的Windows Forms编程的用户界面和用户体验设计&#xff0c;同时还推出了以模板为核心的新一代设计理念。在WPF中&#xff0c;通过引入模板&#xff0c;将数据和算法的“内容”和“形式”进行解耦。模板主要分为两大类&#xff1a;数据模板【Data Template】和控…

linux cat命令增加-f显示文件名功能

在使用cat命令配合grep批量搜索文件内容时&#xff0c;我仅仅能知道是否搜索到&#xff0c;不知道是在哪个文件里找到的。比如cat ./src/*.c | grep full_write,在src目录下的所有.c文件里找full_write,能匹配到所有的full_write&#xff0c;但是不知道它们分别在哪些文件里。于…

【八】【C语言\动态规划】1567. 乘积为正数的最长子数组长度、413. 等差数列划分、978. 最长湍流子数组,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

黑客攻击服务器之后如何清除痕迹?如何进行伪装和逃脱追踪?

黑客攻击服务器之后如何清除痕迹?如何进行伪装和逃脱追踪?附完整执行代码。 在攻击结束后,如何不留痕迹的清除日志和操作记录,以掩盖入侵踪迹,这其实是一个细致的技术活。你所做的每一个操作,都要被抹掉;你所上传的工具,都应该被安全地删掉。 黑客的一次攻击行为,主…

HarmonyOS应用开发-仿微信UI实现

在本篇博客中&#xff0c;介绍一个仿微信的 HarmonyOS 应用&#xff0c;应用包括微信的首页、通讯录、发现、我的页面&#xff0c;以及聊天界面。 一、先上效果图&#xff1a; 二、代码解读 以聊天界面为例&#xff0c;代码如下&#xff08;解读在代码下面&#xff09;&#…

【华为数据之道学习笔记】7-3基于物理世界的“硬感知”能力

“硬感知”能力的分类 数据采集方式主要经历了人工采集和自动采集两个阶段。自动采集技术仍在发展中&#xff0c;不同的应用领域所使用的具体技术手段也不同。基于物理世界的“硬感知”依靠的就是数据采集&#xff0c;是将物理对象镜像到数字世界中的主要通道&#xff0c;是构建…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-1x000-1x111(总结)

基于表73中&#xff0c;主输出使能&#xff08;MOE1&#xff09;的8种OCx与OCxN的输出状态及波形图&#xff0c;已经单独整理输出8篇文章&#xff0c;方便需要时单独回查。 主输出使能时&#xff08;MOE1&#xff09;总结如下 通过表73中可得以下结论 1、控制位1x000与1x100…

ffmpeg两种windows版本区别说明

版本一 必须拷贝exe和dll文件才能使用&#xff0c;如果缺少dll则exe不正正常执行 如果缺少dll &#xff0c;执行 exe会报错如下 版本2 直接拷贝exe就能使用&#xff0c;没有依赖的环境

test perf-03-性能测试之 Gatling 使用入门官方教程

quick start 快速入门 学习 Gatling 的概念&#xff0c;使用录制器创建可运行的 Gatling 仿真。 介绍 在这一部分&#xff0c;我们将使用 Gatling 进行负载测试一个简单的云托管的 Web 服务器&#xff0c;并向您介绍 DSL&#xff08;领域特定语言&#xff09;的基本要素。 …

机器学习 -- 数据预处理

系列文章目录 未完待续…… 目录 系列文章目录 前言 一、数值分析简介 二、内容 前言 tips&#xff1a;这里只是总结&#xff0c;不是教程哈。 以下内容仅为暂定&#xff0c;因为我还没找到一个好的&#xff0c;让小白&#xff08;我自己&#xff09;也能容易理解&#x…