1. 程式人生 > >python爬蟲爬取鏈家二手房資訊

python爬蟲爬取鏈家二手房資訊

一種有想做個爬蟲的想法,正好上個月有足夠的時間和精力就學了下scrapy,一個python開源爬蟲框架。好多事開始以為很難,但真正下定決心去做的時候,才發現非常簡單,scrapy我從0基礎到寫出第一個可用的爬蟲只用了兩天時間,從官網例項到我的demo,真是遇到一堆問題,通過查docs查部落格,一個個問題解決下來,發現已經漸漸熟知了這個框架,真是發現帶著問題去學習才是快的學習方式。 
  大學的時候有用python寫過爬蟲,但沒用什麼框架,用urllib把網頁原始碼down下來後,寫一堆正則表示式來提取其中的內容,真是快吐了。所以我一直覺得爬蟲網頁內容解析才是最麻煩的地方,scrapy提供xpath的方式提取網頁內容,大大簡化了爬蟲的開發。另外,我們自己實現爬蟲還要去管理所有的爬取動作,你爬取完這頁,你還得去觸發下一頁,為了防止被ban,你還要構造header頭,設定爬取規則…… scrapy簡化了這一切,你只需要告訴它你要爬什麼,要哪些資料,資料怎麼儲存即可。你只需要專注於爬取結果就好了,剩下的寫middleware、pipline、item…… 簡單的爬蟲甚至不需要這些。 
  我用scrapy實現了一個爬取鏈家二手房的爬蟲,全部原始碼我已經放到github上了

https://github.com/xindoo/ershoufang。我需要宣告的是這只是個簡答的demo,存在一些問題,接下來我先說明有哪些問題,再來看看核心程式碼。 
  

問題一

  鏈家網站也有反爬蟲策略和robots限制,robots限制忽略(不然沒法爬),另外頻繁爬取會直接導致被ban,需要隔天才會解禁止。防止被ban的方法有多種,1.禁止cookie 2.設定header 3.加大爬取間隔 4.使用代理。我只用了前三種方法,具體可以在settings.py 和middlewares.py裡看到。因為沒有免費好用的代理,所以在爬蟲實際使用中沒用方法4,但我在middlewares.py裡也留下了相關程式碼,可稍做參考,但需要注意那幾個代理ip是不可用的。

問題二

  我程式碼裡只爬取了3000套二手房價格,北京市實際在售的二手房大概有兩萬套,不是我不想全爬,只是鏈家只展示100頁(3000套)的內容,排序方式我也並不清楚。我嘗試通過分割槽域來爬取以獲得更多的資料,但爬蟲更容易被ban,大概爬幾頁後就被禁了,目前看來只能通過使用代理的方式解決。

問題三

  我的爬取起始頁是http://bj.lianjia.com/ershoufang/pg1/,一直爬取到100頁, 我在程式碼裡註釋掉的 start_urls包含了北京市所有的區,如果不被ban,理論上是可以拿到北京市所有的二手房資訊的。爬取的資料有如下。

‘region’: 小區 
‘url’: 房屋詳情頁連結 
‘houseInfo’: 房屋資訊 類似| 3室2廳 | 126.4平米 | 南 北 | 精裝 | 有電梯

 
‘unitPrice’: 每平米單價(元) 
‘totalPrice’: 房屋總結(萬元) 
‘attention’: 被關注數 
‘visited’: 被經紀人帶看次數 
‘publishday’: 房屋釋出多長時間

下面是爬蟲核心程式碼,全部程式碼可以上我github獲取。

# -*- coding: utf-8 -*-
import scrapy
import re

class ershoufangSpider(scrapy.Spider):
    name = "ershoufang"
    #下面是北京市所有區的起始url
    # start_urls = ["http://bj.lianjia.com/ershoufang/dongcheng/pg1", "http://bj.lianjia.com/ershoufang/xicheng/pg1", "http://bj.lianjia.com/ershoufang/chaoyang/pg1", "http://bj.lianjia.com/ershoufang/haidian/pg1", "http://bj.lianjia.com/ershoufang/fengtai/pg1", "http://bj.lianjia.com/ershoufang/shijingshan/pg1", "http://bj.lianjia.com/ershoufang/tongzhou/pg1", "http://bj.lianjia.com/ershoufang/changping/pg1", "http://bj.lianjia.com/ershoufang/daxing/pg1", "http://bj.lianjia.com/ershoufang/yizhuangkaifaqu/pg1", "http://bj.lianjia.com/ershoufang/shunyi/pg1", "http://bj.lianjia.com/ershoufang/fangshan/pg1", "http://bj.lianjia.com/ershoufang/mentougou/pg1", "http://bj.lianjia.com/ershoufang/pinggu/pg1", "http://bj.lianjia.com/ershoufang/huairou/pg1", "http://bj.lianjia.com/ershoufang/miyun/pg1", "http://bj.lianjia.com/ershoufang/yanqing/pg1", "http://bj.lianjia.com/ershoufang/yanjiao/pg1"]
    #實際爬取過程中我只用了預設的起始url,不容易被ban
    start_urls = ["http://bj.lianjia.com/ershoufang/pg1"]
    def parse(self, response):
        houses = response.xpath(".//ul[@class='sellListContent']/li")
        for house in houses:
            attention = ''
            visited = ''
            publishday = ''
            try:
                attention = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[0]
                visited = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[1]
                #因為釋出日期中可能單位不是天,所以我做了簡單的轉化。
                if u'月' in house.xpath(".//div[@class='followInfo']/text()").extract()[0].split('/')[2]:
                    number = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]
                    publishday = '' + int(number)*30

                elif u'年' in house.xpath(".//div[@class='followInfo']/text()").extract()[0].split('/')[2]:
                    number = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]
                    publishday = '365'
                else:
                    publishday = house.xpath(".//div[@class='followInfo']/text()").re("\d+")[2]
            except:
                print "These are some ecxeptions"
            else:
                pass
            yield {
                'region': house.xpath(".//div[@class='houseInfo']/a/text()").extract(),
                'url':house.xpath(".//a[@class='img ']/@href").extract(),
                'houseInfo':house.xpath(".//div[@class='houseInfo']/text()").extract(),
                'unitPrice':house.xpath(".//div[@class='unitPrice']/span").re("\d+.\d+"),
                'totalPrice':house.xpath(".//div[@class='totalPrice']/span").re("\d+.\d+"),
                'attention': attention,
                'visited': visited,
                'publishday': publishday
            }
        page = response.xpath("//div[@class='page-box house-lst-page-box'][@page-data]").re("\d+")
        p = re.compile(r'[^\d]+')
        #這裡是判斷有沒有下一頁,畢竟不是所有區都是有第100頁的,不能for迴圈到100
        if len(page)>1 and page[0] != page[1]:
            next_page = p.match(response.url).group()+str(int(page[1])+1)
            next_page = response.urljoin(next_page)
            yield scrapy.Request(next_page, callback=self.parse)
  • 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
  • 50
  • 51

結語

  說幾個我拿資料看出來的結果。1.通過publishday我發現平均房屋留存時間變長。2.房屋均價上個月7萬,這個月大概下降3-5k。 3.北京最便宜房屋單價1.6萬/平方米,最貴14.9萬/平方米(最貴和最便宜的一直都沒賣出去)。 說明房市稍有降溫。再次申明,這是從3000套房資料的統計結果,不是全量房屋統計結果,大家看看就好。 

相關推薦

python爬蟲二手資訊

一種有想做個爬蟲的想法,正好上個月有足夠的時間和精力就學了下scrapy,一個python開源爬蟲框架。好多事開始以為很難,但真正下定決心去做的時候,才發現非常簡單,scrapy我從0基礎到寫出第一個可用的爬蟲只用了兩天時間,從官網例項到我的demo,真是遇到一堆問題,通

爬蟲二手資訊,對二手做分析

import numpy as np import pandas as pd import matplotlib.pyplot as plt from bs4 import BeautifulSoup import requests def genera

Django實戰: Python爬蟲上海二手資訊,存入資料庫並在前端顯示

好久沒寫Django實戰教程了,小編我今天就帶你把它與Python爬蟲結合做出個有趣的東西吧。我們將開發這樣一個應用,前端使用者可以根據行政區劃,房廳數和價格區間選擇需要爬取的二手房房源資訊,後臺Python開始爬取資料。爬取資料完成後,通過Django將爬來的資料存入資料庫

聽說現在買房就是給自己投資?Python二手樓盤!

      發現請求頭資訊如下,這個是後面要模擬的: Host: m.lianjia.com User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101

Python地鐵資料

#coding=gbk #因為涉及到中文,utf-8會報錯 ### 環境:Python 3.6### import requests import re import pandas as pd import csv from bs4 import BeautifulSoup

利用高德API + Python網租房資訊 01

看了實驗樓的專案發現五八同城爬取還是有點難度所以轉戰鏈家 實驗程式碼如下 from bs4 import BeautifulSoup from urllib.request import urlopen import csv url = 'https://gz.lia

Python的scrapy之網房價資訊並儲存到本地

因為有在北京租房的打算,於是上網瀏覽了一下鏈家網站的房價,想將他們爬取下來,並儲存到本地。 先看鏈家網的原始碼。。房價資訊 都儲存在 ul 下的li 裡面 ​   爬蟲結構: ​ 其中封裝了一個數據庫處理模組,還有一個user-agent池。。   先看mylian

利用Python爬蟲京東商品的簡要資訊

一、前言   本文適合有一定Python基礎的同學學習Python爬蟲,無基礎請點選:慕課網——Python入門   申明:例項的主體框架來自於慕課網——Python開發簡單爬蟲   語言:Python2   IDE:VScode二、何為爬蟲   傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的UR

Python爬蟲智聯招聘職位資訊

目的:輸入要爬取的職位名稱,五個意向城市,爬取智聯招聘上的該資訊,並列印進表格中 #coding:utf-8 import urllib2 import re import xlwt class ZLZP(object): def __init__(self

python 爬蟲所有上市公司公告資訊(一)

。,。前面我們已經瞭解了python中多執行緒,selenium,requests等爬蟲基本操作的知識,現在我們準備編寫一個規模較大的爬蟲,目的是爬取所有上市公司2015年至今的公告資訊。 相較於前面幾個簡單的爬蟲功能程式碼,公告資訊爬蟲需要考慮更多的問題,現在可以預見到的

python 爬蟲所有上市公司公告資訊(五)

。,。現在我們進過for迴圈,已經獲取到了每一個股票程式碼在2015年至今所有的公告內容連線和公告日期,且是以(日期,公告內容url)元組的形式加入到了爬取佇列中, 在最內層迴圈結束後,我們編寫程式實現多執行緒和儲存公告內容的功能。 公告最終在對應的json檔案裡是以鍵值對

python3爬蟲上海租房資訊

環境:win10,anaconda3(python3.5) 方法一:利用requests獲取網頁資訊,再利用正則提取資料,並將結果儲存到csv檔案。 程式碼地址:程式碼 抓取到的資料如下所示: 從左往右依次是:房屋連結、房屋描述、房屋佈局、房屋大小、所在區、所在區的具體區

一、如何網頁房源資訊

由於個人安裝的Python版本是2.7的,因此此後的相關程式碼也是該版本。 爬取網頁所有資訊 利用urllib2包來抓取網頁的資訊,先介紹下urllib2包的urlopen函式。 urlopen:將網頁所有資訊存到一個object裡,我們可通過讀取這個o

python 爬蟲所有上市公司公告資訊(二)

。,。設計公告資訊爬蟲面臨的主要問題在上一篇文章已經敘述過了,這篇文章我們選擇合適的資料來源和爬取的方式 首先選擇爬取的資料來源,這裡筆者經過多方比較,最終選擇了東方財富網作為公告爬蟲的資料來源。 下面以飛馬國際為例(002210) 我們可以看到,東方財富網專門設有網頁儲

網租房資訊(萬級資料的簡單實現)

這不是一個很難的專案,沒有ajax請求,也沒有用框架,只是一個requests請求和BeautifulSoup的解析 不過,看這段程式碼你會發現,BeautifulSoup不止只有find和fing_all用於元素定位,還有fing_next等其他的更簡單的,

python爬蟲深圳全部二手的詳細信息

data sts rip 二手房 lse area 列表 dom bubuko 1、問題描述: 爬取鏈家深圳全部二手房的詳細信息,並將爬取的數據存儲到CSV文件中 2、思路分析: (1)目標網址:https://sz.lianjia.com/ershoufang/ (2

python 學習 - 爬蟲入門練習 二手資訊

import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db") c = conn.cursor() for num in range(1,101): url = "h

爬蟲網北京二手資訊

# 鏈家網二手房資訊爬取 import re import time import requests import pandas as pd from bs4 import BeautifulSoup url = 'http://bj.lianjia.com/ershouf

python+scrapy 成都二手和成交資訊

爬蟲設計方案 爬取目標 成都鏈家的二手房和成交資料。 由於web版看不到最新的成交金額資料,因此需要用手機版的資料。 成交資料應該去重,可以做成每天增量爬取。 需要做成每天爬取一次,定時執行 參考文章 技術方案 使用Scrapy框架,

Python爬蟲項目--熱門城市新房

聲明 rules nal logging 命令行 -- new exec 狀態 本次實戰是利用爬蟲爬取鏈家的新房(聲明: 內容僅用於學習交流, 請勿用作商業用途) 環境 win8, python 3.7, pycharm 正文 1. 目標網站分析 通過分析, 找出相關url