基于Scrapy的链家二手房爬虫
摘要
本項目是python課程的期末練手項目,在簡要學習完python和爬蟲相關的Scrapy框架后,基于這兩者的運用最終完成了對于鏈家網(wǎng)站二手房頁面的信息進行爬取,并將爬取的數(shù)據(jù)存放于MongoDB之中,使用Studio 3T進行查看。
1引言
1.1背景
在本學期的python課程中,通過網(wǎng)課粗略的掌握了python的基礎知識之后,老師提出通過運用python的模塊進行附加的學習,于是我選擇了Scrapy框架的學習,由此為基礎對于鏈家網(wǎng)站的信息進行了爬取數(shù)據(jù)的操作,并將爬取的數(shù)據(jù)保存。
1.2意義
這個項目提高了我的python編程水平,使得我對于爬蟲技術的了解更加深入,粗略掌握了如何使用Scrapy框架進行爬蟲操作,懂得了python的附加模塊的強大之處,也激發(fā)了繼續(xù)學習編程的興趣。
1.3相關研究
Scrapy 是用 Python 實現(xiàn)的一個為了爬取網(wǎng)站數(shù)據(jù)、提取結構性數(shù)據(jù)而編寫的應用框架。Scrapy 常應用在包括數(shù)據(jù)挖掘,信息處理或存儲歷史數(shù)據(jù)等一系列的程序中。通常我們可以很簡單的通過 Scrapy 框架實現(xiàn)一個爬蟲,抓取指定網(wǎng)站的內容或圖片。之前在基礎學習的時候使用的是Python的request模塊也能對網(wǎng)站頁面的數(shù)據(jù)進行爬取,但是request屬于頁面級爬蟲,重點在于頁面下載,并發(fā)考慮不足,性能較差。
2.系統(tǒng)結構
該項目是基于Scrapy框架來進行的,因此整體的框架如圖1所示。由于Scrapy本身封裝了大量的內容操作使得代碼編寫者可以簡化自己的代碼量。由于大量的封裝,在本次項目中只需要修改SPIDERS模塊和ITEM PIPELINES模塊。
SPIDERS模塊是該項目的python模塊。在此放入代碼。它解析Downloader返回的響應(Response)產生爬取項(scraped item)。產生額外的爬取請求(Request)
ITEM PIPELINES模塊,以流水線的方式處理Spider產生的爬取項。由一組操作順序組成,類似流水線,每個操作都是一個item Pipeline類型。它的操作包括:清理、檢驗、和查重爬取的HTML數(shù)據(jù)、將數(shù)據(jù)存儲到數(shù)據(jù)庫。
3實現(xiàn)代碼
3.1建立工程和Spider模板
scrapy startproject lianjia
建立名為lianjia的工程
scrapy genspider lianjiacrawl lianjia.com
創(chuàng)建一個名為lianjiacrawl的爬蟲,搜索的域名范圍是lianjia.com
3.2編寫Spider
這一部分主要是配置lianjiacrawl.py文件,修改對返回頁面的處理,修改對新增URL爬取請求的處理。首先通過對https://sz.lianjia.com/ershoufang/pg{}網(wǎng)頁進行信息提取,獲取每個二手房的詳情鏈接網(wǎng)址,再通過yield關鍵字不斷提取詳情鏈接網(wǎng)址中的信息。這里信息的提取這里使用的是xpath。
通過游覽器查看網(wǎng)頁源代碼可以詳細去查看view-source:https://sz.lianjia.com/ershoufang/pg1/的代碼,然后可以發(fā)現(xiàn)div class=“info clear”><div class="title"標簽后面緊跟的標簽中的屬性值就是每個二手房的詳情鏈接網(wǎng)址
在通過游覽器查看網(wǎng)頁源代碼可以詳細去查看每個二手房的詳情的源代碼可知,二手房的詳細信息在如下圖所示的標簽之中,使用xpath進行一一提取即可。
3.2編寫Pipelines
這一部分主要是配置pipelines.py文件,主要定義對LianjiaPipeline處理類以及通過setting.py文件配置ITEM_PIPLINES選項。這里主要是將爬取的數(shù)據(jù)放入MongoDB的數(shù)據(jù)庫之中,首先連接本地的服務器,然后再創(chuàng)建數(shù)據(jù)庫和集合,最后再將爬取的數(shù)據(jù)進行插入。
from pymongo import MongoClient# 將爬取的內容保存到mongoDB中 class LianjiaPipeline(object):def __init__(self):# 使用 MongoClient 對象,并且指定連接的 URL 地址self.client = MongoClient(host='localhost', port=27017)# 如果設置有權限, 則需要先登錄# db_auth = self.client.admin# db_auth.authenticate('root', 'root')# 需要保存到的collectionself.col = self.client['lianjia']#創(chuàng)建的數(shù)據(jù)庫名self.ershou = self.col.ershou#創(chuàng)建的集合名# 先清除之前保存的數(shù)據(jù)# self.ershoufang.delete_many({})def process_item(self, item, spider):self.ershou.insert_one(item)#集合中插入使用 insert_one() 方法return itemdef open_spider(self, spider):passdef close_spider(self, spider):self.client.close()#關閉
這里是setting.py要修改的部分,讓框架能夠找到我們在piplines中新建的類
ITEM_PIPELINES = {
‘lianjia.pipelines.LianjiaPipeline’: 300,
}
4.實驗
4.1首先命令行下運行命令行下運行 MongoDB 服務器
為了從命令提示符下運行 MongoDB 服務器,你必須從 MongoDB 目錄的 bin 目錄中執(zhí)行 mongod.exe 文件
mongod –dbpath \data\db
4.2然后使用Stdio 3T連接MongoDB服務器
4.3運行爬蟲代碼
scrapy crawl lianjiacrawl1
4.4查看數(shù)據(jù)庫
在Studio 3T中查看數(shù)據(jù)庫結果
5. 總結和展望
在這次Python語言程序設計課程的個人項目當中我對于爬蟲有了更加深入的了解,主要是對于如何應用Scrapy框架從無到有到完成一個項目的有了整體的認識,有助于對于以后去嘗試別的爬蟲,在完成這個項目的過程中我也加強了自己的編程能力,對于Python這門語言有了更深刻的認識。這一個項目的完成也有一些不足的地方,對于已經(jīng)爬取的數(shù)據(jù)沒有進行圖形化展示或者進行深入的數(shù)據(jù)分析,還是流于爬取這一過程,我希望在以后的學習過程中能對此進行完善。
總結
以上是生活随笔為你收集整理的基于Scrapy的链家二手房爬虫的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 珠峰之行回顾
- 下一篇: Google在线翻译工具:Transla