最近經常有人問我,明明看着教程寫個爬蟲很簡單,但是自己上手的時候就麻爪了。。。那麼今天就給剛開始學習爬蟲的同學,分享一下怎麼一步一步寫爬蟲,直至抓到數據的過程。
準備工具
首先是工具的準備:python3.6、pycharm、requests庫、lxml庫以及火狐浏覽器
這2個庫都是python的第三方庫,需要用pip安裝一下!
requests是用于請求網頁,得到網頁的源代碼,然後用lxml庫分析html源碼,從中間取出我們需要的内容!
之所以用火狐而不用其他的浏覽器,沒有别的意思,就是習慣。。。
分析網頁
工具準備好以後呢,我們就可以開始我們的爬蟲之旅了!今天我們的目标是抓取貓眼電影的經典影片部分,大約有8萬多條數據
打開網頁後,首先就要分析網頁源代碼,看是靜态的還是動态的,或者其他形式,這個網頁呢,是靜态的網頁,所以,源代碼中就有我們需要的内容
很明顯,它的電影名字和評分都在源代碼中,但是評分被分成了2部分,這點在寫爬蟲的時候,就要注意了!
那麼,現在整體思路就很明确了:請求網頁==>>獲取html源代碼==>>匹配内容,然後在外面在加一步:獲取頁碼==>>構建所有頁的循環,這樣就可以将所有内容都抓出來了!下面外面來寫代碼吧。
開始寫爬蟲先導入2個庫,然後用一行代碼獲取網頁html,在打印一下看看結果
好吧,網站不允許爬蟲運行!我們加入headers試一下(headers是一個身份證明,表明請求網頁的是一個浏覽器而不是python代碼),獲取方式也很簡單,打開F12開發者工具,随便找一個網絡請求,然後按下圖找到請求頭,複制相關信息即可,這個header可以保存下,基本一個浏覽器都是一個UA,下次直接用就可以。
注意,在火狐中,header的數據如果很長是會縮寫的,看到上圖中間的省略号…了嗎~所以在複制的時候,要先雙擊展開,在複制,然後修改上面的代碼,在看看
這次,html被正确的打印出來了!(後面的.text是獲取html文本,如果不加,會返回是否獲取成功的提示,而不是html源碼),我們先構建頁碼的循環,找一下翻頁的html代碼
點擊開發者工具中左上角的選擇元素,然後在點擊頁碼,下方會自動定位相應的源碼位置,這裡我們可以直觀的看到最大頁碼,先取出它來,在其上點右鍵,選擇複制Xpath,然後寫到代碼中
第9行是表達用lxml中的etree方法解析html,第10行是指從html中找到路徑所對應的标簽,因為頁碼是文字顯示,是标簽的文本部分,所以在路徑最後加一個/text()來取出文本,最終取出的内容為列表形式。然後我們在來觀察每一頁的url,還記得剛才那個頁碼部分的html嗎?
href的值就是每一個頁碼所對應的url,當然它省去了域名部分。可以看出啦,它的規律就是offset的值随着頁碼變化(*30)那麼,我們就可以來構建循環了!
第10行用[0]取出列表中的pn值,然後構建循環,接着就是獲取新的url(pn_url)的html,然後去html中匹配我們要的内容!為了方便,加一個break,這樣隻會循環一次
然後開始匹配,我們這次隻拿出電影名稱、評分和詳情url3個結果
可以看到,我們所要的内容在dd這個标簽下,它下面有3個div,第一個是圖片的,先不用管,第二個是電影名稱,詳情頁url也在裡面,第三個div中有評分結果,所以我們可以這麼寫
第14行,依然是解析html,第15,16行分别獲取class屬性為"channel-detail movie-item-title"的div标簽下的title值和div下的a标簽的href值(這裡沒有用複制xpath路徑,當然如果可以的話,也建議大家用這種方式,因為用路徑的話,萬一網頁修改一下結構,那我們的代碼就要重新寫了。。。)
第17,18行,2行代碼獲取div标簽下的所有文本内容,還記得那個評分嗎?它不在一個标簽下,而是2個标簽下的文本内容合并的,所以用這種方式獲取!
然後,用zip函數,将内容一一對應的寫入txt文件裡
注意内容間隔和換行!
至此,爬蟲部分基本完成!先來看看效果吧,時間有限,就先抓前5頁,代碼和結果如下:
後記
整個爬蟲過程,沒有什麼難點,開始需要注意報頭信息(headers),後面在抓取數據的過程中,匹配方式也要多學多用,最後注意數據量,2個方面:抓取間隔和抓取的數量,不要對網站造成不好的影響這個是基本的要求!還有就是這個網站到後面,大約是100多頁往後的時候,就需要登錄了,這點要注意,具體的大家可以自己去嘗試哦!
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!