scrapy實戰專案(簡單的爬取知乎專案)

killeri發表於2018-05-17

本專案實現了對知乎使用者資訊的爬取,並沒有用資料庫等,只是簡單地用一些提取了一些欄位然後儲存在了一個csv檔案中,但是同樣可以實現無線爬取,理論上可以實現萬級資料的爬取(當然取決於網速了)

其實想爬取知乎網站是不需要進行登入的,通過一個個人賬號就可以直接進行爬取了。

事先準備:要求不多,其實掌握了基本的scrapy爬蟲編寫的方式就可以了,當然對python的基本語法要有了解,還有就是一定的邏輯處理能力。

好了,我們來開始進行專案的解析:
我們首先從一個 個人賬戶的首頁進行解析資料,比如我們最愛的——輪子哥
這裡寫圖片描述
兩個箭頭的位置使我們接下來要重點分析的地方,我們要爬取的就是輪子哥的詳細資訊,我們開啟開發者工具,找到頁面的原始碼,找出輪子哥的詳細資訊在原始碼中的位置
這裡寫圖片描述
我用的fiddler找到請求,在響應中,我發現輪子哥的詳細資訊都在一個data-state的變數中,而且變數明顯是一個json型別的資料("是雙引號),那我們接下來就是提取這個json資料中我們需要的資料
第一步:把json資料提取出來,用正規表示式re提取json資料

 x = response.body.decode('utf-8')
 # 用utf8解碼響應的資料流
 y = re.search('data-state="({.*?})"', x).group(1).replace('"', '"')
 # 用re提取json資料,並用雙引號"替換"字元

經過上面一步就是y就是一個標準的json資料了,那接下來在這個資料中找資訊,這麼亂怎麼找?
我們可以用一個json線上解析,將json資料進行格式化,如圖:
這裡寫圖片描述
這裡只用把json資料放進去就可以自動化在右邊輸出一個json格式的資料。接下來我們就只剩下解析json資料了。這個應該不難吧!
其實程式碼的大部分就是一個解析json’資料的過程,用json.loads方法將json資料轉化為python字典的形式,然後用字典的方法提取我們想要的資訊,明顯幾乎所有的資訊都在users這個鍵裡面。

好了,提取完了輪子哥的基本資訊,這是一個魔伴,我們是要提取所有人的資訊,所以要實現一個迴圈,讓蟲子爬,順著輪子哥的關注的人爬,然後再爬,一直爬!!!
這就是一個邏輯的問題。

我們再來分析一下我們的start_urls,https://www.zhihu.com/people/excited-vczh/activities 這個連結我們改變的只有一個exci-vczh,也就是說每個人的主頁都是這樣組成的,那麼我們怎麼拿到這個東西呢?

好,我們再分析一下那個json資料
這裡寫圖片描述
可以看到那個urlToken關鍵字所對應的值剛好使我們需要的欄位,那麼沒話說,我們需要去找到其他人的這個urlToken。找誰的呢,我們來找輪子哥關注的人的

這裡寫圖片描述
我們點選輪子哥關注的人,然後跳轉頁面,然後檢查頁面!
和前面一步一樣,我們在這個頁面的響應內容裡面仍能找到一個data-state變數,也是儲存了一個json的資料,我們提取這個資料,然後再json解析器中解析就能找到他關注的人的urlToken,好了,我們接下來只要用URLToken進行替換就可以了!
邏輯程式碼貼出來:

    def parse_fellow(self,response):
        x = response.body.decode('utf-8')
        y = re.search('data-state="({.*?})"', x).group(1).replace('"', '"')
        dict_y = json.loads(y)
        users = dict_y.get('entities').get('users')
        for user in users.keys():
            urlToken = users.get(user).get('urlToken')
            url = 'https://www.zhihu.com/people/{}/activities'.format(urlToken)
            yield scrapy.Request(url=url,callback=lambda response,name=urlToken: self.parse_urlToken(response,name))
# 當解析函式有多個引數時,我們就可以用這種方式專遞多個引數了!

這樣我們基本上完成了知乎的遞迴爬取資訊,似乎是一個廣度優先的爬取方式
由於我們這次只是簡單的爬取,就不用資料庫了,直接存進一個csv檔案中

scrapy crawl zhuhuspider -o zhuhu_massage.csv

這樣執行起來,我們就可以在檔案中找到爬取的資料了!,貼圖!!!!
我怕去的欄位有:
school_and_major = Field() # 學校和專業
id = Field() # id
favoriteCount = Field()
voteupCount = Field()
headline = Field()
urlToken = Field()
employments = Field()
job_and_company = Field() # 公司和職位

這裡寫圖片描述

這就是今天的知乎爬蟲專案,可以無限爬取,不過圖書館網速比較慢,所以一個小時只爬取了1500條資料,然後就強行終止程式了!

原始碼就不給了,因為複製了就可以直接執行,可能會給網站造成一定的壓力!
對了,強行加一張圖!!!
這裡寫圖片描述

相關文章