天天看點

用Python 的 Scrapy 爬取 網站用Python 的 Scrapy 爬取 網站

用Python 的 Scrapy 爬取 網站

說到制作蜘蛛爬取網站聽起來挺簡單的,其實深究起來是個蠻綜合的應用,有不少技能點需要點亮。比如:

  • 基本的Request/Response
  • HTML,CSS,XPath,JavaScript等前端技能點

    即便你有這些技能點加成,不管你是Newbee還是老鳥,如果你堅持不懈的要制造自己的輪子,很多坑估計你死多少遍也填不平。這時候我适時的推薦你用Scrapy這個架構幫你實作你的小願望。

這個例子假設你已經在很多其他的地方學會了如何建立一個Scrapy的項目了,打算活動一下筋骨,爬取一下鍊家北京的租房資訊小試牛刀。

首先了解一下項目目錄的結構:

  • items.py : 定義你要爬取的内容
  • middlewares.py : 定義一些中間元件,這些元件你可以想象成每次Request出去之前,Response回來之後安插在你的Spider之間的東西。這些元件會很有用。有的能幫你僞裝成不同的浏覽器,或者對特殊的響應代碼做出不同的行為等等,總之這個時候你這裡面什麼都沒有也是可以的。
  • pipelines.py : 想像一下每個抓取的items逐次流經你的大型流水線,線上的勞工有的可以幫你打标簽,有的可以幫你包裝,有的可以幫你檢查是否是殘次品。
  • settings.py : 表裡如一,人如其名
  • spiders : 蜘蛛目錄,裡面就是你的每個小蜘蛛了,這次我們假設隻有一隻
    • SpiderLianjia.py

然後我們觀察一下網站内容:

用Python 的 Scrapy 爬取 網站用Python 的 Scrapy 爬取 網站

網站自上而下我用金色圈起來的分成四個部分,第1部分都是些條件選項等等,第2部分是清單顯示的結果,第3部分是分頁器,第4部分是網頁的尾巴。整體的網站大都基本類似。我們主要關心的部分是2和3,是以其他部分我們就忽略不計了。

确定目标之後,你需要用XPath或者CSS等定位到包含2和3的HTML标簽上,這一步我通常用Chrome的審查元素 幫我完成,快鍵CTRL+SHIFT+I 。我猜你也會有很多其他的辦法做到這一步,這不關鍵。關鍵的是你能得到一個包含内容2和3的标簽,比如XPath是這樣的:

//div[@class="con-box"]

你點開2裡面的每個房源資訊的時候就會打開另外一個位址,我猜那裡面才是你想抓取的内容,如法炮制,你需要把你關心的内容的标簽路徑搞到手,這裡我就不貼二級頁面的圖了,而且假設我們隻抓取房源詳細資訊的标題,那麼就是這樣:

//h1/text()

開始制作小蜘蛛吧

我們用Scrapy的CrawlSpider基類來制作我們的小蜘蛛。很簡單

from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor

class LianjiaZufangSpider(CrawlSpider):
    name = "lianjia.com" # 定義蜘蛛的名字
    allowed_domains = ['lianjia.com'] # 定義容許爬取的網站域,因為我們隻想爬取鍊家,是以就他了
    start_urls = [
        'https://bj.lianjia.com/zufang/', # 告訴蜘蛛從哪裡開始爬取
    ]
    rules = (
        # 這個地方告訴蜘蛛,網頁這個标簽裡面的所有連結位址都是我們的爬取潛在目标,callback函數名稱通知用什麼函數來處理這種Request傳回的結果
        # 注意restrict_xpaths是應用到每個頁面的,了解這一段有助于你解開神秘的架構謎團
        Rule(LinkExtractor(restrict_xpaths='//div[@class="con-box"]'), callback='parse_item', follow=True),
    )

    # 這裡就是處理二級頁面(也就是租房的詳細資訊的地方)啦
    def parse_item(self, response):
        return  {
                'title' : response.xpath('//h1/text()').extract(),
                'content' : response.xpath('//h1/text()').extract()
        }
           

TA-DA~~運作時刻

然後就是見證奇迹的時刻了,啟動蜘蛛:

scrapy crawl lianjia.com

你可以用Pipeline把爬取的資訊列印到控制台上。

但是等一等

聰明如你肯定會有很多疑問,這蜘蛛怎麼翻頁的?

還記得

restrict_xpaths是應用到每個頁面的

的那個注釋麼。頁面标簽中的每一個link都會發出一個Request,對于正常傳回的Response都會再次調用restrict_xpaths裡面的再次擷取内部的link。層層遞進,直到所有的都周遊一遍。咋樣,不用遞歸,不用循環,是不是很爽啊,這就是架構的魅力啦。

很多連結都是重複的啊,咋辦?

Again,架構的魅力再次星光閃閃,重複的連結架構直接過濾了,你不用操心啦。

最後

簡單的,我們就爬取了一個網站。但是這個蜘蛛太lowbee了,像個沒頭沒腦蒼蠅一樣的亂撞。我們在制作蜘蛛的時候肯定要會做得比這隻體面一點啦。