scrapy爬取上海鏈家網(wǎng)35000條在租房信息并導(dǎo)入數(shù)據(jù)庫(kù)

本文在有些需要解釋說(shuō)明的地方引用了知乎文章屌絲想買(mǎi)房……Scrapy入門(mén)教程

本篇教程中將按照下列五步實(shí)現(xiàn)標(biāo)題所述目標(biāo):

1怎憋、創(chuàng)建一個(gè)Scrapy項(xiàng)目

本篇建議安裝Anaconda3噪珊,Anaconda可以很方便地解決多版本python并存纳猫、切換以及各種第三方包安裝問(wèn)題座哩。Anaconda利用工具/命令conda來(lái)進(jìn)行package和environment的管理,并且已經(jīng)包含了Python和相關(guān)的配套工具识腿。

  • 1折欠、新建項(xiàng)目: scrapy startproject lianjia
  • 2、切換目錄:cd lianjia
  • 3谓着、新建爬蟲(chóng):scrapy genspider Ljia sh.lianjia.com/zufang

工程文件說(shuō)明:
scrapy.cfg 記錄項(xiàng)目的配置信息
items.py 存放爬取完數(shù)據(jù)的模板泼诱,用于結(jié)構(gòu)化數(shù)據(jù)
pipelines 數(shù)據(jù)處理行為,比如結(jié)構(gòu)化的數(shù)據(jù)赊锚,存放到數(shù)據(jù)庫(kù)持久化等等
settings.py 配置文件治筒,比如遞歸的層數(shù)、并發(fā)數(shù)舷蒲,延遲下載等
spiders 真正干活的爬蟲(chóng)目錄矢炼,對(duì)網(wǎng)頁(yè)的數(shù)據(jù)清洗

2、定義提取的Item

Item是我們要爬取數(shù)據(jù)的模板阿纤,因此我們應(yīng)該先編輯lianjia/lianjia下的items文件
觀察我們要爬取的在租房示例圖句灌,首先想好你要爬取哪些關(guān)鍵信息


在租房示例圖

我定義的目標(biāo)提取字段比較詳細(xì)(也可以說(shuō)比較啰嗦),字段含義參考代碼注釋


# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class LianjiaItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()      #房間標(biāo)題,例如:申金大廈胰锌,好樓層骗绕,鑰匙在鏈家,鏈家好房
    roomType = scrapy.Field()   #房間類(lèi)型资昧,幾室?guī)讖d
    roomName = scrapy.Field()   #房間名酬土,例如:申金大廈
    roomPrice = scrapy.Field()  #價(jià)格,按月為單位
    roomStatus = scrapy.Field() #房間狀態(tài)格带,例如:隨時(shí)看房
    roomDate = scrapy.Field()   #房間上架日期撤缴,例如:2017.08.06
    areaB = scrapy.Field()      #區(qū)域   例如:浦東,黃浦
    street = scrapy.Field()     #街道叽唱,例如:距離5號(hào)線金平路站794米

3屈呕、編寫(xiě)爬取網(wǎng)站的spider并提取Item

網(wǎng)頁(yè)解析

租房信息
網(wǎng)頁(yè)源碼

可以看到網(wǎng)頁(yè)元素還是很好抽取的,但是我們要先做一些準(zhǔn)備工作

  • 1棺亭、把setting.py里面的ROBOT協(xié)議尊守改為False,不修改爬不了任何數(shù)據(jù)).
settings.py
  • 2虎眨、添加瀏覽器代理
取消這塊代碼的注釋并添加瀏覽器的代理
  • 3、取消注釋
image.png

以下代碼使用xpath提取目標(biāo)字段镶摘,xpath是抽取HTML元素最為便捷和快捷的方式嗽桩,關(guān)于xpath的使用參考xpath語(yǔ)法


# -*- coding: utf-8 -*-
import scrapy
import re
from lianjia.items import LianjiaItem

class LjiaSpider(scrapy.Spider):
    name = 'Ljia'
    allowed_domains = ['https://sh.lianjia.com/zufang']
    start_urls = ['https://sh.lianjia.com/zufang']
    

    def parse(self, response):
        for i in response.xpath('.//li/div[@class="info-panel"]'):
            item = LianjiaItem()
            item['title'] = i.xpath('.//h2/a/@title').extract_first()
            item['roomName'] = i.xpath('.//div[@class="where"]/a/span/text()').extract_first()
            item['roomType'] = i.xpath('.//div[@class="where"]/span/text()').extract_first().rstrip(' &nbsp')
            roomDesc = i.xpath('.//div[@class="con"]').extract_first()
            item['roomPrice'] = i.xpath('.//div[@class="price"]/span/text()').extract_first()
            item['roomStatus'] = i.xpath('.//span[@class="anytime-ex"]/span/text()').extract_first()
            item['roomDate'] = i.xpath('.//div[@class="col-3"]/div[@class="price-pre"]/text()').extract_first().rstrip('7\n\t\t\t\t\t\t\t上架')
            item['areaB'] = str(i.xpath('.//div[@class="con"]/a/text()').extract()[0])
            item['street'] = i.xpath('.//span[@class="fang-subway-ex"]/span/text()').extract_first()
            yield item
        temp_url = response.xpath('//a[@gahref="results_next_page"]/@href').extract()[0]
        if temp_url:
            url = 'https://sh.lianjia.com' + temp_url
        yield scrapy.Request(url=url, callback=self.parse, dont_filter=True)

注釋?zhuān)篹xtract_first()方法用來(lái)序列化抽取到的網(wǎng)頁(yè)元素,dont_filter字段用于避免服務(wù)器把我們的爬蟲(chóng)url做重定向

4凄敢、編寫(xiě)Item PipeLine來(lái)存儲(chǔ)提取到的Item(即數(shù)據(jù))

/lianjia/lianjia/pipelines 文件

import pymysql 

class LianjiaPipeline(object):
    
    def __init__(self):
        self.conn = pymysql.connect(host='localhost', user='root', passwd='****', \
                                   db='***', charset='utf8')
        self.cur = self.conn.cursor()
        
    def process_item(self, item, spider):
        
        title = item.get('title', 'N/A')
        roomType = item.get('roomType', 'N/A')
        roomName = item.get('roomName', 'N/A')
        #roomSize = item.get('roomSize', 'N/A')
        #roomDesc = item.get('roomDesc', 'N/A')
        roomPrice = item.get('roomPrice', 'N/A')
        roomStatus = item.get('roomStatus', 'N/A')
        roomDate = item.get('roomDate', 'N/A')
        areaB = item.get('areaB', 'N/A')
        street = item.get('street', 'N/A')
        
        sql = 'insert into lianjia(title, roomType, roomName, roomPrice, \
                roomStatus, roomDate, areaB, street) values(%s, %s, %s, %s, %s, %s, %s, %s)'
        self.cur.execute(sql, (title, roomType, roomName, roomPrice, roomStatus, roomDate,areaB, street))
        self.conn.commit()
        #return item
        
    def close_spider(self, spider):
        self.cur.close()
        self.conn.close()

注釋?zhuān)?br> 1碌冶、安裝pymysql包:pip install pymysql
2、self.cur(游標(biāo)對(duì)象)用于對(duì)數(shù)據(jù)表操作涝缝,self.conn(數(shù)據(jù)庫(kù)對(duì)象)用于提交對(duì)數(shù)據(jù)庫(kù)的操作

5扑庞、讓爬蟲(chóng)動(dòng)起來(lái)

上面的爬蟲(chóng)工程已經(jīng)準(zhǔn)備好了,現(xiàn)在可以運(yùn)行一下等待結(jié)果了

  • 初步調(diào)試階段:
    先注釋掉pipelines文件中的sql執(zhí)行語(yǔ)句俊卤,執(zhí)行命令scrapy crawl Ljia -o house.csv做初步調(diào)試嫩挤,不著急導(dǎo)入數(shù)據(jù)庫(kù),在終端觀察爬蟲(chóng)運(yùn)行情況消恍,若出現(xiàn)報(bào)錯(cuò)則查看錯(cuò)誤信息進(jìn)行故障排查岂昭,若爬取成功則打開(kāi)lianjia目錄下面的house.csv文件查看爬取結(jié)果
部分結(jié)果
  • 數(shù)據(jù)庫(kù)導(dǎo)入階段:
    若上面執(zhí)行成功,則開(kāi)始導(dǎo)入數(shù)據(jù)庫(kù)狠怨,取消注釋sql語(yǔ)句约啊,執(zhí)行命令scrapy crawl Ljia,在終端觀察導(dǎo)入情況,若有報(bào)錯(cuò)佣赖,則排除問(wèn)題恰矩,若成功寫(xiě)入, 則本次試驗(yàn)到此結(jié)束憎蛤。若有數(shù)據(jù)庫(kù)編碼問(wèn)題外傅,可嘗試自行解決纪吮。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市萎胰,隨后出現(xiàn)的幾起案子碾盟,更是在濱河造成了極大的恐慌,老刑警劉巖技竟,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冰肴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡榔组,警方通過(guò)查閱死者的電腦和手機(jī)熙尉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搓扯,“玉大人检痰,你說(shuō)我怎么就攤上這事∩帽啵” “怎么了攀细?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵箫踩,是天一觀的道長(zhǎng)爱态。 經(jīng)常有香客問(wèn)我,道長(zhǎng)境钟,這世上最難降的妖魔是什么锦担? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮慨削,結(jié)果婚禮上洞渔,老公的妹妹穿的比我還像新娘。我一直安慰自己缚态,他們只是感情好磁椒,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著玫芦,像睡著了一般浆熔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桥帆,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天医增,我揣著相機(jī)與錄音,去河邊找鬼老虫。 笑死叶骨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的祈匙。 我是一名探鬼主播忽刽,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跪帝?” 一聲冷哼從身側(cè)響起宝剖,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎歉甚,沒(méi)想到半個(gè)月后万细,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纸泄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年赖钞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聘裁。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雪营,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衡便,到底是詐尸還是另有隱情献起,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布镣陕,位于F島的核電站谴餐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呆抑。R本人自食惡果不足惜岂嗓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹊碍。 院中可真熱鬧厌殉,春花似錦、人聲如沸侈咕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耀销。三九已至楼眷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間树姨,已是汗流浹背摩桶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帽揪,地道東北人硝清。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像转晰,于是被迫代替她去往敵國(guó)和親芦拿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子士飒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容