利用Python爬取網頁圖片

  最近幾天,研究了一下一直很好奇的爬蟲算法。這裏寫一下最近幾天的點點心得。下面進入正文:html


 

  你可能須要的工做環境:python

  Python 3.6官網下載算法

  咱們這裏以sogou做爲爬取的對象。編程

  首先咱們進入搜狗圖片http://pic.sogou.com/,進入壁紙分類(固然只是個例子Q_Q),由於若是須要爬取某網站資料,那麼就要初步的瞭解它…json

進去後就是這個啦,而後F12進入開發人員選項,筆者用的是Chrome。app

右鍵圖片>>檢查    jsp

發現咱們須要的圖片src是在img標籤下的,因而先試着用 Python 的 requests提取該組件,進而獲取img的src而後使用 urllib.request.urlretrieve逐個下載圖片,從而達到批量獲取資料的目的,思路好了,下面應該告訴程序要爬取的url爲http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD,此url來自進入分類後的地址欄。明白了url地址咱們來開始愉快的代碼時間吧:網站

在寫這段爬蟲程序的時候,最好要逐步調試,確保咱們的每一步操做正確,這也是程序猿應該有的好習慣。筆者不知道本身算不算個程序猿哈。線面咱們來剖析該url指向的網頁。url

import requests import urllib from bs4 import BeautifulSoup res = requests.get('http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD') soup = BeautifulSoup(res.text,'html.parser') print(soup.select('img'))

output:spa

 

 發現輸出內容並不包含咱們要的圖片元素,而是隻剖析到logo的img,這顯然不是咱們想要的。也就是說須要的圖片資料不在url  即 http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD裏面。所以考慮可能該元素是動態的,細心的同窗可能會發現,當在網頁內,向下滑動鼠標滾輪,圖片是動態刷新出來的,也就是說,該網頁並非一次加載出所有資源,而是動態加載資源。這也避免了由於網頁過於臃腫,而影響加載速度。下面痛苦的探索開始了,咱們是要找到全部圖片的真正的url 筆者也是剛剛接觸,找這個不是太有經驗。最後找的位置F12>>Network>>XHR>>(點擊XHR下的文件)>>Preview。

發現,有點接近咱們須要的元素了,點開all_items 發現下面是0 1 2 3...一個一個的貌似是圖片元素。試着打開一個url。發現真的是圖片的地址。找到目標以後。點擊XHR下的Headers

獲得第二行

Request URL:
http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=0&len=15&width=1536&height=864,試着去掉一些沒必要要的部分,技巧就是,刪掉可能的部分以後,訪問不受影響。經筆者篩選。最後獲得的url:http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category=%E5%A3%81%E7%BA%B8&tag=%E5%85%A8%E9%83%A8&start=0&len=15  字面意思,知道category後面可能爲分類。start爲開始下標,len爲長度,也即圖片的數量。好了,開始愉快的代碼時間吧:
 
開發環境爲Win7  Python 3.6,運行的時候Python須要安裝requests,
Python3.6 安裝requests 應該CMD敲入:
pip install requests
 
筆者在這裏也是邊調試邊寫,這裏把最終的代碼貼出來:
 
import requests
import json
import urllib

def getSogouImag(category,length,path):
    n = length
    cate = category
    imgs = requests.get('http://pic.sogou.com/pics/channel/getAllRecomPicByTag.jsp?category='+cate+'&tag=%E5%85%A8%E9%83%A8&start=0&len='+str(n))
    jd = json.loads(imgs.text)
    jd = jd['all_items']
    imgs_url = []
    for j in jd:
        imgs_url.append(j['bthumbUrl'])
    m = 0
    for img_url in imgs_url:
            print('***** '+str(m)+'.jpg *****'+'   Downloading...')
            urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')
            m = m + 1
    print('Download complete!')

getSogouImag('壁紙',2000,'d:/download/壁紙/')

 

 
  程序跑起來的時候,筆者仍是有點小激動的。來,感覺一下:
 
 

 

 
 至此,關於該爬蟲程序的編程過程敘述完畢。總體來看,找到須要爬取元素所在url,是爬蟲諸多環節中的關鍵
 
相關文章
相關標籤/搜索