看了一圈網上很多爬取鏈家數據的爬蟲,但是由於鏈家已經把網頁結構換掉了,所以原來的網上代碼已經不能夠使用,剛寫了一個最新的爬蟲,可以獲取租房信息。
工具:
python3.6
scrapy 1.6.0 框架
vscode 編輯器
基礎知識關於如何使用scrapy框架什麼的就不說了,網上一搜一大堆。
說明:因爲鏈家上面的數據排列並不是一樣的,有的數據是缺失的,這就給數據獲取造成很大麻煩。所以導致有的數據是不正確的,大部分都是沒問題的。
下面是主要的spider代碼
# -*- coding: utf-8 -*-
from scrapy import Spider, Request
from scrapy.selector import Selector
import requests
import re
from lxml import etree
import json
import time
from szhouse.items import SzhouseItem
class licaiSpider(Spider):
name = 'lianjiahouse' #https://su.lianjia.com/zufang/pg3/#contentList
start_urls=['https://su.lianjia.com/zufang/']
custom_settings = {'ITEM_PIPELINES': {
'szhouse.pipelines.SzhousePipeline': 300,
}, 'DOWNLOAD_DELAY': 0.1,'DOWNLOAD_TIMEOUT':20}
def parse(self,response):
#detail_html=str(response.body)
item = SzhouseItem()
trs = response.xpath('//div[@class="content w1150"]/div[@class="content__article"]/div[@class="content__list"]/div[@class="content__list--item"]')
for index,tr in enumerate(trs):
item['house_name'] = tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--title twoline"]/a/text()').extract_first().replace(' ','').replace('\n', '')
tt_link = tr.xpath('./a/@href').extract_first()
item['link'] ='https://su.lianjia.com'+tt_link
tt=tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/text()[4]').extract_first()
tt_fx=tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/text()[6]').extract_first()
tt_ad= tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/a[1]/text()').extract_first()
#jinsheng
tt_js_fx=tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/text()[5]').extract_first()
tt_js_mj=tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/text()[3]').extract_first()
if(tt_ad is None):
item['address'] =tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--des"]/span/text()').extract_first()
item['fangxing'] = str(tt_js_fx).replace(' ','').replace('\n','')
item['mianji'] = str(tt_js_mj).replace(' ','').replace('\n','')
else:
item['address'] =tt_ad
item['fangxing']=tt_fx.replace(' ','').replace('\n','')
item['mianji']=tt.replace(' ','').replace('\n', '')
item['fabuDate'] = tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--time oneline"]/text()').extract_first()
# item['detail'] = tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--bottom oneline"]/i/text()').extract_first()
d_list=tr.xpath('./div[@class="content__list--item--main"]/p[@class="content__list--item--bottom oneline"]/i')
detail_list=''
for ii in d_list:
detail_list += ii.xpath('./text()').extract_first()
detail_list=detail_list+','
# detail_list=''.join(ii.xpath('./text()').extract_first())
item['detail']=detail_list
item['money'] = tr.xpath('./div[@class="content__list--item--main"]/span/em/text()').extract_first()
yield item
for i in range(1,101):
url='https://su.lianjia.com/zufang/pg{}/'.format(str(i))
yield Request(url,callback=self.parse)
我把爬下來的數據保存在csv文件了,一共100也代碼 大約8000多數據吧,如下所示: