Python爬蟲(6):煎蛋網全站妹子圖爬蟲
上一篇文章中我們抓取了豆瓣圖書的資料,如果大家執行成功,並且看到資料夾下的 txt 檔案了。是不是有一種剛接觸程式設計,第一次輸出Hello world!
時的欣喜。和上一篇實踐不同,我們這一次來爬取 煎蛋網 全站妹子圖,並且儲存到指定資料夾下。
爬取流程
- 從煎蛋網妹子圖第一頁開始抓取;
- 爬取分頁標籤獲得最後一頁數字;
- 根據最後一頁頁數,獲得所有頁
URL
; - 迭代所有頁,對頁面所有妹子圖片
url
進行抓取;訪問圖片URL
並且儲存圖片到資料夾。
開始
通過上一篇文章的爬取過程,我們基本上理解了抓取一個網站的大致流程。因為一個網站雖然有很多頁,但是大部分網站每一頁的HTML
標籤內容都是相同的。我們只要獲取到一頁的內容,就可以獲得所有頁的內容了。那麼開始之前,我們來分析一下煎蛋網妹子圖頁面的URL
第一頁的 url:http://jandan.net/ooxx/page-1
第二頁:http://jandan.net/ooxx/page-2
最後一頁:http://jandan.net/ooxx/page-93
不難發現,煎蛋網的 url 的規律是比較簡單的,每一頁後面 page 的數字就是幾。那麼我們可以通過一個迴圈就可以獲得所有的頁面 URL 了。但是大家應該想到,這個網站每天都會更新,今天是 93 頁,明天就會增加到94頁了。如果每一都要爬一次的話,那麼每次都要改一下內碼表數資訊了。這樣實現起來雖然可以,但是不免有些愚蠢。
所以我們需要通過頁面的標籤資訊讓程式自己獲得頁數,我們訪問http://jandan.net/ooxx/
圖中我們可以明確的看到最後一頁的數字是94.只要通過這個頁面的URL進行抓取就可以得到。我們先獲得原始碼:
import requests from bs4 import BeautifulSoup headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36' } resp = requests.get(url, headers = headers) soup = BeautifulSoup(resp.text, 'lxml' ) |
我們按下f12
,從頁面原始碼中找到最後一頁 94 所在的標籤:
原來 94 就在這個span
標籤啊。接下來是不是很簡單了:
# 獲得最高頁碼數 allpage = soup.find( 'span' , class_ = "current-comment-page" ).get_text()[ 1 : - 1 ] |
由於標籤內的 94 邊包含一個[]
,大家不要以為只是一個list
,只要[0]
就可以獲得的。我們完全可以使用type()
,看一下他的屬性,就知道它是一個字串,我們利用切片去掉第一個和最後一個字元,就得到了頁數了。
得到頁數後,我們利用迴圈就可以得到所有頁的url了:
urllist = [] # for迴圈迭代出所有頁面,得到url for page in range ( 1 , int (allpage) + 1 ): allurl = base_url + 'page-' + str (page) urllist.append(allurl) |
我們把它儲存到一個list
中。
那麼現在,我們得到所有頁面的 url,就可以來獲取每一頁的內容了。我們以最後一頁為例來進行抓取。
我們仍然使用審查元素,找到圖片 url 所在的標籤。仍然是老方法,獲取到頁面所有包含圖片的img
標籤:
# css選擇器 allimgs = soup.select( 'div.text > p > img' ) |
只要一行程式碼,我們就成功獲得所有標籤了。這裡使用了 CSS選擇器,大家是否還記得這個方法呢。可以檢視之前的文章或者BeautifulSoup
的官方文件瞭解哦。如果大家對 CSS 不是很熟悉,或者根本不知道。也沒關係,反正find_all()
和find()
方法也是可以實現的。不過這裡我教大家一個簡單的CSS選擇器方法。
我們只要按f12
開啟瀏覽器的開發者工具,找到標籤的位置,右擊標籤。就可以看到這個情況:
沒錯,我們直接Copy selector
的內容,粘貼出來就是這樣的字串:#comment-3468457 > div > div > div.text > p > img
我們稍微去掉前面的一些標籤,大多數情況下保留到父標籤後面的內容就可以了。就是這樣:div.text > p > img
我們放到程式碼中,執行一下就知道是不是成功了。
結果只一個列表:
[<img onload = "add_img_loading_mask(this, load_sina_gif);" org_src = "//wx4.sinaimg.cn/mw690/6adc108fly1fg90v6vzipg20ak05xqv5.gif" src = "//wx4.sinaimg.cn/thumb180/6adc108fly1fg90v6vzipg20ak05xqv5.gif" / >, <img onload = "add_img_loading_mask(this, load_sina_gif);" org_src = "//wx4.sinaimg.cn/mw690/6adc108fly1fg90qymd8pg20dc0dcnph.gif" src = "//wx4.sinaimg.cn/thumb180/6adc108fly1fg90qymd8pg20dc0dcnph.gif" / >, <img onload = "add_img_loading_mask(this, load_sina_gif);" org_src = "//wx4.sinaimg.cn/mw690/6adc108fly1fg90s98qsbg207e08mu10.gif" src = "//wx4.sinaimg.cn/thumb180/6adc108fly1fg90s98qsbg207e08mu10.gif" / >, <img onload = "add_img_loading_mask(this, load_sina_gif);" org_src = "//wx3.sinaimg.cn/mw690/6adc108fly1fg90v51p5eg20a00dchdv.gif" src = "//wx3.sinaimg.cn/thumb180/6adc108fly1fg90v51p5eg20a00dchdv.gif" / >, <img src = "//wx4.sinaimg.cn/mw600/a1b56627gy1fdb7851js0j20ku4xcx6q.jpg" / >, <img src = "//wx4.sinaimg.cn/mw600/a1b56627gy1fdb78fw14yj20dc46pb2a.jpg" / >, <img src = "//wx3.sinaimg.cn/mw600/a1b56627gy1fdb78hqr1kj20dc1i0x02.jpg" / >, <img src = "//wx4.sinaimg.cn/mw600/a1b56627gy1fdb78ldnwbj20ku3ei4qq.jpg" / >, <img src = "//wx4.sinaimg.cn/mw600/a82b014bly1fg8gkj95toj21kw1kwh3s.jpg" / >, <img src = "//wx4.sinaimg.cn/mw600/a82b014bly1fg8gkhmfraj21kw11xgth.jpg"
|