國家航天局圖片采集

聲明: 本文檔只做案例演示, 程序運行設置有時間間隔.

分析目標網(wǎng)站結構

本次爬取的網(wǎng)站是國家航天局

我們的目標是下載該網(wǎng)站精彩圖集中的圖片.



每頁和圖片詳情頁URL的分析

通過觀察我們可以發(fā)現(xiàn), 精彩圖集頁面下, 一共有14頁, 每頁都包含了相關的圖片. 點擊這些圖片我們能進入到圖片詳情頁, 詳情頁中包含了目標圖片和圖片標題.



既然能通過點擊對應圖片進入到圖片詳情頁, 說明當前頁面中包含了圖片詳情頁的URL.

精彩圖集中一共14頁, 說明我們需要爬取14個頁面中的圖片詳情頁URL.

通過分析網(wǎng)站發(fā)現(xiàn), 精彩圖集中點擊進入下一頁, 或者點擊第二頁, 第三頁. 瀏覽器上方的網(wǎng)址(URL)并沒有發(fā)生變化, 但是實際在換頁的時候, 頁面上的圖片是會發(fā)送變化的. 根據(jù)這個現(xiàn)象可以猜測網(wǎng)站在進入下一頁或其他頁面時會發(fā)送額外的請求來獲取頁面上需要呈現(xiàn)的圖片數(shù)據(jù), 如ajax請求.

打開瀏覽器的開發(fā)者工具, 在network中對請求進行簡單抓包分析, 發(fā)現(xiàn)進入下一頁的時候會有額外請求的發(fā)送, 而這些額外請求返回的響應中包含了圖片的詳情頁鏈接


我們可以看到這些請求返回的數(shù)據(jù)是一堆html代碼, 而這些代碼中包含了a標簽, 標簽中href屬性的值就是圖片詳情頁的URL, 當然這個URL是殘缺的, 我們需要進行相關的拼接, 因為實際的詳情頁URL一般是這樣的: http://www.cnsa.gov.cn/n6758823/n6758842/c6769934/content.html

既然圖片詳情頁的URL就在這些請求返回的響應中, 那么也就是說我們模擬這些請求來獲取響應即可, 從響應中提取我們要的數(shù)據(jù).

詳情頁URL搞定了, 我們要想一想整個精彩圖集的每一頁應該怎么爬取, 雖然我們肉眼直觀的能看到是14頁, 我們可以循環(huán)來發(fā)送剛才我們抓到的額外請求, 但是網(wǎng)站是會更新的, 一段時間后可能就不是14頁. 我們要想個辦法, 讓程序自己在爬取的時候知道總頁數(shù)是多少, 這樣任何時候總頁數(shù)都是正確的, 那么我們在爬取每一頁的時候就不容易出錯.

在查看 精彩圖集網(wǎng)頁源代碼的時候, 發(fā)現(xiàn)html代碼中包含了一段js代碼, 里面定義了總頁數(shù)的變量.


顯然maxPageNum = 14;這里變量的值就是我們想要的總頁數(shù), 我們可以通過訪問該頁面, 使用正則來匹配該變量值獲取總頁數(shù).

總結: 分析到這里, 我們解決了爬取圖片的兩個問題.

發(fā)現(xiàn)額外發(fā)送的請求中包含了圖片的URL, 可以通過讓程序發(fā)送這些請求來獲取圖片URL.

從精彩圖集首頁中的源代碼中發(fā)現(xiàn)總頁數(shù)的數(shù)據(jù)所在位置, 通過正則可以來提取總頁數(shù).

這樣我們離下載圖片還差訪問詳情頁和訪問頁中的圖片URL了.

圖片詳情頁分析


通過瀏覽器開發(fā)者工具, 我們能輕易的查看到圖片URL所在網(wǎng)頁代碼中的位置, 我們發(fā)現(xiàn)圖片URL就在img標簽中, 大致的層次結構如圖, 現(xiàn)在的話我們就打開網(wǎng)頁源代碼, 看下網(wǎng)頁源代碼中是否也能直接找到這樣的URL.


顯然我們直接就找到了, 那么我們的圖片URL找到了, 而且我們圖片的標題也是能在源代碼中找到的.

所以總結: 到目前為止, 我們整個網(wǎng)站分析就結束了.

圖集總頁數(shù)的數(shù)據(jù)獲取

圖集每一頁的請求的抓取, 詳情頁URL的確定.

詳情頁中圖片URL和圖片標題的確定.

接下來就剩寫代碼了.

代碼編寫


首先創(chuàng)建demo3目錄, 在該目錄下創(chuàng)建images目錄和pa_china_sa.py文件.

該py文件中存放我們的爬蟲代碼.

我們分段處理問題來寫代碼

每一頁請求的發(fā)送

代碼需要安裝導入并使用requests模塊: pip install requests

這里的主要邏輯為:

訪問圖集首頁


通過正則獲取總頁數(shù).


通過總頁數(shù)和構造每頁URL再配合使用for循環(huán), 來發(fā)送每頁的請求



圖片詳情頁的提取

代碼需要安裝導入并使用lxml模塊: pip install lxml

lxml模塊包含了支持xpath表達式的功能, 可以通過該模塊配合xpath來提取結構化的數(shù)據(jù)即詳情頁URL

主要邏輯為:

根據(jù)每頁返回響應數(shù)據(jù), 創(chuàng)建支持xpath的對象, 并提取URL.


對提取的數(shù)據(jù)進行請求.



從圖片詳情頁中提取圖片URL

主要邏輯為:

????通過xpath從循環(huán)請求詳情頁的響應中抽取圖片URL和圖片標題.


通過列表的追加方法, 將圖片的URL和名稱放入到列表中.


下載圖片并保存到images目錄下


代碼可以封裝到函數(shù)中, 使用上多線程來提高下載效率.

from multiprocessing.pool import ThreadPool

執(zhí)行結果如下:


有問題歡迎留言評論.有建議或者意見歡迎斧正 不勝感激

有興趣一起學習爬蟲的小伙伴們記得加群: 657598389,會有許多的資源可以供大家學習分享,歡迎大家前來一起學習進步!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容