爬取房天下二手房數(shù)據(jù)和二手房房?jī)r(jià)分析及預(yù)測(cè)

第一部分 爬蟲(chóng)

  1. 數(shù)據(jù)來(lái)源:房天下
  2. 網(wǎng)頁(yè)結(jié)構(gòu)分析
  • 通過(guò)抓包分析網(wǎng)頁(yè)信息否过,房源信息就是包含在當(dāng)前HTML文件中汽摹。
  • 目標(biāo)URL規(guī)律:

第一頁(yè):https://lz.esf.fang.com/house/i31/
第二頁(yè):https://lz.esf.fang.com/house/i32/
第三頁(yè):https://lz.esf.fang.com/house/i33/
......
第十頁(yè):https://lz.esf.fang.com/house/i310/
從中可以看出李丰,變化的只是最后面的一部分,那么實(shí)現(xiàn)多頁(yè)爬取時(shí)構(gòu)造新的URL就比較容易逼泣。(拼接頁(yè)數(shù)就可以)

  1. 爬取內(nèi)容分析
    為了得到更多的有用信息趴泌,需要進(jìn)行詳情頁(yè)的跳轉(zhuǎn),也就是說(shuō)拉庶,首先獲取詳情頁(yè)鏈接嗜憔,然后在請(qǐng)求獲取房源信息。


    info1.png

    info2.png
  2. 難點(diǎn)

  • 重定向

當(dāng)興高采烈的拿著地址去訪問(wèn)的時(shí)候氏仗,返回信息如下吉捶,臉黑了,說(shuō)明發(fā)生了重定向問(wèn)題皆尔。在請(qǐng)求該地址后呐舔,會(huì)出現(xiàn)短暫的“跳轉(zhuǎn)”字眼。


跳轉(zhuǎn).png

那么我們就在這個(gè)網(wǎng)頁(yè)信息里查找下一個(gè)請(qǐng)求地址慷蠕,如下圖可以看到點(diǎn)擊跳轉(zhuǎn)前有我們想要的信息珊拼,這是目標(biāo)網(wǎng)頁(yè)請(qǐng)求地址。


點(diǎn)擊跳轉(zhuǎn).png

在進(jìn)行詳情頁(yè)跳轉(zhuǎn)的時(shí)候也存在這個(gè)問(wèn)題流炕,分析思路是一樣的澎现。
  • 驗(yàn)證碼

selenium + 云打碼平臺(tái)解決或者人工輸入

  1. 爬取思路


    過(guò)程.png
  2. 代碼實(shí)現(xiàn)

  • 詳情頁(yè)地址
#!/user/bin/env python3
# -*- coding: utf-8 -*-

import requests
# 自定義的UA庫(kù)
from UA import ua
import random
from lxml import etree
import time
from requests.packages.urllib3.exceptions import InsecureRequestWarning
from selenium import webdriver

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

headers = {'User-Agent': ''}

def get_detail_url(url):

    headers['User-Agent'] = random.choice(ua)
    try:
        r = requests.get(url, headers=headers, verify=False)
        html = etree.HTML(r.text)
        # 經(jīng)過(guò)上述跳轉(zhuǎn),得到目標(biāo)網(wǎng)頁(yè)地址
        roal_url = html.xpath('//a[@class="btn-redir"]/@href')[0]
        r = requests.get(roal_url, headers=headers, verify=False)
        html = etree.HTML(r.text)
        hrefs = html.xpath('//div[@class="shop_list shop_list_4"]/dl/dt/a/@href')
        channels = html.xpath('//div[@class="shop_list shop_list_4"]/dl/dt/a/@data_channel')
        next_urls = ['https://lz.esf.fang.com' + href +'?channel=' + channel for href,channel in zip(hrefs,channels)]
        house.extend(next_urls)
    except:
        process_captcha()
        get_detail_url(url)

def process_captcha():

    # 該處url是讓出現(xiàn)驗(yàn)證碼界面浪感,沒(méi)有具體的限制
    url = 'https://lz.esf.fang.com/chushou/3_416752691.htm?channel=2,2'
    driver = webdriver.Firefox()
    driver.get(url)
    # 人工輸入驗(yàn)證碼
    time.sleep(12)
    driver.find_element_by_name('submit').click()
    driver.close()

if __name__ == '__main__':

    '''
   這個(gè)過(guò)程中昔头,貌似只能爬取100頁(yè)饼问,那么可以細(xì)化影兽,比如分區(qū)域爬取,可以再細(xì)分莱革。
    '''
    house = []
    for i in range(1,100):
        print('--------------------------------')
        print(f'開(kāi)始爬取第{i}頁(yè)')
        url = f'https://lz.esf.fang.com/house/i3{i}/'
        get_detail_url(url)
    print('爬取結(jié)束峻堰!')
    f = open('urls.txt', 'a+', encoding='utf8')
    for i in house:
        f.write(i + '\n')
    f.close()
  • 房屋信息
#!/user/bin/env python3
# -*- coding: utf-8 -*-

import requests
from UA import ua
import random
from lxml import etree
import time
from requests.packages.urllib3.exceptions import InsecureRequestWarning
import csv
from selenium import webdriver
from PIL import Image
# 云打碼平臺(tái)API
from vcode import *

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

headers = {'User-Agent': ''}

def get_info(url):

    headers['User-Agent'] = random.choice(ua)
    # 解決驗(yàn)證碼反爬蟲(chóng)問(wèn)題
    try:
        r = requests.get(url, headers=headers, verify=False, timeout=60)
        html = etree.HTML(r.text)
        detail_url = html.xpath('//a[@class="btn-redir"]/@href')[0]
        r = requests.get(detail_url, headers=headers, verify=False, timeout=60)
        html = etree.HTML(r.text)
        total_price = html.xpath('//div[@class="tab-cont-right"]/div[1]/div[1]/div[1]/i/text()')[0]
        style = html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line clearfix"][1]/div[1]/div[1]/text()')[
            0].replace('\n', '').strip()
        area = html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line clearfix"][1]/div[2]/div[1]/text()')[0]
        unit_price = \
        html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line clearfix"][1]/div[3]/div[1]/text()')[0]
        direction = html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line clearfix"][2]/div[1]/div[1]/text()')[
            0]
        floor = html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line clearfix"][2]/div[2]/div[1]/text()')[0]
        decoration = \
        html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line clearfix"][2]/div[3]/div[1]/text()')[0]
        local = html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line"]/div[2]/div[2]/a[1]/text()')[0].replace(
            '\n', '').strip()
        school = html.xpath('//div[@class="tab-cont-right"]/div[@class="tr-line"]/div[3]')
        if len(school):
            school = 1
        else:
            school = 0
        data = {'總價(jià)': total_price,
                '戶型': style,
                '建筑面積': area,
                '單價(jià)': unit_price,
                '朝向': direction,
                '樓層': floor,
                '裝修': decoration,
                '區(qū)域': local,
                '學(xué)校': school}
        content = {'建筑年代': '',
                   '有無(wú)電梯': '',
                   '產(chǎn)權(quán)性質(zhì)': '',
                   '住宅類別': '',
                   '建筑結(jié)構(gòu)': '',
                   '建筑類別': ''}
        info = html.xpath('//div[@class="content-item fydes-item"]/div[2]//span/text()')
        for i in range(int((len(info) - 2) / 2)):
            content[info[2 * i]] = info[2 * i + 1]
        to_csv(data, content)
    except:
        title = process_captcha(url)
        # 檢驗(yàn)url是否有效,推測(cè)原因是房源信息已經(jīng)不存在了盅视,
        # 如果存在捐名,則重新請(qǐng)求,反之闹击,就結(jié)束當(dāng)前請(qǐng)求镶蹋,開(kāi)始下一個(gè)請(qǐng)求
        if title == '蘭州二手房-房天下':
            delete.append(url)
            pass
        else:
            # 防止一個(gè)請(qǐng)求循環(huán)進(jìn)行,導(dǎo)致一直使用驗(yàn)證碼平臺(tái),進(jìn)行下一個(gè)
            if url in flag:
                return
            flag.append(url)
            get_info(url)

def to_csv(data,content):
    with open('house.csv', 'a+', encoding='utf-8', newline='') as f:
        writer = csv.writer(f)
        writer.writerow([data['戶型'], data['建筑面積'], data['朝向'], data['樓層'], data['裝修'],
                        content['建筑年代'], content['有無(wú)電梯'], content['產(chǎn)權(quán)性質(zhì)'], content['住宅類別'],
                        content['建筑結(jié)構(gòu)'], content['建筑類別'], data['區(qū)域'],
                        data['學(xué)校'], data['總價(jià)'], data['單價(jià)']])

def process_captcha(url):

    driver = webdriver.Firefox()
    driver.get(url)
    print(url)
    driver.save_screenshot('code.png')
    left = 700
    top = 340
    right = 900
    bottom = 405
    im = Image.open('code.png')
    im = im.crop((left, top, right, bottom))
    im.save('captcha.png')
    # 實(shí)例化贺归,需要自己的賬號(hào)淆两、密碼、驗(yàn)證碼對(duì)應(yīng)類型
    cjy = Chaojiying_Client(你的賬號(hào)拂酣,你的密碼秋冰, '902223')
    im = open('captcha.png', 'rb').read()
    code = cjy.PostPic(im,1004).get('pic_str')
    driver.find_element_by_id('code').send_keys(code)
    time.sleep(1)
    driver.find_element_by_name('submit').click()
    time.sleep(2)
    driver.get(url)
    title = driver.title
    driver.close()
    return title

if __name__ == '__main__':

    house = []
    f = open('urls.txt')
    texts = f.readlines()
    for text in texts:
        house.append(text.rstrip())
    house = list(set(house))
    f.close()
    delete = []
    flag = []
    for i in range(2852,len(house)):
        print(f'開(kāi)始爬取第{i+1}條信息')
        get_info(house[i])
    print('爬取結(jié)束!')
  1. 結(jié)果展示


    結(jié)果.png

    共計(jì)將近8000多條數(shù)據(jù)婶熬,和下圖對(duì)應(yīng)剑勾。


    總體情況.png
  2. 數(shù)據(jù)詳情見(jiàn):https://www.kesci.com/home/dataset/5f073e5ac94d2e002d03522d/files

二、數(shù)據(jù)分析

項(xiàng)目詳情見(jiàn):https://www.kesci.com/home/project/5f098536192ac2002c87c5aa

每天進(jìn)步一點(diǎn)點(diǎn)赵颅!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虽另,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饺谬,更是在濱河造成了極大的恐慌洲赵,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件商蕴,死亡現(xiàn)場(chǎng)離奇詭異叠萍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)绪商,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)苛谷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人格郁,你說(shuō)我怎么就攤上這事腹殿。” “怎么了例书?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锣尉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我决采,道長(zhǎng)自沧,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任树瞭,我火速辦了婚禮拇厢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘晒喷。我一直安慰自己孝偎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布凉敲。 她就那樣靜靜地躺著衣盾,像睡著了一般寺旺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上势决,一...
    開(kāi)封第一講書(shū)人閱讀 51,482評(píng)論 1 302
  • 那天迅涮,我揣著相機(jī)與錄音,去河邊找鬼徽龟。 笑死叮姑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的据悔。 我是一名探鬼主播传透,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼极颓!你這毒婦竟也來(lái)了朱盐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤菠隆,失蹤者是張志新(化名)和其女友劉穎兵琳,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體骇径,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡躯肌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了破衔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片清女。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖晰筛,靈堂內(nèi)的尸體忽然破棺而出嫡丙,到底是詐尸還是另有隱情,我是刑警寧澤读第,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布曙博,位于F島的核電站,受9級(jí)特大地震影響怜瞒,放射性物質(zhì)發(fā)生泄漏父泳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一盼砍、第九天 我趴在偏房一處隱蔽的房頂上張望尘吗。 院中可真熱鬧,春花似錦浇坐、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春觉渴,著一層夾襖步出監(jiān)牢的瞬間介劫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工案淋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留座韵,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓踢京,卻偏偏與公主長(zhǎng)得像誉碴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓣距,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354