|
本文旨在科普,用最簡單明了的語言引導初學者接觸爬蟲,不求嚴謹??吹讲欢幕蛘卟幌攵膶S忻~不要糾結,只要代碼沒問題就繼續(xù)下去,等爬取成功了再回頭摳細節(jié)。 我將以虎撲火箭專區(qū)為例,爬取火區(qū)前一百頁的標題。 最先要說明的是,Python爬蟲非常簡單?。ó斎皇侵溉腴T)
好了,直入主題吧! 導入三個模塊 requests 用來發(fā)送請求(發(fā)送了請求,服務器才會響應你,你的瀏覽器才有內(nèi)容顯示) import requests第一步 爬取火箭專區(qū)地址:https://bbs.hupu.com/rockets 這個r就是HTTP狀態(tài)碼,我們最常見的404也是狀態(tài)碼 print(r.text)爬取頁面就搞定了,不過出來的都是源碼,我們要篩選出想要的信息 第二步 解析要解析頁面,必須先要了解一下頁面的結構,我們先去火箭專區(qū),然后右鍵第一個標題,檢查(以chrome瀏覽器為例,360瀏覽器好像是審查元素) Elements面板下展示的內(nèi)容,就是網(wǎng)頁的DOM節(jié)點和CSS樣式,簡單說就是網(wǎng)頁的結構和內(nèi)容,按小三角可以折疊和展開,鼠標放在代碼上面,左邊會高亮對應的內(nèi)容,雙擊代碼可以直接編輯。 ...class='for-list' 這樣帶等號的叫做屬性,有點像python的字典,等號左邊是屬性名,右邊是屬性值class屬性是非常常用的屬性,也叫做類名 經(jīng)過觀察,我們會發(fā)現(xiàn)每個帖子信息都在li標簽里面 下面簡單粗暴地說下pyquery的語法(細講的話要另起一文了) 標簽直接寫, 成功了! 要有網(wǎng)址才能爬取,所以我們先要解決網(wǎng)址的問題,常規(guī)思路是提取網(wǎng)站下一頁的鏈接,但是虎撲的下一頁其實是javascript渲染的。而我們用requests直接發(fā)送get請求得到的是未經(jīng)渲染的原始信息。js渲染這種高級的東西我們目前無法解決,但我們通過點擊下一頁網(wǎng)址可以發(fā)現(xiàn)
似乎橫杠后面的數(shù)字就是頁數(shù) def get_title(n):然后在1-10遍歷一下 十頁標題就嘩嘩嘩地爬出來了 但我們的目標是要爬100頁的 *for i in range(11):事實證明是不行的,出來的還是前十頁的標題,那問題出在哪呢? 所以我們就要涉及到一個爬蟲的基礎知識了:headers(頭部信息)
一般來說,構建headers的時候,user-agent是必要的,相當于你的身份信息,告訴服務器你是誰 這就相當于告訴服務器,我是python的requests模塊,我來找你了,大多數(shù)網(wǎng)站看到“非正常瀏覽器“的身份都不會返回數(shù)據(jù)給你的,所以我們要假裝成是正常瀏覽器 我們在剛剛的headers面板里可以看到自己的user-agent的信息,可以復制下來,requests請求的時候加上個參數(shù)headers, headers = {'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}但是復制粘貼還是略麻煩,我們可以用fake_useragent來偽造個user-agent 當然,這樣我們還是無法得到第十一頁的標題,因為我們在瀏覽器上輸入第十一頁的網(wǎng)址的時候,就彈出登錄界面,用瀏覽器訪問就相當于是正常瀏覽器身份了,所以不是user-agent的問題 難道每次我們都要手動登錄才能爬嗎?有沒有方便點的方法?這種情況我們就要用上cookie了
ua = UserAgent()添加了cookie,嘗試一下
|
|
|
來自: 徒步者的收藏 > 《科學,技術,工業(yè)》