看了一圈网上很多爬取链家数据的爬虫,但是由于链家已经把网页结构换掉了,所以原来的网上代码已经不能够使用,刚写了一个最新的爬虫,可以获取租房信息。
工具:
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多数据吧,如下所示: