爬虫安居客新房

一、首先看网址

后面有全部代码

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

代码更新:

import requests
import csv
import time
import re

from bs4 import BeautifulSoup
from user_agent import make_headers


class CrawlAnJuKeXinFang:
    def __init__(self, areas, url, save_path):
        self.areas = areas
        self.url = url
        self.save_path = save_path
        # 自机写的随机获取一个header的函数
        self.__headers = make_headers()
        self.__create_file()
        self.__nums = 0
        self.__crawl()
        print(f"完成!总计条{self.__nums}数据")

    # 创建文件
    def __create_file(self):
        with open(self.save_path, 'w', encoding='utf-8', newline="") as f:  # newline=""防止空行
            writer = csv.writer(f)
            writer.writerow(['区域', '楼盘', '地址', '户型', "其他", '价格', '单价', '在售'])

    # 保存数据
    def __save_data(self, row_data):
        with open(self.save_path, 'a', encoding='utf-8', newline="") as f:
            writer = csv.writer(f)
            writer.writerow(row_data)

    # 处理数据
    def __handle_data(self, data, area):
        m = 0
        for d in data:
            try:
                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.replace("\n", ";")
                tags = tags[2:]
                onsale = tags.split(';')[0]  # 是否在售
                prices = d.find_next("a", attrs={"class": "favor-pos"}).text
                price = re.findall(r'\d+', prices)  # 具体价格
                price = price[0] if len(price) > 0 else "待定"

                row_data = [area, lp_name, address, huxing, tags, prices, price, onsale]
                self.__save_data(row_data)
            except Exception as err:
                print(err)
                print("数据获取有误!")
            # 写入数据
            m += 1
            print(area, f"第{m}条数据")
        self.__nums += m

    def __crawl(self):
        for area in self.areas:
            n = 1
            while True:
                if n == 1:
                    new_url = f"{self.url}/{area}"
                else:
                    new_url = f"{self.url}/{area}/p{n}"
                print(new_url)
                print(f"{area}第{n}页数据——————————————————————————————————")
                res = requests.get(new_url, headers=self.__headers).text
                content = BeautifulSoup(res, "html.parser")
                # 当前页和尾页判断
                next_page = content.find('span', attrs={'class': 'next-page stat-disable'})
                # 解析数据
                data = content.find_all('div', attrs={'class': 'item-mod'})
                if data is None:  # 重试
                    n = 1
                    print("正在重试!")
                    continue
                # 处理数据
                self.__handle_data(data, area)
                footer = content.find('div', attrs={"class": "pagination"})  # 是否有换页的控件没有就换一个区县
                # print(footer)
                if next_page is not None or footer is None:  # 没有下一页
                    break
                n += 1
                time.sleep(2)


if __name__ == '__main__':
    xinfang_area = ["taihuxian", "susongxian", "wangjiangxian", "yuexixian", "qianshanshi", "tongchengshi",
                    "huaningxian","daguanqu", "yixiuqu", "yingjiangqu"]
    url = "https://aq.fang.anjuke.com/loupan"  # 安庆新房
    file_name = 'anjuke/anqing_xinfang.csv'

    Crawler = CrawlAnJuKeXinFang(xinfang_area, url, file_name)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

梯度消失是什么意思

梯度 在数学和计算机科学中&#xff0c;梯度是一个向量&#xff0c;表示函数在某一点处的变化率和变化的方向。梯度是多变量函数的偏导数组成的向量。 在机器学习中&#xff0c;梯度也被称为损失函数对模型参数的偏导数。当我们训练一个模型时&#xff0c;通过梯度下降法或其变…

外包干了4个月,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

大模型日报-20240122

清华、小米、华为、 vivo、理想等多机构联合综述&#xff0c;首提个人LLM智能体、划分5级智能水平 https://mp.weixin.qq.com/s/JYB4BzsXhWF8pEUUkvn_GQ 想必这些唤醒词中至少有一个曾被你的嘴发出并成功呼唤出了一个能给你导航、讲笑话、添加日程、设置闹钟、拨打电话的智能个…

硅像素传感器文献调研(六)

写在前面&#xff1a; 感叹一下前人的智慧&#xff0c;保护环结构&#xff1f;保护环——场限制环&#xff1f;怎么发展着还改名字了哈哈哈哈哈 发现一个领域的文章是读得越多越好读了&#xff0c;知识都是那些。 发现大家的引言写的都很像&#xff0c;背后似乎是有一种套路…

Python基础第八篇(Python异常处理,模块与包)

文章目录 一、了解异常二、捕获异常&#xff08;1&#xff09;.异常案例代码&#xff08;2&#xff09;.读出结果 三、异常的传递&#xff08;1&#xff09;.异常传递案例代码&#xff08;2&#xff09;.读出结果 四、Python模块&#xff08;1&#xff09;.模块的导入&#xff…

【RainCloud】搭建网站!

一.领取一个免费域名和SSL证书&#xff0c;和CDN https://www.rainyun.com/z22_ 1.打开网站链接2.在网站主页上&#xff0c;您会看到一个"登陆/注册"的选项。 3.点击"登陆/注册"&#xff0c;然后选择"微信登录"选项。 4.使用您的手机扫描二维…

项目实战——Qt实现FFmpeg音视频转码器

文章目录 前言一、移植 FFmpeg 相关文件二、绘制 ui 界面三、实现简单的转码四、功能优化1、控件布局及美化2、缩放界面3、实现拖拽4、解析文件5、开启独立线程6、开启定时器7、最终运行效果 五、附录六、资源自取 前言 本文记录使用 Qt 实现 FFmepg 音视频转码器项目的开发过…

nginx代理本机多个端口应用

说明&#xff1a; 需求&#xff1a;我当前只有一个端口的授权&#xff0c;比如80&#xff0c;但是我的服务有多个且在不同的端口&#xff0c;比如8081&#xff0c;8082&#xff0c;我希望所有的请求通过都通过80端口进来&#xff0c;然后根据不同的文根怼到不同的端口&#xff…

专业ScrumMaster(高级)- PSM II 认证班,Scrum.org认证PSM II官方认证班

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架&#xff0c;旨在最短时间内交付最大价值。根据2022年全球敏捷状态报告&#xff0c;Scrum的应用占比已经达到87%。 Scrum.org 由 Scrum 的联合创始人 Ken Schwaber 创立…

让代码在键盘上跳“华尔兹”的10大原则

大家好&#xff0c;我是小❤&#xff0c;一个漂泊江湖多年的 985 非科班程序员&#xff0c;曾混迹于国企、互联网大厂和创业公司的后台开发攻城狮。 引言 编程界都知道&#xff0c;代码是一种艺术 —— 它是对技术职责和美学眼光的完美融合。 正如一名工匠在雕琢他的作品&am…

qt+sqllite小区管理系统

&#x1f482; 个人主页:pp不会算法^ v ^ &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 最近接了单子把小区管理系统改改分享出来吧&#xff0c;比较适合q…

python04-变量命名规则

python需要使用标识符来给变量命名。 标识符&#xff0c;我来解释下&#xff0c;就是给程序中变量、类、方法命名的符号&#xff0c;简单理解就是起一个名字&#xff0c;这个名字必须是合法的名字&#xff0c; 对于Python来说&#xff0c;标识符必须是以字母、下划线(_)开头&…

Oracle 19c rac集群管理 -------- 集群启停操作过程

Oracle rac集群启停操作过程 首先查看数据库的集群的db_unique_name SQL> show parameter nameNAME TYPE VALUE ------------------------------------ ----------- --------------------------- cdb_cluster_name …

vue2中CesiumV1.113.0加载离线地形数据

离线地形数据可以放在vue项目下的public/data/sjzTerrain文件下 由于地形离线数据数量太大&#xff0c;在vue项目编译时会报如下错误&#xff1a; ERROR in EMFILE: too many open files, open D:\test_project\vue_cesium_demo\public\data\sjzTerrain\.tmp\14\26787\11669.h…

《WebKit 技术内幕》学习之十二(1):安全机制

第12章 安全机制 安全机制对于浏览器和渲染引擎来说至关重要。一个不考虑安全机制的HTML5规范体系肯定不会受到广泛地使用&#xff0c;同时一个不安全的浏览器也不会得到广大用户的青睐。本章介绍的安全机制分成两个不同的部分&#xff0c;第一个部分是网页的安全&#xff0c;…

web 应用常见的安全问题

一xss攻击 人们经常将跨站脚本攻击&#xff08;Cross Site Scripting&#xff09;缩写为CSS&#xff0c;但这会与层叠样式表&#xff08;Cascading Style Sheets&#xff0c;CSS&#xff09;的缩写混淆。因此&#xff0c;有人将跨站脚本攻击缩写为XSS。 跨站脚本攻击&#xff…

ubuntu 20.04 使用 webrtc-streamer自动退出,报错GLIBC 问题解决方法

文章目录 前言Ubuntu 20.4中使用webrtc-streamer报错总结 前言 前端vue2 项目需要播放海康的视频流&#xff0c;本地启动起来了&#xff0c;现在需要的服务器上部署&#xff0c;服务器是Ubuntu 20.04&#xff0c;下面是部署时遇到的问题及解决方法&#xff0c;总耗时2天。 不知…

Linux之权限(内容详细,细节满满)

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 数据结构初阶 Linux 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力 目录 一.前言 二.权限修改的两种方法 …

3.【SpringBoot3】文章分类接口开发

序言 在文章分类模块&#xff0c;有以下接口需要开发&#xff1a; 新增文章分类文章分类列表获取文章分类详情更新文章分类删除文章分类 数据库表字段和实体类属性&#xff1a; 在数据库表中&#xff0c;create_user 来自于 user 表中的主键 id&#xff0c;是用来记录当前文…