利用Python爬取網頁圖片
你可能需要的工作環境:
我們這裡以sogou作為爬取的物件。
首先我們進入搜狗圖片 http://pic.sogou.com/ ,進入桌布分類(當然只是個例子Q_Q),因為如果需要爬取某網站資料,那麼就要初步的瞭解它…

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

右鍵圖片>>檢查

發現我們需要的圖片src是在img標籤下的,於是先試著用 Python 的 requests提取該元件,進而獲取img的src然後使用 urllib.request.urlretrieve逐個下載圖片,從而達到批量獲取資料的目的,思路好了,下面應該告訴程式要爬取的url為http://pic.sogou.com/pics/recommend?category=%B1%DA%D6%BD,此url來自進入分類後的位址列。明白了url地址我們來開始愉快的程式碼時間吧:
在寫這段爬蟲程式的時候,最好要逐步除錯,確保我們的每一步操作正確,這也是程式猿應該有的好習慣。筆者不知道自己算不算個程式猿哈。線面我們來剖析該url指向的網頁。
import requestsimport urllibfrombs4import 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:

發現輸出內容並不包含我們要的圖片元素,而是隻剖析到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 requestsimport jsonimport urllibdef 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 = []
forjin jd:
imgs_url.append(j['bthumbUrl'])
m = 0
forimg_urlin imgs_url:
print('***** '+str(m)+'.jpg *****'+' Downloading...')
urllib.request.urlretrieve(img_url,path+str(m)+'.jpg')
m = m + 1print('Download complete!')
getSogouImag('桌布',2000,'d:/download/桌布/')
程式跑起來的時候,筆者還是有點小激動的。來,感受一下:


至此,關於該爬蟲程式的程式設計過程敘述完畢。整體來看,找到需要爬取元素所在url,是爬蟲諸多環節中的關鍵