python链家新房信息获取练习

2023-11-02

使用python对链家新房相关数据进行爬取,并进行持久化存储。


前言

保持练习


以下是本篇文章正文内容,下面案例可供参考

一、页面分析

老样子进行页面分析,ul下的li中存放着我们想要的信息,没什么好讲的。
在这里插入图片描述
理清楚思路,对所有一共八十几个页面进行访问,随机伪装机型和ip代理,并找到链接的请求格式。
在这里插入图片描述
接下来只需要使用xpath定位到相关的元素信息即可,将解析的数据存入数据库中。
进入代码编写阶段。

二、代码编写

1.数据库表的建立

代码如下:

CREATE TABLE `xinfang` (
  `id` int(255) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `resblock_type` varchar(10) DEFAULT NULL,
  `sale_status` varchar(10) DEFAULT NULL,
  `area` varchar(10) DEFAULT NULL,
  `location` varchar(255) DEFAULT NULL,
  `resblock_room` varchar(10) DEFAULT NULL,
  `resblock_area` varchar(30) DEFAULT NULL,
  `main_price` varchar(150) DEFAULT NULL,
  `second` varchar(30) DEFAULT NULL,
  `img_url` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=843 DEFAULT CHARSET=utf8;

2.代码编写

代码如下:

import requests
from lxml import etree
from fake_useragent import UserAgent
import random
import pymysql

# 代理池
proxy_pool = [{'HTTP': '112.84.53.165:9999'}, {'HTTP': '171.35.169.58:9999'}, {'HTTP': '49.86.180.142:9999'},
              {'HTTP': '113.194.131.190:9999'}, {'HTTP': '110.243.22.233:9999'}, {'HTTP': '123.169.163.99:9999'},
              {'HTTP': '123.163.117.140:9999'}, {'HTTP': '113.195.20.166:9999'}, {'HTTP': '114.235.23.237:9000'},
              {'HTTP': '202.109.157.64:9000'}, {'HTTP': '171.35.175.31:9999'}, {'HTTP': '113.195.168.235:9999'},
              {'HTTP': '125.108.75.135:9000'}, {'HTTP': '123.101.237.3:9999'}, {'HTTP': '139.155.41.15:8118'},
              {'HTTP': '118.212.104.240:9999'}]
# 伪装头
headers = {
    'Referer': 'https://nj.fang.lianjia.com/',
    'User-Agent': UserAgent().random
}

if __name__ == '__main__':
    print('打开数据库...')
    # 打开数据库
    conn = pymysql.Connect(host='localhost', port=3306, user='root',
                           password='', db='spider', charset='utf8')
    # 链接模板 使用format填充
    base_url = 'https://nj.fang.lianjia.com/loupan/pg{}/'
    # 存放url的数组
    data = []
    print('初始化数据...')
    for i in range(1, 86):
        # 循环写入url
        data.append(base_url.format(i))
    print('开始爬取...')
    # 遍历url 请求网址 并解析
    for url in data:
        # get请求访问 使用代理
        response = requests.get(url=url, headers=headers, proxies=random.choice(proxy_pool))
        # etree解析
        res_data = etree.HTML(response.content.decode())
        # xpath定位到所有的li
        lis = res_data.xpath('//li[@class="resblock-list post_ulog_exposure_scroll has-results"]')
        # 在循环的li下进行解析
        for li in lis:
            # 图片地址
            img_url = li.xpath('./a/img/@data-original')[0].split('.592x432.jpg')[0]
            # 小区名字
            name = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-name"]/a[1]/text()')[0]
            # 以下都是相关信息 就不做赘叙
            resblock_type = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-name"]/span[1]/text()')[0]
            sale_status = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-name"]/span[2]/text()')[0]
            area = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-location"]/span[1]/text()')[0]
            location = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-location"]/span[1]/text()')[0] + '/' + \
                       li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-location"]/span[2]/text()')[0] + '/' + \
                       li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-location"]/a[1]/text()')[0]
            resblock_room = li.xpath('./div[@class="resblock-desc-wrapper"]/a[@class="resblock-room"]/span[1]/text()')
            # 有些数据为空 要进行替换 否则数据库写入报错
            if resblock_room:
                resblock_room = resblock_room[0]
            else:
                resblock_room = '暂无信息'
            resblock_area = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-area"]/span[1]/text()')
            if resblock_area:
                resblock_area = resblock_area[0]
            else:
                resblock_area = '暂无信息'
            main_price = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-price"]/div[@class="main-price"]/span[@class="number"]/text()')[0]
            second = li.xpath('./div[@class="resblock-desc-wrapper"]/div[@class="resblock-price"]/div[@class="second"]/text()')
            if second:
                second = second[0]
            else:
                second = '暂无信息'
            # sql语句
            sql = 'insert into xinfang(name, resblock_type, sale_status, area, location, resblock_room, resblock_area, main_price, second, img_url) values ("{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}", "{}")'.format(
                name, resblock_type, sale_status, area, location, resblock_room, resblock_area, main_price, second,
                img_url)
            cursor = conn.cursor()
            # 事务 提交 回滚
            try:
                cursor.execute(sql)
                conn.commit()
            except Exception as e:
                print(e)
                conn.rollback()
    print('爬取结束关闭数据库...')
    # 关闭数据库链接 程序结束
    conn.close()


结果

程序运行结果如下:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python链家新房信息获取练习 的相关文章

随机推荐

  • 常见的错误-04

    引言 在公司配置新电脑环境时候 在安装和配置完所有VSCode软件以及C 环境后 ubuntun环境下 尝试使用debug进行代码调试 遇到了在debug过程中不输出结果的bug 如下图 未输出array以及zheli 解决方法 在ubun
  • vue3+ts中对getCurrentInstance的使用

    1 在main js中挂载一个全局属性 拿axios举例 import App from App vue import axios from http 封装的axios方法 const app createApp App 创建应用 app
  • 【100%通过率 】【华为OD机试 c++/java/python】对称字符串【 2023 Q1 A卷

    华为OD机试 题目列表 2023Q1 点这里 2023华为OD机试 刷题指南 点这里 题目描述 对称美学 对称就是最大的美学 现有一道关于对称字符串的美学 已知 第 1 个字符串 R 第 2 个字符串 BR 第 3 个字符串 RBBR 第
  • resetlog

    来自于itpub的一篇文章 http space itpub net 16628454 很多人说 resetlogs就是不完全恢复 这是不对的 做不完全恢复必须使用resetlogs 但resetlogs也可以做完全恢复 而noresetl
  • # 第四届蓝桥杯JavaB组省赛-马虎的算式

    第四届蓝桥杯JavaB组省赛 马虎的算式 题目描述 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 4
  • 解决idea文件properties中文乱码问题

    有时候将项目代码拉取至本地用idea打开时会出现中文乱码问题 遇到这种问题不要慌 重新设置一下编码为UTF 8即可 那么如何将idea的编码统一设置为UTF 8格式呢 接下来我们一一解决此类问题 1 打开idea编译器 有时候会看到打开的文
  • WebGIS工程师进阶训练营

    WebGIS工程师进阶训练营 1 WebGIS课程综述 2 多类情景部署SuperMap iServer 2 1 Linux环境部署SuperMap iServer 2 2 war包部署 2 3 常见问题排查 3 SuperMap iSer
  • word添加、更新目录

    1 显示导航窗口 视图 导航窗口 2 文档中的目录 2 1 插入目录 引用 目录 2 2 更新目录 方式一 点击下图 更新目录 方式二 引用 更新目录
  • WinForm使用鼠标裁剪图像

    之前做一个试卷识别的项目的时候需要预先将各个部分裁剪开然后进行识别 而网上的裁剪函数都是记录鼠标的位置然后进行裁剪 public static Bitmap PartDraw Image src Rectangle cutpart 切割图片
  • (休息几天)读米什金之货币银行学——货币与汇率

    1货币 当一国货币升值时 相对于其他货币价值上升 则该国商品在国外变得更贵 而外国商品唉本国则变得更便宜 相反 一国货币贬值 则该国商品在国外更便宜 而外国商品在本国则变得更贵 货币升值使得本国制造的商品在国外竞争力下降 而国外商品在本国竞
  • Koa2.js router 异步返回ctx.body失效的问题

    koa2 js 用router返回数据时 正常写法如下 我是将接口封装了 一个很普通的koa2 js get请求 router put getUserInfo ctx next gt const data ctx request body
  • PHP自己的框架2.0版本目录结构和命名空间自动加载类(重构篇一)

    目录 1 目录结构演示效果 2 搭建目录结构 以及入口public gt index php 3 引入core下面core gt base php 4 自动加载实现core gt fm gt autoload php 5 框架运行文件cor
  • Basic Level 1012 数字分类 (20分)

    题目 给定一系列正整数 请按要求对数字进行分类 并输出以下 5 个数字 A 1 A 1 A1 能被 5 整除的数字中所有偶数的和 A 2
  • matlab 取余(rem)和取模(mod)的区别

    取余 rem 和取模 mod 的区别 Matlab 生成机制 取余 采取fix 函数 向0方向取整 取模 采取floor 函数 向无穷小方向取整 当A B异号时 其实同号也是这个规律 取余 结果和A同号 取模 结果和B同号 PS 在js c
  • ASP .net core 整合 nacos 通过Spring Cloud Gateway 网关访问

    ASP net core 整合 nacos 通过Spring Cloud Gateway 网关访问 使用vs创建web项目 选择api 注意这里要取消掉Https配置否则使用网关转发也需要配置为https请求这里我们直接取消 添加nacos
  • WebRTC实现多人视频聊天

    写在前面 实现房间内人员的视频聊天 由于并未很完善 所以需要严格按照步骤来 当然基于此完善 就是时间的问题了 架构 整个设计架构如下 图片来自于参考博文 我使用的是第一种Mesh 架构 无需任何流媒体服务器 直接利用成熟的WebRTC 协议
  • windows10进程查询命令、端口占用查询命令、杀进程命令

    windows环境下编码开发经常遇到端口占用问题 解决时需要找到对应进程杀掉 释放占用 自己常用的几项操作命令如下 首先 打开Windows的命令窗口 键盘 win R 输入cmd 回车 1 查询端口被占用的进程 命令 netstat ao
  • 马虎的算式 有一次,老师出的题目是:36 x 495 = ?他却给抄成了:396 x 45 = ? 但结果却很戏剧性,他的答案竟然是对的!!

    马虎的算式 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 495 396 45 17820 类似这样
  • 信息传递【NOIP2015】【强连通分量 Tarjan】

    题目链接 题目描述 有 n 个同学 编号为 1 到 n 正在玩一个信息传递的游戏 在游戏里每人都有一个固定的信息传递对象 其中 编号为 i 的同学的信息传递对象是编号为Ti的同学 游戏开始时 每人都只知道自己的生日 之后每一轮中 所有人会同
  • python链家新房信息获取练习

    使用python对链家新房相关数据进行爬取 并进行持久化存储 文章目录 前言 一 页面分析 二 代码编写 1 数据库表的建立 2 代码编写 结果 前言 保持练习 以下是本篇文章正文内容 下面案例可供参考 一 页面分析 老样子进行页面分析 u