作者:xlzd
鏈接:https://zhuanlan.zhihu.com/p/20430122
來源:知乎
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權查坪,非商業(yè)轉載請注明出處匪凉。
好了宏粤,到上一篇博客跟伏,我們已經能夠順利從網(wǎng)站上抓取一些簡單的數(shù)據(jù)方庭,并將其存儲到文件中。但是在抓取網(wǎng)頁的時候有咨,有時候會發(fā)現(xiàn)HTML中沒有我們需要的數(shù)據(jù)琐簇,這時候如何是好呢?
-------------------------------------
我們的目的是抓取拉勾網(wǎng)Python分類下全國到目前為止展示出來的所有招聘信息座享,首先在瀏覽器點擊進去看看吧婉商。如果你足夠小心或者網(wǎng)速比較慢,那么你會發(fā)現(xiàn)渣叛,在點擊Python分類之后跳到的新頁面上丈秩,招聘信息出現(xiàn)時間是晚于頁面框架出現(xiàn)時間的。到這里淳衙,我們幾乎可以肯定蘑秽,招聘信息并不在頁面HTML源碼中,我們可以通過按下"command+option+u"(在Windows和Linux上的快捷鍵是"ctrl+u")來查看網(wǎng)頁源碼滤祖,果然在源碼中沒有出現(xiàn)頁面展示的招聘信息筷狼。
到這一步瓶籽,我看到的大多數(shù)教程都會教匠童,使用什么什么庫,如何如何模擬瀏覽器環(huán)境塑顺,通過怎樣怎樣的方式完成網(wǎng)頁的渲染汤求,然后得到里面的信息......永遠記住,對于爬蟲程序严拒,模擬瀏覽器往往是下下策扬绪,只有實在沒有辦法了,才去考慮模擬瀏覽器環(huán)境裤唠,因為那樣的內存開銷實在是很大挤牛,而且效率非常低。
那么我們怎么處理呢种蘸?經驗是墓赴,這樣的情況,大多是是瀏覽器會在請求和解析HTML之后航瞭,根據(jù)js的“指示”再發(fā)送一次請求诫硕,得到頁面展示的內容,然后通過js渲染之后展示到界面刊侯。好消息是章办,這樣的請求往往得到的內容是json格式的,所以我們非但不會加重爬蟲的任務,反而可能會省去解析HTML的功夫藕届。
那個挪蹭,繼續(xù)打開Chrome的開發(fā)者工具,當我們點擊“下一頁”之后翰舌,瀏覽器發(fā)送了如下請求:
注意觀察"positionAjax.json"這個請求嚣潜,它的Type是"xhr",全稱叫做"XMLHttpRequest"椅贱,XMLHttpRequest對象可以在不向服務器提交整個頁面的情況下懂算,實現(xiàn)局部更新網(wǎng)頁。那么庇麦,現(xiàn)在它的可能性最大了计技,我們單擊它之后好好觀察觀察吧:
點擊之后我們在右下角發(fā)現(xiàn)了如上詳情,其中幾個tab的內容表示:
Headers:請求和響應的詳細信息
Preview:響應體格式化之后的顯示
Response:響應體原始內容
Cookies:Cookies
Timing:時間開銷
通過對內容的觀察山橄,返回的確實是一個json字符串垮媒,內容包括本頁每一個招聘信息,到這里至少我們已經清楚了航棱,確實不需要解析HTML就可以拿到拉鉤招聘的信息了睡雇。那么,請求該如何模擬呢饮醇?我們切換到Headers這一欄它抱,留意三個地方:
上面的截圖展示了這次請求的請求方式、請求地址等信息朴艰。
上面的截圖展示了這次請求的請求頭观蓄,一般來講,其中我們需要關注的是Cookie / Host / Origin / Referer / User-Agent / X-Requested-With等參數(shù)祠墅。
上面這張截圖展示了這次請求的提交數(shù)據(jù)侮穿,根據(jù)觀察,kd表示我們查詢的關鍵字毁嗦,pn表示當前頁碼亲茅。
那么,我們的爬蟲需要做的事情狗准,就是按照頁碼不斷向這個接口發(fā)送請求克锣,并解析其中的json內容,將我們需要的值存儲下來就好了驶俊。這里有兩個問題:什么時候結束娶耍,以及如何的到json中有價值的內容。
我們回過頭重新觀察一下返回的json饼酿,格式化之后的層級關系如下:
很容易發(fā)現(xiàn)榕酒,content下的hasNextPage即為是否存在下一頁胚膊,而content下的result是一個list,其中的每項則是一條招聘信息想鹰。在Python中紊婉,json字符串到對象的映射可以通過json這個庫完成:
importjsonjson_obj=json.loads("{'key': 'value'}")# 字符串到對象json_str=json.dumps(json_obj)# 對象到字符串
json字符串的"[ ]"映射到Python的類型是list,"{ }"映射到Python則是dict辑舷。到這里喻犁,分析過程已經完全結束,可以愉快的寫代碼啦何缓。具體代碼這里不再給出肢础,希望你可以自己獨立完成,如果在編寫過程中存在問題碌廓,可以聯(lián)系我獲取幫助传轰。
小結
這篇博客介紹了有些數(shù)據(jù)不在HTML源碼中的情況下的抓取方法,適用于一部分情況谷婆。對于數(shù)據(jù)的存儲暫時還是在使用文件慨蛙。到下一篇,我們將使用MongoDB存儲數(shù)據(jù)纪挎,所以在這之間期贫,希望你可以先在本機安裝并配置好MongoDB。