這里通過使用Scrapy對鏈家上的成都新房進行爬取
所需信息,房源名稱,售價,大小,位置
創建Spider
import scrapy class homelink(scrapy.Spider): # 定義spider的名字,在調用spider進行crawling的時候會用到: # scrapy crawl <spider.name> name = "homelink" # 如果沒有特別指定其他的url,spider會以start_urls中的鏈接為入口開始爬取 start_urls = [ "https://m.lianjia.com/cd/loupan/" ] # 獲取全部分頁鏈接 # 可以采用遞歸更好,這里只是已獲取到所有頁數,整簡單點 for page in range(1, 50): url = "https://m.lianjia.com/cd/loupan/pg{0}/".format(page) start_urls.append(url) # parse是scrapy.Spider處理http response的默認入口 # parse會對start_urls里的所有鏈接挨個進行處理 def parse(self, response): pass
分析網站:
鏈接新房售價頁面,每個房源對應一個item_list,找到房源名稱div,。
進一步分析每個房源信息,包括所對應的售價,位置信息,看似比較簡單。
接下來就是直接在spider回調函數中通過selector 把所要的信息拿出來,so easy。
簡單代碼完整后:
# -*- coding: utf-8 -*- import scrapy class homelink(scrapy.Spider): # 定義spider的名字,在調用spider進行crawling的時候會用到: # scrapy crawl <spider.name> name = "homelink" # 如果沒有特別指定其他的url,spider會以start_urls中的鏈接為入口開始爬取 start_urls = [ # "http://cd.fang.lianjia.com/zhuanti/50/", # "http://cd.fang.lianjia.com/zhuanti/50/pg2/", # "http://cd.fang.lianjia.com/zhuanti/50/pg3/", # "http://cd.fang.lianjia.com/zhuanti/50/pg4/", "https://m.lianjia.com/cd/loupan/" ] # 獲取全部分頁鏈接 # 可以采用遞歸更好,這里只是已獲取到所有頁數,整簡單點 for page in range(1, 50): url = "https://m.lianjia.com/cd/loupan/pg{0}/".format(page) start_urls.append(url) # parse是scrapy.Spider處理http response的默認入口 # parse會對start_urls里的所有鏈接挨個進行處理 def parse(self, response): # 獲取當前頁面的房屋列表 # print 'xxx', response # house_lis = response.xpath('//ul[@class="house-lst"]/li/div[@class="info-panel"]') # all_page = response.xpath('//*[@id="matchid"]/div/div/div') loupan = response.xpath("//div[@class='item_list']") with open("homelink.log", "ab+") as f: for house_li in loupan: title = house_li.xpath( './div[@class="item_main item_flexbox"]/span[@class="name text_cut"]/text()').extract_first() where = house_li.xpath( './div/span[@class="location text_cut"]/text()').extract_first() area = house_li.xpath( './div/div[@class="location"]/text()').extract_first() price = house_li.xpath( './div/div[@class="price_total"]/text()').extract_first() # print "Title: {0}\tPrice:{1}\tLink: {2} \tArea: {3}\r\n".format(title.encode('utf-8'), price, where, # print "Title:{0}\tPrice:{1}\tArea:{2}\tLink:{3}\r\n".format(title.encode('utf-8'), price, area.encode('utf-8'), # where.encode('utf-8')) f.writelines( "Title:{0}\tPrice:{1}\tArea:{2}\tLink:{3}\t\n".format(title.encode('utf-8'), price, area.encode('utf-8').strip().replace( ' ', ''), where.encode('utf-8').strip().replace( ' ', '')))
生成結果如下(后面可以整個數據庫存起來,分析下各區域房價走勢。。呵呵呵):
PS:
1. 不知道為啥從鏈家首頁進入所有新房頁面,會跳轉到移動版。。
2. https網站直接爬取會被禁止,可設置ROBOTSTXT_OBEY = False。
3. 寫文件的時候老是最后兩行空行,后來發現是原始數據里面很多空格,需要去掉。。坑!
補充:
對於有些網站防爬蟲的,可以設置一些cookie, header模擬瀏覽器。