链家二手房成交爬虫

逐渐有了买房的想法,研究一段时间之后,发现各大网站都没有给出一个完整的房价统计数据和走势。好在链家网的每一条二手房成交记录都有对应的网页。如果能把每一套房的成交信息(面积,单价,总价,成交时间,户型,版块,行政区等等)拿到,存入db或者excel中,那么要分析历史走势就容易多了。此程序就是能够抓取链家网二手房成交记录的爬虫

获取所有成交记录url

以成都为例,打开https://cd.lianjia.com/chengjiao/ 可以看到所有已经成交的二手房。每一页显示30个记录,点击记录的标题或者图片就能来到此房源的详细页面。处理完一页翻页即可,似乎很顺利。然而事情并不像这么简单。因为此处最多有第100页的按钮,即使从url中手动输入比100更大的数字,比如(https://cd.lianjia.com/chengjiao/pg101/ )也是返回第100页的内容。也就是说只能爬到3000套成交记录,比页面上显示的十几万套记录少多了。

观察发现,这些成交记录可以按照行政区进行分类浏览。点击锦江区后, 列出了锦江区的成交记录,共1w多套,还是超过了3000,不过已经减少了。更进一步,可以选择锦江区的下的版块分类,比如川师。这时候,成交记录就只剩下700多了。因此,只需要获取所有的行政区,再获取行政区的所有版块。根据版块来翻页,得到该版块的成交记录,最后汇总起来,就是链家成都的所有历史成交记录了。担心有漏网之鱼,可以在爬去每个版块的时候,判断该版块的成交房源数量是否大于3000,如果大于再想办法解决

用Python实现,requests获取页面,lxml处理页面,xpath语法定位所需元素。代码如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32
def (url):

try:

print("processing {}".format(url))

time.sleep(random.uniform(0.5, 1.6))

ret = requests.get(url, headers={'User-Agent': ua.chrome}, cookies=get_cookie(), timeout=5)

return etree.HTML(ret.content)

except Exception as e:

return etree.HTML("<None/>")

def get_regions(suffix):

while True:

page = spider_get_xml(root_url + suffix)

hrefs = page.xpath("//div[@data-role='ershoufang']//a")

regions = {}

for href in hrefs:

regions[href.attrib['href']] = href.text

if len(regions) > 0:

return regions

def get_section(url):

while True:

page = spider_get_xml(root_url + url)

hrefs = page.xpath("//div[@data-role='ershoufang']/div[2]//a")

sections = {}

for href in hrefs:

sections[href.attrib['href']] = href.text

if len(sections) > 0:

return sections

流量异常,被系统制裁了!

经过多次调试,爬虫终于可以顺利地展开工作了。为了防止被发现,我设置了每次web请求采用随机的useragent,并且每次请求过后随机暂停1-2秒的时间。慢点无所谓,只要能爬出所有结果,48小时都OK。然而事情还是没有想象的这么简单。仅仅过了几分钟,爬虫在获取的网页里面就找不到目标元素。我意识到是被对面识别了。用chrome打开链家一看,果然被重定向到一个网页,提示流量异常,争取处理验证问题之后可继续访问。

用chrome的开发者模式能够看到,回答验证码之后,访问链家网时cookie中增加了一些信息。因此只需把这些信息加入爬虫,就能继续抓数据了。

1

2

3

4

5

6

7
def get_cookie():

with open('cookie', 'r') as f:

cookies = {}

for line in f.read().split(';'):

name, value = line.strip().split('=', 1)  

cookies[name] = value

return cookies大专栏  链家二手房成交爬虫v>

这并非万事大吉,即使使用了cookie,连续访问大约十几分钟以后,也会继续警告流量异常。我想了个最简单的方法来解决:获取的页面没有目标元素时,自动用chrome打开此页面,并且暂停程序。通常这页面会直接重定向到验证页面。手动通过验证,让爬虫程序继续,就度过这段危机啦

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49
def process_traded_section(url):

while True:

page = spider_get_xml(root_url + url)

data = page.xpath("//*[@class='total fl']/span")

if len(data) > 0:

total_num = int(data[0].text)

page_num = int(math.ceil(total_num / 30))

# print('{0} has {1} house(s)'.format(section_name, total_num))

break

for i in range(1, page_num + 1):

process_traded_page(root_url + url + "pg{0}/".format(i))

def process_traded_page(url):

# record_url(url)

# return

index = 16

while index > 0:

page = spider_get_xml(url)

data = page.xpath("//*[@class='total fl']/span")

if len(data) > 0:

break

index -= 1

open_browser(url)

input("看看弹出的浏览器信息,处理之后按任意键继续爬")

if index == 0:

print("get stuck in page {}", url)

return

house_refs = page.xpath("//ul[@class='listContent']/li")

for house_ref in house_refs:

process_traded_house(house_ref)

def process_traded_house(house_ref):

try:

title = house_ref.xpath("div[@class='info']/div[@class='title']/a")[0]

house_url = title.attrib['href']

xiaoqu, huxing, area = title.text.split(' ')

area = area[:-2]

deal_date = house_ref.xpath(".//div[@class='dealDate']")[0].text

price = float(house_ref.xpath(".//div[@class='totalPrice']/span")[0].text)

unit_price = float(house_ref.xpath(".//div[@class='unitPrice']/span")[0].text)

info = "{0}t{1:g}t{2:g}t{3}t{4}t{5}t{6}t{7}".format(house_url, price, unit_price, huxing, area,

current_section_name, xiaoqu, deal_date)

record_data(info)

except Exception as e:

pass

任务完成

最终,经过几个小时的一边coding一边解决验证码,终于拿到了成都市和杭州市的十几万套链家二手房成交记录。导入excel制表分析之

PS:

  • 链家对爬虫还算友好,没有封ip,弹验证码的频率也不算高
  • 总算明白网上找人专门点验证码的兼职有何作用了,真是产业啊
  • 北京成交60w套,成都12w,杭州1w5。看来链家在杭州起步比较晚

完整源码

https://github.com/tandztc/maifang

使用方法

  • onsell功能还未完成

    1
    
    2
    
    3
    
    4
    
    5
    
    6
    
    7
    
    usage: ershoufang.py [-h] [-c CITY] [-t {onsell,traded}]
    
    optional arguments:
    
    -h, --help            show this help message and exit
    
    -c CITY, --city CITY  城市拼音首字母,bj for 北京
    
    -t {onsell,traded}, --type {onsell,traded}
    
    在售房源或者历史成交记录
    

原文地址:https://www.cnblogs.com/wangziqiang123/p/11696999.html

时间: 2024-10-08 07:29:26

链家二手房成交爬虫的相关文章

杭州链家二手房数据分析

杭州链家二手房数据 项目说明 练习爬虫相关技术,从网络上抓取数据,保存到本地csv文件和mongodb数据库I中,参考网络上相关资源实现二手房数据可视化,后面继续完善回归分析部分和预测分析. 项目实现 1. 数据获取 二手房数据可以从网络中获取即通过编写爬虫脚本从链家官网中获取相应数据.二手房数据主要采集房源区县信息.房源小区信息.房源户型.楼层信息.朝向信息.房屋面积信息.房屋建筑时间信息和房屋总价信息.具体实现以代码说明. 1.1 观察页面信息 红色方框中信息需要采集,但是缺少房源区县信息.

Python爬取链家二手房数据——重庆地区

最近在学习数据分析的相关知识,打算找一份数据做训练,于是就打算用Python爬取链家在重庆地区的二手房数据. 链家的页面如下: 爬取代码如下: import requests, json, time from bs4 import BeautifulSoup import re, csv def parse_one_page(url): headers={ 'user-agent':'Mozilla/5.0' } r = requests.get(url, headers=headers) so

Python高级应用程序设计任务要求(主题链家二手车)

内容简介 链家二手房成交信息(福州) 本文主要使用了multiprocessing模块创建多个进程对象,使用Queue将多个进程联系在一起,也就是线程之间的通信多个对链家的二手房进行数据的爬取,处理,存储等操作. 结构:主从模式: 主控制节点 从爬虫节点 分析与设计 系统主要核心有两大调度器 1.控制调度器 主要负责管理三个进程:一:负责将地址传递给爬虫节点,二:负责读取爬虫节点返回的数据,三:负责将数据提取进程中提交的数据进行数据持久化 2.爬虫调度器 爬虫节点主要是包括两个功能,下载html

链家广州二手房的数据与分析——数据分析2

继续上一篇的工作继续分析广州链家二手房的数据. Normality Test 用nortest package 的 ad.test() 分别对三个主要因素(面积,总价和均价)进行正态分布检验,结果显示这三个变量都不满足正态分布,而 Q-Q Plot 的表现方式就更直观了: 房子的面积 ad.test(house$area) #p-value < 2.2e-16 reject normality qqnorm(house$area) qqline(house$area, col = 2, lwd=

爬取链家任意城市二手房数据(天津)

1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time : 2019-08-16 12:40 4 # @Author : Anthony 5 # @Email : [email protected] 6 # @File : 爬取链家任意城市二手房数据.py 7 8 9 import requests 10 from lxml import etree 11 import time 12 import xlrd 13 import o

python爬虫:爬取链家深圳全部二手房的详细信息

1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构: class LianjiaSpider(object): def __init__(self): def getMaxPage(self, url): # 获取maxPage def parsePage(self, url): # 解析每个page,获取每个huose的Link def pars

上海二手房8月排名:链家、悟空找房、中原、太平洋、我爱我家、易居、房天下、iwjw、房多多、房好多、q房网、、、

链家称王 房多多领跑电商平台 近日,云房数据公布了8月上海房产中介成交数据,从排行榜来看,前五名分别为,总计占上海二手房市场份额达41%. 具体来看,老牌中介方面,链家德佑8月成交9864套遥遥领先,占据上海市场五分之一份额:互联网电商平台方面,房多多本月共成交1406套二手房,一举超越房天下,成为电商中介平台的领头羊.此外,志远本月3057套销售,升至第二名,成为本月最大黑马. TOP10企业占上海二手房市场份额过半 据云房数据统计,2016年8月上海二手房住宅共成交52380套.根据交易方式

python链家网高并发异步爬虫and异步存入数据

python链家网二手房异步IO爬虫,使用asyncio.aiohttp和aiomysql 很多小伙伴初学python时都会学习到爬虫,刚入门时会使用requests.urllib这些同步的库进行单线程爬虫,速度是比较慢的,后学会用scrapy框架进行爬虫,速度很快,原因是scrapy是基于twisted多线程异步IO框架. 本例使用的asyncio也是一个异步IO框架,在python3.5以后加入了协程的关键字async,能够将协程和生成器区分开来,更加方便使用协程. 经过测试,平均1秒可以爬

Python爬虫项目--爬取链家热门城市新房

本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确定请求方式, 是否存在js加密等. 2. 新建scrapy项目 1. 在cmd命令行窗口中输入以下命令, 创建lianjia项目 scrapy startproject lianjia 2. 在cmd中进入lianjia文件中, 创建Spider文件 cd lianjia scrapy genspi