scrapy实现链家二手房的数据获取并进行持久化存储
理解Scrapy框架各個組成的作用:五大組成,下載器,調度器,引擎,爬蟲,管道。
引擎:它是整個Scrapy框架的核心,用來處理整個系統的數據流,觸發各種事件。用于控制調度器,下載器,爬蟲,管道。
爬蟲:用戶可以通過正則,xpath等語法從特定的網頁中提取需要的信息,即實體(Item).。也可以提取出鏈接,讓Scrapy繼續抓取下一個頁面。
實體管道:用于接收爬取到的數據,以便于進一步處理,比如可以存入數據庫,本地文件等進行持久化存儲。
下載器:用于高速地下載網絡上的資源。它是建立在twisted這個高效的異步模型上。
調度器:其就是一個url的優先隊列,由它來決定下一個要抓取的網址是什么,同時去掉重復的網址??梢愿鶕枨蠖ㄖ普{度器。
Scrapy爬取鏈家網一個頁面數據并且保存到本地文件:
需要爬取的鏈接:北京二手房房源_北京二手房出售|買賣|交易信息(北京鏈家) (lianjia.com)
一,明確需要爬取的數據
??????創建一個Item(實體)類,這里我們要爬取的數據有
? ? ? 標題,位置,房屋信息,總價和均價,對此我們可以在items.py文件中定義一個
? ? ? Lianjia類,參考代碼如下:
?? ?class lianjia(scrapy.Item):
? ? ?? ??? ?title = scrapy.Field()
? ? ?? ??? ?positionPre = scrapy.Field()
? ??? ??? ?positionAft = scrapy.Field()
? ??? ??? ?houseInfo = scrapy.Field()
? ? ?? ??? ?totalPrice = scrapy.Field()
? ??? ??? ?unitPrice = scrapy.Field()
二,明確完數據后,我們就可以開始進行響應解析了,打開spiders文件,
? ? ? 找到我們的爬蟲文件(爬蟲名.py),首先導入我們之前在items.py定義的ITEM(實體類):
? ? ? 參考代碼如:from ..items import Lianjia
? ? ? 然后開始解析,由于xpath解析比較簡單就不在贅述,拿到我們需要的數據后,實例化ITEM(實體類),
? ? ?將數據保存至這個ITEM(實體類中),然后yiled返回這個item對象。 參考代碼如下:
? ??? ? def parse(self, response):
? ? ? ? ?? ? ? ? ? ? ? ?li_list = response.xpath('.//ul[@class="sellListContent"]/li')
? ? ? ? ?? ? ? ? ? ? ? ?for li in li_list:
? ? ? ? ? ??? ??? ? ? ? title = li.xpath('.//div[1]/div[1]/a/text()').extract_first()
? ? ? ? ? ? ?? ??? ? ? ? positionPre = li.xpath('.//div[@class="positionInfo"]/a[1]/text()').extract_first()
? ? ? ? ? ? ?? ??? ? ? ? positionAft = li.xpath('.//div[@class="positionInfo"]/a[2]/text()').extract_first()
? ? ? ? ? ? ?? ??? ? ? ? houseInfo = li.xpath('.//div[@class="houseInfo"]/text()').extract_first()
? ? ? ? ? ? ?? ??? ? ? ? totalPrice = li.xpath('.//div[@class="totalPrice totalPrice2"]/span/text()').extract_first()
? ? ? ? ? ??? ??? ? ? ? unitPrice = li.xpath('.//div[@class="unitPrice"]/span/text()').extract_first()
? ? ? ? ? ? ?? ??? ? ? ? item = Lianjia()
? ? ? ? ? ?? ??? ? ? ? item['title'] = title
? ? ? ? ? ? ?? ??? ? ? ? item['positionPre'] = positionPre
? ? ? ? ? ? ?? ??? ? ? ? item['positionAft'] = positionAft
? ? ? ? ? ??? ??? ? ? ? item['houseInfo'] = houseInfo
? ? ? ? ? ??? ??? ? ? ? item['totalPrice'] = totalPrice
? ? ? ? ? ? ?? ??? ? ? ? item['unitPrice'] = unitPrice
? ? ? ? ? ? ?? ??? ? ? ? yield item
三,爬取完數據后,再進行數據的持久化存儲,這里我們只保存到本地txt文件
? ? ? 在pipelines.py文件里定義一個管道類,對yield返回的item我們進行保存到txt文件的操作,參考代碼如下:
?? ?class FirstspiderPipeline:
? ? ?? ??? ?fp = None
? ? ?? ??? ?def open_spider(self, spider):
? ? ? ? ?? ??? ??? ?print("爬蟲開始")
? ? ? ? ?? ??? ??? ?self.fp = open('./鏈家二手房數據.txt', 'w', encoding='utf-8')
? ? ?? ??? ?def process_item(self, item, spider):
? ? ? ??? ??? ??? ?self.fp.write(
? ? ? ? ? ? ?? ??? ??? ?f'標題:{item["title"]}\n
?? ??? ??? ?位置:{item["positionPre"]}
?? ??? ??? ?{item["positionAft"]}\n
?? ??? ??? ?房屋信息:{item["houseInfo"]}\n
?? ??? ??? ?總價:{item["totalPrice"]}萬\n
?? ??? ??? ?均價:{item["unitPrice"]}\n\n')
? ? ? ? ?? ??? ??? ?return item
? ? ?? ??? ?def close_spider(self, spider):
? ? ? ? ?? ??? ??? ?print("爬蟲結束")
? ? ? ??? ??? ? ?? ?self.fp.close()
四,將這些都執行后,再設置setting.py文件,
? ? ? 設置USER_AGENT:USER_AGENT = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
? ? ? 設置robot協議將TRUE改成False:ROBOTSTXT_OBEY = False
? ? ? 設置管道:
?? ?ITEM_PIPELINES = {
? ?? ?'firstSpider.pipelines.FirstspiderPipeline': 300,
?? ?}
? ?
最后在終端中輸入:scrapy crawl lianjia運行即可。
?
?可以看到生成了個文件
?
?
?
?
在這個例子,首先由爬蟲將start_urls起始網址(需要爬取的域名)提交給引擎,讓引擎將這個網址交給調度器,
調度器將其入隊后出隊優先爬取的網址(這里我們沒做翻頁只有一個域名)交給引擎,
引擎將其交給下載器高速地下載網絡資源得到一個響應再將這個響應交給引擎,引擎將這個響應提交給爬蟲
由響應處理函數對這個響應進行解析獲取到需要的信息,將這個信息保存到Item實體類中,然后yield返回這個item將其
交給引擎,引擎將其給管道,由管道進行持久化存儲。
終端中的命令:
創建一個Scrapy框架項目:在終端中輸入:scrapy startproject 項目名
創建一個爬蟲:在終端中輸入:cd 項目名,進入項目后輸入:scrapy genspider 爬蟲名 域名(這個域名就是要爬取的起始地址)
創建一個CrawlSpider爬蟲:在終端中輸入:cd 項目名,進入項目后輸入:scrapy genspider -t crawl 爬蟲名 域名
運行爬蟲:在終端中輸入:cd 項目名,進入項目后輸入:scrapy ?crawl 爬蟲名
scrapy shell腳本:在終端中輸入:scrapy shell 域名,進入后可以進行各種調試或xpath獲取數據等
總結
以上是生活随笔為你收集整理的scrapy实现链家二手房的数据获取并进行持久化存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: git文件没有绿色红色小图标解决办法
- 下一篇: 打击标题党 详述清风算法