話說的好,“明槍易躲暗箭難防”就算我們再小心也會因為各種各樣的事情出現(xiàn)疏忽大意的情況,輕則財產(chǎn)損失,重則人身安全受到傷害。但是不要以為這些問題只會出現(xiàn)在我們的現(xiàn)實生活中,就算在互聯(lián)網(wǎng)上也不例外。以我們經(jīng)常會用到的微博軟件來說,經(jīng)常會有人中招。下面讓我們來詳細(xì)的看一下吧。
雖然我們經(jīng)常能從家附近的廣播里或者賣菜阿姨那里聽到“要求網(wǎng)上匯款的都是騙子”“網(wǎng)上鏈接不要隨便點”之類的,甚至次數(shù)多的聽到耳朵都快長繭了。但我們自認(rèn)為飽讀四書五經(jīng),對各種防騙教材背的滾瓜爛熟,對各種騙術(shù)已經(jīng)免疫了。但事實上,在微博上被“騙”的最多的往往是這類人。更多詳細(xì)內(nèi)容可自行度娘 萬臣知乎進行咨詢。可不要以為微博上就是萬無一失的,自古以來就沒有萬無一失的壁壘,總會有人找到漏洞可以鉆過去。
如果我們在逛微博的時候,看見帶有鏈接的奇怪微博的話,一定不要出于好奇就點進去。特別是一些看上去像推廣游戲的微博,以前就曾出現(xiàn)過在官方微博賬號下的推出的鏈接,被從事IT行業(yè)的業(yè)內(nèi)大佬在做了很多方面的調(diào)查測試后,發(fā)現(xiàn)該鏈接雖然點進去與正常的游戲網(wǎng)頁一模一樣,但是發(fā)現(xiàn)該網(wǎng)站的管理員在通過一些技術(shù)手段之后可以將后臺權(quán)限出售給他人,供他人獲取網(wǎng)友的信息。另外在與網(wǎng)頁內(nèi)部留下的聯(lián)系方式進行溝通后,獲取了相關(guān)的源代碼信息,發(fā)現(xiàn)售賣者在源代碼里留了一個‘后門’,這樣除了直接用這個網(wǎng)站騙取信息的人,售賣者也可以利用‘后門’來獲取被騙取的信息,這個‘后門’行為屬于‘黑吃黑’。”
上面這類就屬于釣魚詐騙網(wǎng)站:偽裝成銀行、電子商務(wù)、微博、游戲等網(wǎng)站,與真實網(wǎng)站界面完全一致,要求訪問者提交帳號和密碼的網(wǎng)站。以此來騙取用戶的相關(guān)帳號、密碼等信息,造成隱私泄露和財產(chǎn)損失。對于這種情況我們可以在官方網(wǎng)站進行操作,切忌在其他第三方平臺點擊,因為這樣做一旦出了問題就可以直接與官方進行確認(rèn)介入調(diào)查,而在第三方平臺,發(fā)布者可能會以各種看似很牽強但是又很合理的借口進行開脫。這次我們就先講到這里,下次我們再來講講其他需要注意的地方。
近事情比較多,所以從上周就開始寫的新浪微博爬蟲一直拖到了現(xiàn)在,不過不得不說新浪微博的反扒,我只想說我真的服氣了。
向右奔跑老大說這次的就不限制要爬取哪些內(nèi)容了,但是給一個參考,有興趣的可以搞一搞:
參考想法
當(dāng)我看到這個的時候感覺很有意思和搞頭就想去整一整,所以我的一個想法就是去找一個粉絲比較多的人去解析他的分析信息,然后再去解析他粉絲的粉絲,以此類推(感覺解析初始用戶的關(guān)注的人的粉絲會更好一點,因為他的粉絲比較多,他關(guān)注的人粉絲量肯定不會小),但是到后來我就想放棄這個想法了,因為遇到的問題真的一大堆,好了廢話不多說,來看一下我抓取的信息:
抓取的信息:
1.微博標(biāo)題
2.微博nickname
3.標(biāo)識id
4.微博等級
5.地區(qū)
6.畢業(yè)院校
7.關(guān)注量+URL
8.粉絲量+URL
9.微博量+URL
大致獲取的也就這么多信息,因為很多人的信息是不完善的,所以就先抓這么多進行測試。
確定了我們要找的信息,接下來就是去解析網(wǎng)頁了(一個大的難題要出現(xiàn)了),在我看來獲取網(wǎng)頁目前遇到的:1.解析源碼,2.抓包(json),但是新浪微博這個就比較煩了,他這個是在js中,并且是未加載的(只能用正則或者selenium模擬瀏覽器了),看到這個之后我想了一段時間并且問了羅羅攀 有沒有其他的方法,不行我就用selenium,他說還是推薦正則,解析快一點,selenium是最后的選擇,沒辦法了只好硬著頭皮去寫正則了,這里在測試正則是否正確,可以使用在線測試工具,進行正則的測試,不必去一遍又一遍運行代碼。
源碼+個人信息
關(guān)注+粉絲+微博
找到這些信息,盯著源碼一直瞅,看的我頭都大了,其實又快捷的方法ctrl+f
搜索框
現(xiàn)在信息的位置我們都清楚在哪了,那么就是寫匹配信息的正則了,這個只能是自己慢慢去寫,可以練習(xí)正則表達式。
URL+粉絲分頁問題
個人主頁URL
我們先來看一個示例:http://weibo.com/p/1005051497035431/home?from=page_100505&mod=TAB&is_hot=1#place,
這個URL,給大家提個醒直接用這個是看不到主頁信息的,但是在代碼的測試源碼中我們能看到一個location重定向的連接,是將#之后的部分替換為&retcode=6102,所以URL應(yīng)該為:http://weibo.com/p/1005051497035431/home?from=page_100505&mod=TAB&is_hot=1&retcode=6102,
我點擊連接測試了一下,看到的內(nèi)容和第一條連接一樣,并且還有一點,我們之后獲取的所有連接都要替換#之后的內(nèi)容,來一個示例吧:
urls = re.findall(r'class=\"t_link S_txt1\" href=\"(.*?)\"',data)
如果不進行替換,我們拿獲取后的仍然是無法獲取到我們要的源碼。
我本想可以解析一個人的粉絲,就可以獲取大量的數(shù)據(jù),可還是栽在了系統(tǒng)限制(我在爬取的時候第五頁之后就返回不到數(shù)據(jù))
系統(tǒng)限制
看到這個之后,系統(tǒng)限制,這個又是什么,好吧只能看100個粉絲的信息,沒辦法了也只能繼續(xù)寫下去。所以說我們只要考慮5頁的數(shù)據(jù),總頁數(shù)大于5頁按五頁對待,小于5頁的正常去寫就可以,這個搞明白之后,就是要去解決分頁的連接了,通過三條URL進行對比:
1.http://weibo.com/p/1005051110411735/follow?relate=fans&from=100505&wvr=6&mod=headfans¤t=fans#place
2.http://weibo.com/p/1005051110411735/follow?relate=fans&page=2#Pl_Official_HisRelation__60
2.http://weibo.com/p/1005051110411735/follow?relate=fans&page=3#Pl_Official_HisRelation__60
通過這兩個URL我們可以看出,差別就在后半部分,除了之前我說的要將是將#之后的部分替換為&retcode=6102,之外還要改動一點,就是follow?之后的內(nèi)容那么改動后,我們就從第二頁去構(gòu)造URL。
示例代碼:
urls = ['http://weibo.com/p/1005051497035431/follow?relate=fans&page={}&retcode=6102'.format(i) for i in range(2,int(pages)+1)]
那么URL分頁問題就搞定了,也可以說解決了一個難題。如果你認(rèn)為新浪微博只有這些反扒的話,就太天真了,讓我們接著往下看。
布滿荊棘的路
整個獲取過程就是各種坑,之前主要是說了數(shù)據(jù)的獲取方式和URL及粉絲分頁的問題,現(xiàn)在我們來看一下新浪微博的一些反扒:
首先,在請求的時候必須加cookies進行身份驗證,這個挺正常的,但是在這來說他真的不是萬能的,因為cookie也是有生存期的,這個在獲取個人信息的時候還沒什么問題,但是在獲取粉絲頁面信息的時候就出現(xiàn)了過期的問題,那該怎么解決呢,想了很久,最后通過selenium模擬登錄解決了,這個之后在詳細(xì)說,總之,這一點要注意。
然后,另外一個點,不是每一個人的源碼都是一樣的,怎么說呢最明顯的自己可以去對比下,登錄微博后看一下自己粉絲的分頁那部分源碼和你搜索的那個用戶的源碼一樣不,除此之外其他的源碼信息也有不一樣,我真的指向說一句,大公司就是厲害。
用戶源碼
自己本人的源碼
大家自習(xí)看應(yīng)該可以看出來不同,所以整體來說新浪微博挺難爬。
代碼
代碼這一塊,確實沒整好,問題也比較多,但是可以把核心代碼貼出來供大家參考和探討(感覺自己寫的有點亂)
說一下代碼結(jié)構(gòu),兩個主類和三個輔助類:
兩個主類:第一個類去解析粉絲id,另一個類去解析詳細(xì)信息(解析的時候會判斷id是否解析過)
三個輔助類:第一個去模擬登陸返回cookies(再爬取數(shù)據(jù)的過程中,好像是只調(diào)用了一次,可能是代碼的問題),第二個輔助類去返回一個隨機代理,第三個輔助類將個人信息寫入MySQL。
下邊我就將兩個主類的源碼貼出來,把輔助類相關(guān)其他的信息去掉仍然是可以運行的。
1.fansSpider.py
#-*- coding:utf-8 -*-import requestsimport reimport randomfrom proxy import Proxyfrom getCookie import COOKIEfrom time import sleepfrom store_mysql import Mysqlfrom weibo_spider import weiboSpiderclass fansSpider(object):
中間注釋的一部分,因為代碼在調(diào)試,大家參考正則和一些處理方式即可
2.weibo_spider.py
# -*- coding:utf-8 -*-import requestsimport refrom store_mysql import Mysqlimport MySQLdbclass weiboSpider(object):
寫的比較亂,大家將就著看,還是我說的只是一個Demo
輔助類之一(存mysql,可以參考Mr_Cxy的python對Mysql數(shù)據(jù)庫的操作小例),其他的兩個關(guān)于隨機代理和獲取cookie,在下篇文章會詳細(xì)講解
運行結(jié)果+數(shù)據(jù)結(jié)果
測試結(jié)果
運行截圖
200為狀態(tài)碼,說明請求成功
總結(jié)
目前新浪微博是遇到問題最多的一個,不過也學(xué)到了很多知識,比如正則表達式,隨機代理等等,在學(xué)習(xí)的過程中就是遇到的問題越多,積累的越多,進步越快,所以遇到問題和出錯也是幸事。說一下代碼運行過程中存在遇到的問題吧(可以一塊交流解決):
1.有兩個id一直在循環(huán),可能是循環(huán)那一塊存在問題,可以一塊交流,解決后會更新文章。
2.解析的速度(單線程比較慢,后續(xù)寫scrapy版)
3.去重(目前是在將解析過的id寫入數(shù)據(jù)庫,然后在解析前進行判斷)
T之家 8 月 9 日消息,今天晚間,新版微博網(wǎng)頁端出現(xiàn)問題,無法訪問,重啟網(wǎng)頁后會自動進入舊版微博網(wǎng)頁。
IT之家注意到,舊版微博網(wǎng)頁仍有切換至新版的按鈕,但是點擊會出現(xiàn)“網(wǎng)絡(luò)超時”的提示。
目前,微博暫未就此事做出回應(yīng)。
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。