自娛自樂寫爬蟲 世紀佳緣篇


最近一段時間不知怎得像是中了什么魔怔,特別的想用python寫一個網絡爬蟲,也許是看了知乎上的某位大牛的分享,深感能自己寫一個程序在浩瀚的互聯網數據海洋中發現有意思的數據的酷炫,抑或就是想單純的體驗一把程序猿的人生價值。在當我信誓旦旦的決定用一到兩周准備實現這個宏偉的理想的時候,我馬上就遇到了瓶頸,而且是必須快速解決的要給難題:我應該在互聯網上爬點什么數據呢?

經過一番深入的考察,我發現婚戀網站是一個理想的目標,因為在博客園里面還從來沒有看到過相關的帖子(其實博客園里面大部分帖子感覺挺水的),而且婚戀網站上的數據也是有不錯的研究價值的(嘿嘿,我的目的很單純,完全是為了學術研究),可以分析分析當前婚戀狀況,還是挺有顯示意義的。目前中國有三個比較大的婚戀網站:百合網、珍愛網、世紀佳緣,由於精力有限,應該選哪個網站呢?經過嚴密的考證(其實就隨便百度了一下),世紀佳緣是目前三個婚戀網站上用戶最多的一個,二話不多說,敞開膀子就去世紀佳緣實名注冊了一個用戶,仔細的分析了網站頁面的構成以及下載網頁的策略。

用戶主頁的網址組成非常的簡單,每個用戶都一個唯一的id,在網址欄中在域名后面加上這個id就是用戶的個人主頁了,而且這個個人主頁的數據不是動態生成的,直接用解析網頁就可以獲取所有的信息。唯一的難點在於某些信息,例如工資,是否買房買車之類的信息在沒有登陸的情況下是不可見的。為了能獲取一份完整的數據(工資這么重要的數據,怎么能不關注呢,不難下載的數據就沒有啥價值了),我還是費了相當多的精力,基本是百分之60的時間都花在怎么解決這個問題上了(對於某些大牛來說當然是小case,我只是一介菜鳥)。

1

接着的一個問題是,我怎么獲取用戶的id呢?不得不說,世紀佳緣還是提供一個挺不錯的搜索功能的,在選擇好搜索條件后,根據抓包的信息,瀏覽器會把用戶選擇的參數post提交給服務器,服務器會以json格式返回25個用戶的簡短信息,一頁剛好是25個用戶的資料,如果要連續的爬取數據,根本不需要修改任何參數,自需要把第幾頁這個參數更換一下,就可以源源不斷的下載這些用戶的個人主頁了。我呢,為了盡可能多的下載一些數據,選的條件比較松,也就是20到28歲有照片的女性,結果搜出來用戶數量讓我大吃一驚,也不過才七十多萬條,之后爬的過程中還發現不少搜索出來的用戶id都在黑名單里,中國第一婚戀網站名不副實啊!

image

分析完爬蟲策略之后,着手的第一件事就是怎么實現自動登錄,最出用的是python自帶的模塊urllib2,抓包對比一下python發送的請求和瀏覽器發送的請求,發現python發送的請求頭部中Connection始終未Closed,不怎怎么設置都不行,后來百度一下之后才知道urllib2不支持的原因。萬里長征剛邁出第一步就扯着蛋了,之后征途漫漫怎么走呢?多虧了論壇里的大神提醒,原來python有一個第三方木塊requests,實現起來非常方便,大大的減少了工作量。那我是怎么實現自動登陸的呢?

import socket
import ssl
sock = ssl.wrap_socket(socket.socket()) 
sock.connect((host,443))
sock.sendall(https_data)
recv_data = sock.recv(8912)
sock.close()

因為在驗證用戶名和密碼的時候會通過ssl加密,中間可能還有好幾次客戶端與服務器的數據交換,我也在網上找了一些關於自動登陸的帖子,大部分都不適用,唯一實用的就是這一段代碼了,只需要把瀏覽器抓取登陸時的主機名(host)和發送的數據(https_data,包括header和body),用上面短短的幾行代碼就可以通過服務器端的驗證,唯一比較繁瑣的接受到的數據是經過壓縮的,解壓之后獲取跳轉的網址並且把獲取的cookie保存起來用以之后的請求,自動登陸就算大功告成啦!

剩下的就是比較簡單也是比較繁瑣的工作了,解析頁面直接用的是正則表達式,用起來非常的高效,不需要了解html全部的結構。解析好之后把數據通過sqlite3插到數據庫里就可以了,這部分就一筆帶過,因為確實沒什么好講的。為了加快速度,我實現的時候用了多線程,結果效果沒有想象的那么好,以后再好好琢磨琢磨吧!

image

最后的左后,還是把代碼拿出來跟大家一起分享啦!運行這個代碼需要安裝一下python2.7以及最新的requests(我用的是這個版本),寫的不好的地方還請大家多多包涵。

下載鏈接:http://files.cnblogs.com/files/lrysjtu/jiayuan.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM