爬虫安居客新房

news2024/9/24 23:24:48

一、首先看网址

后面有全部代码

https://hf.fang.anjuke.com/loupan/baohequ/p3

这种形式很好分析,https://hf.fang.anjuke.com/loupan/+行政区域+页码

xinfang_area = ["feixixian", "baohequ", "shushanqu", "luyangqu", "yaohaiqu", "gaoxinqu","feidongxian", "zhengwuqu", "jingjikaifaqu"]  # 行政区域
url = "https://hf.fang.anjuke.com/loupan"  # 新房
new_url = f"{url}/{area}/p{n}" # 网页

我们用requests库获取页面内容,再用bs解析,获得bs对象,代码:

for area in xinfang_area:
    n = 1
    while True:
        headers = make_headers()
        if n == 1:
            new_url = f"{url}/{area}"
        else:
            new_url = f"{url}/{area}/p{n}"
        print(new_url)
        res = requests.get(new_url, headers=headers).text
        content = BeautifulSoup(res, "html.parser")
        if content is None:  # 重试
            n = 1
            continue

二、看内容

每一块的内容都是在 <div class="item-mod">标签下面

根据刚获取的页面内容(页面包含当页所有楼盘的内容),用bs的find_all根据class:item-mod获得所有块的列表,我们看看每一块的网页是什么:

根据每一块的,内容代码基本完成了:

data = content.find_all('div', attrs={'class': 'item-mod'})
for d in data:
            lp_name = d.find_next("a", attrs={"class": "lp-name"}).text
            address = d.find_next("a", attrs={"class": "address"}).text
            huxing = d.find_next("a", attrs={"class": "huxing"}).text
            tags = d.find_next("a", attrs={"class": "tags-wrap"}).text
            prices = d.find_next("a", attrs={"class": "favor-pos"}).text
            price = re.findall(r'\d+', prices)[0]  # 具体价格
            # 写入数据
            row_data = [area, lp_name, address, huxing, tags, prices, price]
            with open(file_name, 'a', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(row_data)
            m += 1
            print(area, f"第{n}页第{m}条数据")

三、换区域逻辑

不废话,直接分析

我们看到页面有下一页标签,我们对比有下一页与尾页的下一页标签的不同

这是有下一页的

这是尾页的

我们发现,如果尾页的下一页标签<span class="next-page stat-disable"> 说明是尾页了

此时我们的网页可以到下一个区域爬取了

next_page = content.find('span', attrs={'class': 'next-page stat-disable'})
if next_page is not None:  # 没有下一页
    break

四、全部代码

注意,如果没有数据可能是网页需要验证!

其他城市自己分析网页试试吧,我就不解释了

import requests
import csv
import time
import re

from bs4 import BeautifulSoup
from user_agent import make_headers




xinfang_area = ["feixixian", "baohequ", "shushanqu", "luyangqu", "yaohaiqu", "gaoxinqu",
                "feidongxian", "zhengwuqu", "jingjikaifaqu"]
url = "https://hf.fang.anjuke.com/loupan"  # 新房
file_name = 'anjuke/xinfang.csv'
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0"}

with open(file_name, 'w', encoding='utf-8') as f:
    writer = csv.writer(f)
    # 2:写表头
    writer.writerow(['区域', '楼盘', '地址', '户型', "其他", '价格', '单价'])
for area in xinfang_area:
    n = 1
    while True:
        # headers = make_headers()
        if n == 1:
            new_url = f"{url}/{area}"
        else:
            new_url = f"{url}/{area}/p{n}"
        print(new_url)
        res = requests.get(new_url, headers=headers).text
        content = BeautifulSoup(res, "html.parser")
        if content is None:  # 重试
            n = 1
            print("正在重试")
            continue

        # 当前页和尾页判断
        next_page = content.find('span', attrs={'class': 'next-page stat-disable'})
        # 解析数据
        print(area, f"第{n}页数据")
        m = 0
        data = content.find_all('div', attrs={'class': 'item-mod'})
        for d in data:
            lp_name = d.find_next("a", attrs={"class": "lp-name"}).text
            address = d.find_next("a", attrs={"class": "address"}).text
            huxing = d.find_next("a", attrs={"class": "huxing"}).text
            tags = d.find_next("a", attrs={"class": "tags-wrap"}).text
            prices = d.find_next("a", attrs={"class": "favor-pos"}).text
            price = re.findall(r'\d+', prices)  # 具体价格
            if len(price) > 0:
                price = price[0]
            # 写入数据
            row_data = [area, lp_name, address, huxing, tags, prices, price]
            with open(file_name, 'a', encoding='utf-8') as f:
                writer = csv.writer(f)
                writer.writerow(row_data)
            m += 1
            print(area, f"第{n}页第{m}条数据")
        if next_page is not None:  # 没有下一页
            break

        n += 1
        time.sleep(2)
        new_url = None

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

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

相关文章

fiddler流量捕获之winconfig

windows 使用了一种叫做“AppContainer”的隔离技术&#xff0c;使得一些流量无法正常捕获&#xff0c;在 fiddler中点击 WinConfig 按钮可以解除&#xff0c;这个与菜单栏 Tools→Win8 Loopback Exemptions 功能是相同的&#xff0c;流量捕获&#xff1a;指拦截和记录通过计算…

mysql InnoDB行记录格式

在介绍索引的文章已经知道。InnoDB的表数据被拆分成不同的数据页上&#xff0c;默认一个数据页大小是16kb&#xff0c;分布在聚簇索引的叶子节点上。被挂在B树上。一条行记录除了要保存每列具体数据值还会有一些标识位信息。另外对于超长数据存储也有特殊处理。 那么具体到一行…

第2章-OSI参考模型与TCP/IP模型

目录 1. 引入 2. OSI参考模型 2.1. 物理层 2.2. 数据链路层 2.3. 网络层 2.4. 传输层 2.5. 会话层 2.6. 表示层 2.7. 应用层 3. 数据的封装与解封装 4. TCP/IP模型 4.1. 背景引入 4.2. TCP/IP模型&#xff08;4层&#xff09; 4.3. 拓展 1. 引入 1&#xff09;产…

Mac使用adb调试安卓手机

0x00 背景 最近windows电脑休息&#xff0c;用mac办公比较多&#xff0c;手机用时间长了&#xff0c;不太灵光&#xff0c;准备修理一番。于是要用mac调试下android手机。配置略显麻烦&#xff0c;网上的步骤多参差不齐。估计是入门步骤&#xff0c;大佬们也懒得写的太细。于是…

2024/1/18 DFS BFS

目录 奇怪的电梯 马的遍历 PERKET&#xff08;个人认为很抽象&#xff09; 奇怪的电梯 P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路&#xff0c;还是用的bfs&#xff0c;建立一个结构体类型的队列&#xff0c;一个存当前的电梯层数&#xff0c;一…

数据库-分库分表初探

文章目录 分库策略垂直切分垂直分库&#xff08;专库专用&#xff09;垂直分表&#xff08;拆表&#xff09;优点缺点 水平(Sharding)切分水平分表库内分表分库分表优点缺点 分表策略hash取模方案range范围区间取值方案映射表方案 分库分表问题事务一致性问题跨节点关联查询跨节…

React16源码: React中的completeUnitOfWork的源码实现

completeUnitOfWork 1 &#xff09;概述 各种不同类型组件的一个更新过程对应的是在执行 performUnitOfWork 里面的 beginWork 阶段它是去向下遍历一棵 fiber 树的一侧的子节点&#xff0c;然后遍历到叶子节点为止&#xff0c;以及 return 自己 child 的这种方式在 performUni…

php no input file specified

一、修改 .user.ini 文件 内容 open_basedir/wab/led-sht.com/:/tmp/ led-sportslight.com是项目根目录位置 改好后保存并清空缓存硬刷新网站就行了 二、mkdir(): Permission denied /core/library/think/cache/driver/File.php 第 84 行左右 mkdir(): Permission denied 这个…

如何用 500 行 SQL 实现 GPT2学习

目录 理论背景实现过程GenerationTokenizerEmbeddingsAttention为什么我们需要有因果掩码&#xff1f;为什么矩阵是 Q&#xff0c;K 和 V&#xff1f; BlocksTokens为什么要使用 softmax 转换概率&#xff1f;Inference 俄罗斯有个大佬每年都会用 SQL 来实现一个挑战庆祝新年&a…

JOSEF约瑟 JGL-15静态带时限过流继电器 柜内安装,板前接线

系列型号 JGL-11反时限过流继电器&#xff1b;JGL-12反时限过流继电器&#xff1b; JGL-13反时限过流继电器&#xff1b;JGL-14反时限过流继电器&#xff1b; JGL-15反时限过流继电器&#xff1b;JGL-16反时限过流继电器&#xff1b; 用途&#xff1a; JGL-15 反时限过流继电器…

(十)Head first design patterns组合模式(c++)

组合模式 组合模式在参考链接中已经讲得很好了&#xff0c;这里只简单讲讲就好。 组合模式的意图是表达部分-整体层次结构。 当你需要管理一个组合对象&#xff0c;又要管理这个组合对象的单个对象。这个时候就可以让这个组合对象和单个对象继承同一个基类&#xff0c;以便用…

Android14实战:调整A2DP音量曲线(五十三)

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

【YOLO系列】 YOLOv4之SAT自对抗训练

一、简介 自对抗训练&#xff08;Self-Adversarial Training&#xff0c;简称SAT&#xff09;是一种新型的数据增强技术&#xff0c;旨在通过神经网络自身进行的对抗式攻击来提高模型的鲁棒性和泛化能力。其主要分为两个阶段&#xff1a; 第一阶段&#xff0c;神经网络会对其原…

C# wpf利用Clip属性实现截屏框

wpf截屏系列 第一章 使用GDI实现截屏 第二章 制作截屏框&#xff08;本章&#xff09; ______第一节 使用DockPanel制作截屏框 ______第二节 利用Clip属性实现截屏框(本节) 第三章 实现截屏框热键截屏 第四章 实现截屏框实时截屏 第五章 使用ffmpeg命令行实现录屏 文章目录 wp…

JVM系列-1.初识JVM

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

Netty篇章(1)—— 核心原理介绍

终于进入到Netty框架的环节了&#xff0c;前面介绍了大量的Java-NIO的内容&#xff0c;核心的内容Selector、Channel、Buffer、Reactor掌握了&#xff0c;那么学起来Netty也是水到渠成的事情。如果没有掌握前面的内容那么学Netty会非常吃力&#xff0c;下面讲解Netty核心原理与…

界面控件DevExpress ASP.NET Data Grid组件 - 可快速处理各类型数据!(一)

由DevExpress开发的快速且功能完整的ASP.NET Web Forms的Data Grid组件&#xff0c;从全面的数据塑造和数据过滤选项到十多个集成数据编辑器&#xff0c;该套件提供了帮助用户构建极佳数据所需的一些&#xff0c;没有限制&#xff01; P.S&#xff1a;DevExpress ASP.NET Web …

探索设计模式的魅力:一次设计,多次利用,深入理解原型模式的设计艺术

原型模式是一种设计模式&#xff0c;属于创建型模式的一种&#xff0c;它用于创建重复的对象&#xff0c;同时又能保持性能。在原型模式中&#xff0c;通过复制现有对象的原型来创建新对象&#xff0c;而不是通过实例化类来创建对象。这样做可以避免耗费过多的资源开销&#xf…

关于缓存 db redis local 取舍之道

文章目录 前言一、影响因素二、db or redis or local1.db2.redis3. local 三、redisson 和 CaffeineCache 封装3.1 redisson3.1.1 maven3.1.2 封装3.1.3 使用 3.2 CaffeineCache3.1.1 maven3.1.2 封装3.1.3 使用 总结 前言 让我们来聊一下数据缓存&#xff0c;它是如何为我们带…

01 Redis的特性

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…