如何用Python爬蟲實現百度圖片自動下載?

Github:github.com/nnngu/Learn…html


製做爬蟲的步驟

製做一個爬蟲通常分如下幾個步驟:python

  • 分析需求
  • 分析網頁源代碼,配合開發者工具
  • 編寫正則表達式或者XPath表達式
  • 正式編寫 python 爬蟲代碼

效果預覽

運行效果以下:git

存放圖片的文件夾:github

需求分析

咱們的爬蟲至少要實現兩個功能:一是搜索圖片,二是自動下載。正則表達式

搜索圖片:最容易想到的是爬百度圖片的結果,咱們就上百度圖片看看:緩存

隨便搜索幾個關鍵字,能夠看到已經搜索出來不少張圖片:服務器

分析網頁

咱們點擊右鍵,查看源代碼:工具

打開源代碼以後,發現一堆源代碼比較難找出咱們想要的資源。ui

這個時候,就要用開發者工具!咱們回到上一頁面,調出開發者工具,咱們須要用的是左上角那個東西:(鼠標跟隨)。url

而後選擇你想看源代碼的地方,就能夠發現,下面的代碼區自動定位到了相應的位置。以下圖:

咱們複製這個地址,而後到剛纔的一堆源代碼裏搜索一下,發現了它的位置,可是這裏咱們又疑惑了,這個圖片有這麼多地址,到底用哪一個呢?咱們能夠看到有thumbURL,middleURL,hoverURL,objURL

經過分析能夠知道,前面兩個是縮小的版本,hoverURL 是鼠標移動事後顯示的版本,objURL 應該是咱們須要的,能夠分別打開這幾個網址看看,發現 objURL 的那個最大最清晰。

找到了圖片地址,接下來咱們分析源代碼。看看是否是全部的 objURL 都是圖片。

發現都是以.jpg格式結尾的圖片。

編寫正則表達式

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
複製代碼

編寫爬蟲代碼

這裏咱們用了2個包,一個是正則,一個是 requests 包

#-*- coding:utf-8 -*-
import re
import requests
複製代碼

複製百度圖片搜索的連接,傳入 requests ,而後把正則表達式寫好

url = 'https://image.baidu.com/search/index?tn=baiduimage&ie=utf-8&word=%E6%A0%97%E5%B1%B1%E6%9C%AA%E6%9D%A5%E5%A4%B4%E5%83%8F&ct=201326592&ic=0&lm=-1&width=&height=&v=index'

html = requests.get(url).text
pic_url = re.findall('"objURL":"(.*?)",',html,re.S)

複製代碼

由於有不少張圖片,因此要循環,咱們打印出結果來看看,而後用 requests 獲取網址,因爲有些圖片可能存在網址打不開的狀況,因此加了10秒超時控制。

pic_url = re.findall('"objURL":"(.*?)",',html,re.S)
i = 1
for each in pic_url:
    print each
    try:
        pic= requests.get(each, timeout=10)
    except requests.exceptions.ConnectionError:
        print('【錯誤】當前圖片沒法下載')
        continue

複製代碼

接着就是把圖片保存下來,咱們事先創建好一個 images 目錄,把圖片都放進去,命名的時候,以數字命名。

dir = '../images/' + keyword + '_' + str(i) + '.jpg'
        fp = open(dir, 'wb')
        fp.write(pic.content)
        fp.close()
        i += 1
複製代碼

完整的代碼

# -*- coding:utf-8 -*-
import re
import requests


def dowmloadPic(html, keyword):
    pic_url = re.findall('"objURL":"(.*?)",', html, re.S)
    i = 1
    print('找到關鍵詞:' + keyword + '的圖片,如今開始下載圖片...')
    for each in pic_url:
        print('正在下載第' + str(i) + '張圖片,圖片地址:' + str(each))
        try:
            pic = requests.get(each, timeout=10)
        except requests.exceptions.ConnectionError:
            print('【錯誤】當前圖片沒法下載')
            continue

        dir = '../images/' + keyword + '_' + str(i) + '.jpg'
        fp = open(dir, 'wb')
        fp.write(pic.content)
        fp.close()
        i += 1


if __name__ == '__main__':
    word = input("Input key word: ")
    url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&ct=201326592&v=flip'
    result = requests.get(url)
    dowmloadPic(result.text, word)

複製代碼

咱們看到有的圖片沒顯示出來,打開網址看,發現確實沒了。

由於百度有些圖片它緩存到百度的服務器上,因此咱們在百度上還能看見它,但它的實際連接已經失效了。

總結

enjoy 咱們的第一個圖片下載爬蟲吧!固然它不只能下載百度的圖片,依葫蘆畫瓢,你如今應該能作不少事情了,好比爬取頭像,爬淘寶展現圖等等。

完整代碼已經放到Githut上 github.com/nnngu/Baidu…

相關文章
相關標籤/搜索