深圳鏈家在售二手房數(shù)據(jù)抓取

本來今天還想說試試昨天剛弄的代理池,去爬下鏈家上面的房源信息香追,結(jié)果今天突然發(fā)現(xiàn)合瓢,鏈家的反爬蟲沒有啦~~

哎呀,露點了

趕緊上scrapy,把上面的在售房源信息擼下來透典。

其實很簡單的爬蟲晴楔,用框架有點大材小用了,不過真的比普通多進程快好多呀峭咒,作為一個老男人税弃,快既是追求,也是必然凑队!

至于scrapy的設(shè)置则果,就settings里打開了default request headers和item-pipeline,關(guān)閉了robots協(xié)議,pipelines里面復(fù)制了別人的代碼西壮,還是用mongodb存數(shù)據(jù)遗增。

distinfo.csv 和log.txt 用來存些需要用的信息,好像可以設(shè)置middlewares款青,可是呢做修,我不會。可都。缓待。

import pymongo

class SzlianjiaPipeline(object):
    collection_name = 'sz_onsale'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].update({'房屋鏈接':item['房屋鏈接']},dict(item),True)
        return item
【絲路在哪里】

反正scrapy的爬蟲設(shè)計就是一層一層往下爬,咱就從首頁開始渠牲,先獲取區(qū)域鏈接旋炒,

     def parse_dist(self,response):
        dists = response.xpath('//div[@data-role="ershoufang"]/div/a/@href').extract()
        for dist in dists:
            url = 'https://sz.lianjia.com'+dist
            yield scrapy.Request(url,self.parse_small_dist,dont_filter=True)

再獲取小區(qū)域鏈接,

    def parse_small_dist(self,response):
        small_dists = response.xpath('//div[@data-role="ershoufang"]/div[2]/a/@href').extract()
        for small_dist in small_dists:
            url = 'https://sz.lianjia.com' + small_dist
            if url not in self.dists_list:
                self.dists_list.append(url)
                yield scrapy.Request(url,selfs.parse_dist_house_page,dont_filter=True)

因為大區(qū)中的小區(qū)域還有部分重復(fù)了签杈,建了個self.dists_list列表用來排重瘫镇,減少需要爬取的頁面。

獲取小區(qū)域頁碼總數(shù)答姥,

    def parse_dist_house_page(self,response):
        total_dist_house = int(response.xpath('//h2[@class="total fl"]/span/text()').extract()[0])
        if total_dist_house >0:
            page_info = response.xpath('//div[@class="page-box house-lst-page-box"]/@page-data').extract()[0]
            page_dic = json.loads(page_info)
            page_num = page_dic.get('totalPage')
        else:
            page_num = 0
        url = response.url
        log_info = '區(qū)域鏈接:  '+url+'      區(qū)域二手房總數(shù):  '+str(total_dist_house)+'      區(qū)域二手房頁數(shù):  '+str(page_num)+'\n'
        with open('log.txt','a+') as f:
            f.write(log_info)
        distinfo = url+','+str(total_dist_house)+','+str(page_num)+'\n'
        with open('distinfo.csv','a+') as f:
            f.write(distinfo)
        if page_num > 0:
            for i in range(1, page_num + 1):
                url = response.url + 'pg' + str(i) + '/'
                yield scrapy.Request(url, callback=self.parse_dist_page, dont_filter=True)

奇了怪了居然有2個小區(qū)域中沒有房源铣除,還的帶個判斷。log.txt用來存些錯誤信息鹦付。distinfo.csv用來存每個小區(qū)域的房源數(shù)尚粘,爬完了再來對下有沒有漏。

獲取小區(qū)域中每一頁中的房源鏈接敲长,

    def parse_dist_page(self,response):
        urls = response.xpath('//ul[@class="sellListContent"]/li/a/@href').extract()
        for url in urls:
            yield scrapy.Request(url,callback=self.onsale_page,dont_filter=True)

終于爬到最后一層了郎嫁,獲取每個房源的詳細信息。

 def onsale_page(self,response):
        item = SzlianjiaItem()
        soup = BeautifulSoup(response.text, 'lxml')
        title = soup.select('div.title h1')[0].text
        price = float(soup.select('span.total')[0].text) if soup.select('span.total') else ''
        unitprice = float(soup.select('span.unitPriceValue')[0].text.rstrip('元/平米')) if soup.select(
            'span.unitPriceValue') else ''
        houseID = soup.select('div.houseRecord span.info')[0].text.rstrip('舉報') if soup.select(
            'div.houseRecord span.info') else ''
        xiaoqu = soup.select('div.communityName a')[0].text if soup.select('div.communityName a') else ''
        infos = [i.text for i in soup.select('div.introContent div.content ul li')]
        info = {}
        for i in infos:
            key = i[:4]
            data = i[4:]
            info[key] = data
        info['標題'] = title
        info['總價'] = price
        info['單價'] = unitprice
        info['鏈家編號'] = houseID
        info['小區(qū)'] = xiaoqu
        info['房屋鏈接'] = response.url
        info['建筑面積'] = float(info['建筑面積'].rstrip('㎡')) if '㎡' in info['建筑面積'] else ''
        info['套內(nèi)面積'] = float(info['套內(nèi)面積'].rstrip('㎡')) if '㎡' in info['套內(nèi)面積'] else ''
        info['掛牌時間'] = datetime.datetime.strptime(info['掛牌時間'],'%Y-%m-%d') if info['掛牌時間'] != '暫無數(shù)據(jù)' else ''
        for key in info.keys():
            if info[key] != '暫無數(shù)據(jù)':
                item[key] = info[key]
            else:
                item[key] = ''
        yield item

前面幾層都是用xpath解析祈噪,比較簡單泽铛,不需要引進額外的包,我對xpath還不是很熟辑鲤,正好用來練手不過最后一層太多字段了盔腔,想偷個懶,就用更熟練的美麗湯來解析月褥,順便改下某些字段的類型弛随,方面以后處理。

結(jié)果

最后爬下來宁赤,獲取了25800個房源信息撵幽,可是。礁击。。

不開心!6吡链烈!

完美主義害死人啊挚躯!

先這樣了强衡,明天接著改。

后續(xù)計劃

把所有小區(qū)信息爬下來码荔。
把所有已售房屋信息爬下來漩勤。
分析。
買房缩搅!
ヽ(Д*)/.?哈哈

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末越败,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子硼瓣,更是在濱河造成了極大的恐慌究飞,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件堂鲤,死亡現(xiàn)場離奇詭異亿傅,居然都是意外死亡,警方通過查閱死者的電腦和手機瘟栖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門葵擎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人半哟,你說我怎么就攤上這事酬滤。” “怎么了镜沽?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵敏晤,是天一觀的道長。 經(jīng)常有香客問我缅茉,道長嘴脾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任蔬墩,我火速辦了婚禮译打,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拇颅。我一直安慰自己奏司,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布樟插。 她就那樣靜靜地躺著韵洋,像睡著了一般竿刁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上搪缨,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天食拜,我揣著相機與錄音,去河邊找鬼副编。 笑死负甸,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的痹届。 我是一名探鬼主播呻待,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼队腐!你這毒婦竟也來了蚕捉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤香到,失蹤者是張志新(化名)和其女友劉穎鱼冀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠就,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡千绪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梗脾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片荸型。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炸茧,靈堂內(nèi)的尸體忽然破棺而出瑞妇,到底是詐尸還是另有隱情,我是刑警寧澤梭冠,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布辕狰,位于F島的核電站,受9級特大地震影響控漠,放射性物質(zhì)發(fā)生泄漏蔓倍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一盐捷、第九天 我趴在偏房一處隱蔽的房頂上張望偶翅。 院中可真熱鬧,春花似錦碉渡、人聲如沸聚谁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽形导。三九已至环疼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朵耕,已是汗流浹背秦爆。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留憔披,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓爸吮,卻偏偏與公主長得像芬膝,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子形娇,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容