链家全国各省城市房屋数据批量爬取,别再为房屋发愁!

2024-01-30 15:40

本文主要是介绍链家全国各省城市房屋数据批量爬取,别再为房屋发愁!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、前言

本文爬取的是链家的二手房信息,相信个位小伙伴看完后一定能自己动手爬取链家的其他模块,比如:租房、新房等等模块房屋数据。

话不多说,来到链家首页,点击北京

来到如下页面,这里有全国各个各个省份城市,而且点击某个城市会跳转到以该城市的为定位的页面


点击二手房,来到二手房页面,可以发现链接地址只是在原先的URL上拼接了 /ershoufang/,所以我们之后也可以直接拼接

 


但注意,以下这种我们不需要的需要排除

多页爬取,规律如下,多的也不用我说了,大家都能看出来


2、基本环境搭建

建立数据库

建表语句

CREATE TABLE `lianjia` (`id` int(11) NOT NULL AUTO_INCREMENT,`city` varchar(100) DEFAULT NULL,`money` varchar(100) DEFAULT NULL,`address` varchar(100) DEFAULT NULL,`house_pattern` varchar(100) DEFAULT NULL,`house_size` varchar(100) DEFAULT NULL,`house_degree` varchar(100) DEFAULT NULL,`house_floor` varchar(100) DEFAULT NULL,`price` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=212 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
123456789101112

创建scrapy项目


start.py

from scrapy import cmdlinecmdline.execute("scrapy crawl lianjia".split())
123

3、代码注释分析

lianjia.py

# -*- coding: utf-8 -*-
import scrapy
import time
from Lianjia.items import LianjiaItemclass LianjiaSpider(scrapy.Spider):name = 'lianjia'allowed_domains = ['lianjia.com']#拥有各个省份城市的URLstart_urls = ['https://www.lianjia.com/city/']def parse(self, response):#参考图1,找到class值为city_list_ul的ul标签,在获取其下的所有li标签ul = response.xpath("//ul[@class='city_list_ul']/li")#遍历ul,每个省份代表一个li标签for li in ul:#参考图2,获取每个省份下的所有城市的li标签data_ul = li.xpath(".//ul/li")#遍历得到每个城市for li_data in data_ul:#参考图3,获取每个城市的URL和名称city = li_data.xpath(".//a/text()").get()#拼接成为二手房链接page_url = li_data.xpath(".//a/@href").get() + "/ershoufang/"#多页爬取for i in range(3):url = page_url + "pg" + str(i+1)print(url)yield scrapy.Request(url=url,callback=self.pageData,meta={"info":city})def pageData(self,response):print("="*50)#获取传过来的城市名称city = response.meta.get("info")#参考图4,找到class值为sellListContent的ul标签,在获取其下的所有li标签detail_li = response.xpath("//ul[@class='sellListContent']/li")#遍历for page_li in detail_li:#参考图5,获取class值判断排除多余的广告if page_li.xpath("@class").get() == "list_app_daoliu":continue#参考图6,获取房屋总价money = page_li.xpath(".//div[@class='totalPrice']/span/text()").get()money = str(money) + "万"#参考图7address = page_li.xpath(".//div[@class='positionInfo']/a/text()").get()#参考图8,获取到房屋的全部数据,进行分割house_data = page_li.xpath(".//div[@class='houseInfo']/text()").get().split("|")#房屋格局house_pattern = house_data[0]#面积大小house_size = house_data[1].strip()#装修程度house_degree = house_data[3].strip()#楼层house_floor = house_data[4].strip()#单价,参考图9price = page_li.xpath(".//div[@class='unitPrice']/span/text()").get().replace("单价","")time.sleep(0.5)item = LianjiaItem(city=city,money=money,address=address,house_pattern=house_pattern,house_size=house_size,house_degree=house_degree,house_floor=house_floor,price=price)yield item1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

3、图片辅助分析

图1


图2


图3


图4


图5


图6


图7


图8


图9


4、完整代码

lianjia.py

# -*- coding: utf-8 -*-
import scrapy
import time
from Lianjia.items import LianjiaItemclass LianjiaSpider(scrapy.Spider):name = 'lianjia'allowed_domains = ['lianjia.com']start_urls = ['https://www.lianjia.com/city/']def parse(self, response):ul = response.xpath("//ul[@class='city_list_ul']/li")for li in ul:data_ul = li.xpath(".//ul/li")for li_data in data_ul:city = li_data.xpath(".//a/text()").get()page_url = li_data.xpath(".//a/@href").get() + "/ershoufang/"for i in range(3):url = page_url + "pg" + str(i+1)print(url)yield scrapy.Request(url=url,callback=self.pageData,meta={"info":city})def pageData(self,response):print("="*50)city = response.meta.get("info")detail_li = response.xpath("//ul[@class='sellListContent']/li")for page_li in detail_li:if page_li.xpath("@class").get() == "list_app_daoliu":continuemoney = page_li.xpath(".//div[@class='totalPrice']/span/text()").get()money = str(money) + "万"address = page_li.xpath(".//div[@class='positionInfo']/a/text()").get()#获取到房屋的全部数据,进行分割house_data = page_li.xpath(".//div[@class='houseInfo']/text()").get().split("|")#房屋格局house_pattern = house_data[0]#面积大小house_size = house_data[1].strip()#装修程度house_degree = house_data[3].strip()#楼层house_floor = house_data[4].strip()#单价price = page_li.xpath(".//div[@class='unitPrice']/span/text()").get().replace("单价","")time.sleep(0.5)item = LianjiaItem(city=city,money=money,address=address,house_pattern=house_pattern,house_size=house_size,house_degree=house_degree,house_floor=house_floor,price=price)yield item12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152

items.py

# -*- coding: utf-8 -*-
import scrapyclass LianjiaItem(scrapy.Item):#城市city = scrapy.Field()#总价money = scrapy.Field()#地址address = scrapy.Field()# 房屋格局house_pattern = scrapy.Field()# 面积大小house_size = scrapy.Field()# 装修程度house_degree = scrapy.Field()# 楼层house_floor = scrapy.Field()# 单价price = scrapy.Field()
123456789101112131415161718192021

pipelines.py

import pymysqlclass LianjiaPipeline:def __init__(self):dbparams = {'host': '127.0.0.1','port': 3306,'user': 'root',  #数据库账号'password': 'root',	#数据库密码'database': 'lianjia', #数据库名称'charset': 'utf8'}#初始化数据库连接self.conn = pymysql.connect(**dbparams)self.cursor = self.conn.cursor()self._sql = Nonedef process_item(self, item, spider):#执行sqlself.cursor.execute(self.sql,(item['city'],item['money'],item['address'],item['house_pattern'],item['house_size'],item['house_degree'],item['house_floor'],item['price']))self.conn.commit()  #提交return item@propertydef sql(self):if not self._sql:#数据库插入语句self._sql = """insert into lianjia(id,city,money,address,house_pattern,house_size,house_degree,house_floor,price)values(null,%s,%s,%s,%s,%s,%s,%s,%s)"""return self._sqlreturn self._sql
123456789101112131415161718192021222324252627282930313233343536

settings.py

# -*- coding: utf-8 -*-BOT_NAME = 'Lianjia'SPIDER_MODULES = ['Lianjia.spiders']
NEWSPIDER_MODULE = 'Lianjia.spiders'LOG_LEVEL="ERROR"# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'Lianjia (+http://www.yourdomain.com)'# Obey robots.txt rules
ROBOTSTXT_OBEY = False# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16# Disable cookies (enabled by default)
#COOKIES_ENABLED = False# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','Accept-Language': 'en',"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36 Edg/84.0.522.63"
}# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'Lianjia.middlewares.LianjiaSpiderMiddleware': 543,
#}# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'Lianjia.middlewares.LianjiaDownloaderMiddleware': 543,
#}# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {'Lianjia.pipelines.LianjiaPipeline': 300,
}# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283

5、运行结果

全部数据远远大于518条,博主爬取一会就停下来了,这里只是个演示


博主会持续更新,有兴趣的小伙伴可以点赞、关注和收藏下哦,你们的支持就是我创作最大的动力!

源码获取加群:1136192749

如有侵权联系小编删除!

 

这篇关于链家全国各省城市房屋数据批量爬取,别再为房屋发愁!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/660718

相关文章

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

MySQL批量替换数据库字符集的实用方法(附详细代码)

《MySQL批量替换数据库字符集的实用方法(附详细代码)》当需要修改数据库编码和字符集时,通常需要对其下属的所有表及表中所有字段进行修改,下面:本文主要介绍MySQL批量替换数据库字符集的实用方法... 目录前言为什么要批量修改字符集?整体脚本脚本逻辑解析1. 设置目标参数2. 生成修改表默认字符集的语句3

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性