开发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://www.mzph.cn/news/588932.shtml

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

相关文章

git解决冲突场景

文章目录 git解决冲突场景 git解决冲突场景 假设我们在公司开发了一个功能修改了一个文件 我们现在模拟修改文件之后提交一个版本到本地,但是不上传到远程仓库 假设我们现在回到家开发代码,需要拉去最新的代码 提示已经更新。根本没有最新的代码改动&am…

Codeforces Round 917 (Div. 2) A~F

A.Least Product(思维) 题意: 给出一个数组 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1​,a2​,...,an​,你可以进行若干次以下操作: 选择数组中的一个元素 a i a_i ai​,将这个数字修改为 0 ∼ a i 0 \sim a_i 0∼ai​之…

PHP与Angular详细对比 帮助你选择合适的项目技术

开发可有效扩展并提供诺克斯堡级安全性的Web应用程序和网站是每个开发人员的梦想。而使用这样的产品是每个用户的愿望。因此,为您的项目选择最合适和可靠的技术非常关键。 虽然PHP和Angular是完全不同的技术——PHP与JavaScript是一个更恰当的比较——但它们都广泛…

ACES 增强版不丹水稻作物地图(2016-2022 年)

ACES 增强版不丹水稻作物地图(2016-2022 年) 用于改善粮食安全决策的 2016-2022 年年度作物类型稻米地图仍然是不丹的一项挑战。这些地图是与不丹农业部和 SERVIR 合作开发的。通过专注于发展不丹的科学、技术、工程和数学 (STEM),我们共同开…

kotlin快速入门1

在Google I/O 2017中,Google 宣布 Kotlin 成为 Android 官方开发语言。目前主流AndroidApp开发已经全部切换成此语言,因此对于Android开发而言,掌握Kotlin已经变成必要事情。 Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言&#xff…

OFDM——PAPR减小

文章目录 前言一、PAPR 减小二、MATLAB 仿真1、OFDM 信号的 CCDF①、MATLAB 源码②、仿真结果 2、单载波基带/通频带信号的 PAPR①、MATLAB 源码②、仿真结果 3、时域 OFDM 信号和幅度分布①、MATLAB 源码②、仿真结果 4、Chu 序列和 IEEE802.16e 前导的 PAPR①、MATLAB 源码②…

微服务(1)

目录 1.什么是微服务?谈谈你对微服务的理解? 2.什么是Spring Cloud? 3.Springcloud中的组件有哪些? 3.具体说说SpringCloud主要项目? 5.SpringCloud项目部署架构? 1.什么是微服务?谈谈你对微…

java maven项目添加oracle jdbc的依赖

一般添加依赖是直接在pom.xml中添加配置即可,Maven会自动获取对应的jar包,但是oracle驱动依赖添加后会显示红色,代表找不到依赖项,是因为Oracle授权问题,Maven3不提供Oracle JDBC driver,为了在Maven项目中…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《兼顾捕碳强度与可再生能源消纳的储能容量配置优化方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到两个主要方面:捕碳强度和可再生能源的消纳,以及与之相关的储能容量配置的优化方法。下面我会逐一解读这两个方面&…

【快速全面掌握 WAMPServer】10.HTTP2.0时代,让 WampServer 开启 SSL 吧!

网管小贾 / sysadm.cc 如今的互联网就是个看脸的时代,颜值似乎成了一切! 不信?看看那些直播带货的就知道了,颜值与出货量绝对成正比! 而相对于 HTTP 来说,HTTPS 绝对算得上是高颜值的帅哥,即安…

深入理解Mysql事务隔离级别与锁机制

1. 概述 我们的数据库一般都会并发执行多个事务,多个事务可能会并发的对相同的一批数据进行增删改查操作,可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题,为了解决多事务并发问题&am…

Decorator装饰模式(单一责任)

Decorator(装饰模式:单一责任模式) 链接:装饰模式实例代码 解析 目的 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”,由于继承为类型引入的静态特质,使得这种扩展方式缺乏灵活性&#xff…

《数据结构、算法与应用C++语言描述》- 平衡搜索树 -全网唯一完整详细实现插入和删除操作的模板类

平衡搜索树 完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_34Balanced search tree 概述 本章会讲AVL、红-黑树、分裂树、B-树。 平衡搜索树的应用? AVL 和红-黑树和分裂树适合内部存储的应用。 B-树适合外部存储的…

[Ray Tracing: The Rest of Your Life] 笔记

前言 开年第一篇博客~ 整理了三四个小时才整理完orz。 这一部分是光线追踪三部曲的最后一部,主要介绍了蒙特卡洛积分、重要性采样等内容。场景上没有什么大的改变,基本上就是在Cornell Box中渲染的,本篇主要在加速收敛,提升渲染效…

【快速全面掌握 WAMPServer】09.如何在 WAMPServer 中安装 Composer

网管小贾 / sysadm.cc WAMPServer 的大名想必应该有不少人特别是新手小白们略有耳闻吧。 它是出自法国大神之手的一款 PHP 开发环境集成包,工作于 Windows 环境,类似于它这样的集成包在 Linux 平台上反正我是没找到,所以它应该算是对使用 Wi…

MIT线性代数笔记-第35讲-期末复习

目录 35.期末复习打赏 35.期末复习 已知一个矩阵 A A A满足 A x ⃗ [ 1 0 0 ] A \vec{x} \begin{bmatrix} 1 \\ 0 \\ 0 \end{bmatrix} Ax ​100​ ​无解且 A x ⃗ [ 0 1 0 ] A \vec{x} \begin{bmatrix} 0 \\ 1 \\ 0 \end{bmatrix} Ax ​010​ ​仅有一个解 (1)求 A A A的…

linux安装rabbitmq

文章目录 前言一、下载安装包二、erlang1.安装依赖2.解压3.安装4.环境变量5.验证 三、rabbitmq1.安装依赖2.解压3.新建目录4.rabbitmq.env.conf5.rabbitmq.conf6.环境变量7.启动8.验证9.停止 四、安装web1.安装插件2.访问控制台界面 五、开机启动1.编写脚本2.设置开机启动3.测试…

硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件扩展 (SHE)的区别

术语 硬件安全模块 (HSM) :Hardware Security Modules硬件安全引擎 (HSE) :Hardware Security Engines安全硬件扩展 (SHE) : Secure Hardware Extensions 介绍 在汽车行业中,硬件安全模块 (HSM)、硬件安全引擎 (HSE) 和安全硬件…

Android长按图标展示快捷方式

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {new Thread(() -> {// 获取ShortcutManager实例ShortcutManager shortcutManager getSystemService(ShortcutManager.class);// 创建要添加的快捷方式ShortcutInfo.Builder shortcutBuilder new ShortcutInfo.Bui…

[蓝桥杯2020国赛]答疑

答疑 题目描述 有 n 位同学同时找老师答疑。每位同学都预先估计了自己答疑的时间。 老师可以安排答疑的顺序,同学们要依次进入老师办公室答疑。 一位同学答疑的过程如下: 首先进入办公室,编号为 i 的同学需要 si​ 毫秒的时间。然后同学问…