溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用python如何隨心所欲地爬取百度圖片

發(fā)布時間:2021-03-05 11:38:23 來源:億速云 閱讀:240 作者:小新 欄目:編程語言

小編給大家分享一下使用python如何隨心所欲地爬取百度圖片,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、前言

之前爬取了很多靜態(tài)網(wǎng)頁的內容,包括:小說、圖片等等,今天我來嘗試一下動態(tài)網(wǎng)頁的爬取。

二、需要導入的庫

import requestsimport jsonimport os

三、實現(xiàn)過程

1、下載鏈接分析

首先,打開百度,搜索一個內容,這里搜索的是男神(本人 )——彭于晏
使用python如何隨心所欲地爬取百度圖片
然后,打開抓包工具,選擇XHR選項,按Ctrl+R,然后你會發(fā)現(xiàn),隨著你鼠標的滑動,右側會出現(xiàn)一個又一個的數(shù)據(jù)包。
使用python如何隨心所欲地爬取百度圖片
(這里沒滑動太多,一開始因為滑動太多,錄的GIF超5M了)

然后,選一個包,查看它的headers,如圖:
使用python如何隨心所欲地爬取百度圖片

截取之后,粘貼在記事本上,作為一個URL,后文會用到。
使用python如何隨心所欲地爬取百度圖片
這里有很多很多的參數(shù),我也不知道具體哪些是可以忽略的,后文就索性全復制下來了,具體看后文。

到這里,能夠直接觀察到的內容就結束了,接下來,借助代碼,幫我們打開另一個世界的大門

沖就完事了!

2、代碼分析

首先:把上述中的“其它參數(shù)”組在一起。

自己做的話,最好復制自己的“其它參數(shù)”。

之后,我們可以先提取一下試試,并且把編碼格式改成'utf-8'

 url = 'https://image.baidu.com/search/acjson?'
    param = {
        'tn': 'resultjson_com',
        'logid': ' 7517080705015306512',
        'ipn': 'rj',
        'ct': '201326592',
        'is': '',
        'fp': 'result',
        'queryWord': '彭于晏',
        'cl': '2',
        'lm': '-1',
        'ie': 'utf-8',
        'oe': 'utf-8',
        'adpicid': '',
        'st': '',
        'z': '',
        'ic': '',
        'hd': '',
        'latest': '',
        'copyright': '',
        'word': '彭于晏',
        's': '',
        'se': '',
        'tab': '',
        'width': '',
        'height': '',
        'face': '',
        'istype': '',
        'qc': '',
        'nc': '1',
        'fr': '',
        'expermode': '',
        'force': '',
        'cg': 'star',
        'pn': '30',
        'rn': '30',
        'gsm': '1e',
    }
    # 將編碼形式轉換為utf-8
    response = requests.get(url=url, headers=header, params=param)
    response.encoding = 'utf-8'
    response = response.text    print(response)

運行結果如下:
使用python如何隨心所欲地爬取百度圖片
看上去挺亂的哈,沒事,我們給包裝一下!

在上面的基礎上加上:

 # 把字符串轉換成json數(shù)據(jù)
    data_s = json.loads(response)
    print(data_s)

運行結果如下:
使用python如何隨心所欲地爬取百度圖片
和上面相比,已經(jīng)明晰很多了,但依舊不夠明確,為什么呢?因為它打印的格式不方便我們觀看!

對此,有兩種解決辦法。

①導入pprint庫,接著輸入pprint.pprint(data_s),就能打印啦,如下圖

使用python如何隨心所欲地爬取百度圖片

②使用json在線解析器(自行百度),結果如下:
使用python如何隨心所欲地爬取百度圖片

解決掉上一步,我們會發(fā)現(xiàn),想要的數(shù)據(jù)都在data里面!

那么就提取吧!

 a = data_s["data"]
    for i in range(len(a)-1):  # -1是為了去掉上面那個空數(shù)據(jù)
        data = a[i].get("thumbURL", "not exist")
        print(data)

結果如下:
使用python如何隨心所欲地爬取百度圖片
到這里,已經(jīng)成功90%啦,剩下的就是保存和優(yōu)化代碼了!

3、完整代碼

這部分和上面有些許不同,仔細看看就會發(fā)現(xiàn)嗷!

# -*- coding: UTF-8 -*-"""
@Author  :遠方的星
@Time   : 2021/2/27 17:49
@CSDN    :https://blog.csdn.net/qq_44921056
@騰訊云   : https://cloud.tencent.com/developer/user/8320044
"""import requestsimport jsonimport osimport pprint# 創(chuàng)建一個文件夾path = 'D:/百度圖片'if not os.path.exists(path):
    os.mkdir(path)# 導入一個請求頭header = {
    'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_1_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}# 用戶(自己)輸入信息指令keyword = input('請輸入你想下載的內容:')page = input('請輸入你想爬取的頁數(shù):')page = int(page) + 1n = 0pn = 1# pn代表從第幾張圖片開始獲取,百度圖片下滑時默認一次性顯示30張for m in range(1, page):
    url = 'https://image.baidu.com/search/acjson?'
    param = {
        'tn': 'resultjson_com',
        'logid': ' 7517080705015306512',
        'ipn': 'rj',
        'ct': '201326592',
        'is': '',
        'fp': 'result',
        'queryWord': keyword,
        'cl': '2',
        'lm': '-1',
        'ie': 'utf-8',
        'oe': 'utf-8',
        'adpicid': '',
        'st': '',
        'z': '',
        'ic': '',
        'hd': '',
        'latest': '',
        'copyright': '',
        'word': keyword,
        's': '',
        'se': '',
        'tab': '',
        'width': '',
        'height': '',
        'face': '',
        'istype': '',
        'qc': '',
        'nc': '1',
        'fr': '',
        'expermode': '',
        'force': '',
        'cg': 'star',
        'pn': pn,
        'rn': '30',
        'gsm': '1e',
    }
    # 定義一個空列表,用于存放圖片的URL
    image_url = list()
    # 將編碼形式轉換為utf-8
    response = requests.get(url=url, headers=header, params=param)
    response.encoding = 'utf-8'
    response = response.text    # 把字符串轉換成json數(shù)據(jù)
    data_s = json.loads(response)
    a = data_s["data"]  # 提取data里的數(shù)據(jù)
    for i in range(len(a)-1):  # 去掉最后一個空數(shù)據(jù)
        data = a[i].get("thumbURL", "not exist")  # 防止報錯key error
        image_url.append(data)

    for image_src in image_url:
        image_data = requests.get(url=image_src, headers=header).content  # 提取圖片內容數(shù)據(jù)
        image_name = '{}'.format(n+1) + '.jpg'  # 圖片名
        image_path = path + '/' + image_name  # 圖片保存路徑
        with open(image_path, 'wb') as f:  # 保存數(shù)據(jù)
            f.write(image_data)
            print(image_name, '下載成功啦!??!')
            f.close()
        n += 1
    pn += 29

運行結果如下:
使用python如何隨心所欲地爬取百度圖片
使用python如何隨心所欲地爬取百度圖片
友情提示
①:一頁是30張
②:輸入的內容可以很多變:比如橋、月亮、太陽、胡歌、趙麗穎等等。

以上是“使用python如何隨心所欲地爬取百度圖片”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI