【Python】爬取百度圖片


所需要導入的包:
BeautifulSoup:
    該模塊用於接收一個HTML或XML字符串,然后將其進行格式化,之后遍可以使用他提供的方法進行快速查找指定元素,
    從而使得在HTML或XML中查找指定元素變得簡單。
    這里是用來獲取一個頁面里面的各個標簽及里面的內容,我們主要用到它里面的find(),find_All()函數
requests:
    是用來獲取網頁信息的,也就是說,我們給它一個url,它能把這個url對應的頁面信息全部反饋給我們,這時候我們在用beautifulSoup里的函數對他們進行處理
lxml :
    是一個解析器,python里有專門的解析器,html.parser,但是lxml的解析速度優於html_parser,所以建議使用lxml
re :
    正則表達式函數
os :
    系統函數

find()函數如下:

find(name,attrs,recursive,text,**wargs)

這些參數相當於過濾器一樣可以進行篩選處理。

不同的參數過濾可以應用到以下情況:

    查找標簽,基於name參數
    查找文本,基於text參數
    基於正則表達式的查找
    查找標簽的屬性,基於attrs參數
    基於函數的查找

 通過標簽查找

我們可以傳遞任何標簽的名字來查找到它第一次出現的地方。找到后,find函數返回一個BeautifulSoup的標簽對象。

  1 # -*- coding:utf-8
  2 import re
  3 import requests
  4 from urllib import error
  5 from bs4 import BeautifulSoup
  6 import os
  7 
  8 num = 0
  9 numPicture = 0
 10 file = ''
 11 List = []
 12 
 13 #檢測圖片數量函數
 14 def Find(url):
 15     global List  #設置為全局變量
 16     print('正在檢測圖片總數,請稍等.....')
 17     t = 0  #objURL 分頁數初始值
 18     i = 1
 19     s = 0
 20     while t < 1000:
 21         Url = url + str(t) # url地址加上分頁數
 22         try:
 23             Result = requests.get(Url, timeout=7) #獲取到url.timeout時間為7秒.如果獲取不到7秒后退出
 24         except BaseException:
 25             t = t + 60 #源代碼分頁數為60
 26             continue
 27         else:
 28             result = Result.text #以encoding解析返回內容。字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼。
 29             pic_url = re.findall('"objURL":"(.*?)",', result, re.S)  # 先利用正則表達式找到圖片url
 30             s += len(pic_url) #根據正則表達式循環取出圖片.(根據圖片的數量長度來取,其實就是統計圖片的個數)
 31             if len(pic_url) == 0: #長度為0說明沒有符合條件的圖片了退出
 32                 break
 33             else:
 34                 List.append(pic_url) #將取出的圖片存入到list中去
 35                 t = t + 60
 36     return s
 37 
 38 #推薦函數(推薦函數,主要是根據你鍵入的文本,在百度圖片里找到相似的內容,返回給用戶,類似於百度搜索的最下面)
 39 def recommend(url):
 40     Re = []
 41     try:
 42         html = requests.get(url) #獲取url
 43     except error.HTTPError as e:
 44         return
 45     else:
 46         html.encoding = 'utf-8'  #html解碼格式為utf-8
 47         bsObj = BeautifulSoup(html.text, 'html.parser') #html.text 根據encoding定義的code返回內容. html.parser 是解析器
 48         div = bsObj.find('div', id='topRS') # 通過find()函數獲取標簽<div id="topRS">
 49         if div is not None:
 50             listA = div.findAll('a')  #獲取子標簽 find_All()返回的是一個list find()直接返回結果
 51             for i in listA:
 52                 if i is not None:
 53                     Re.append(i.get_text())
 54         return Re
 55 
 56 #下載圖片函數
 57 def dowmloadPicture(html, keyword):
 58     global num
 59     # t =0
 60     pic_url = re.findall('"objURL":"(.*?)",', html, re.S)  # 先利用正則表達式找到圖片url
 61     print('找到關鍵詞:' + keyword + '的圖片,即將開始下載圖片...')
 62     for each in pic_url:
 63         print('正在下載第' + str(num + 1) + '張圖片,圖片地址:' + str(each))
 64         try:
 65             if each is not None:
 66                 pic = requests.get(each, timeout=7)
 67             else:
 68                 continue
 69         except BaseException:
 70             print('錯誤,當前圖片無法下載')
 71             continue
 72         else:
 73             string = file + r'\\' + keyword + '_' + str(num) + '.jpg'
 74             fp = open(string, 'wb')
 75             fp.write(pic.content)
 76             #text 返回的是unicode 型的數據,一般是在網頁的header中定義的編碼形式。
 77             # content返回的是bytes,二級制型的數據。也就是說你如果想要提取文本就用text.但是如果你想要提取圖片、文件,就要用到content
 78             fp.close()
 79             num += 1
 80         if num >= numPicture:
 81             return
 82 
 83 
 84 if __name__ == '__main__':  # 主函數入口
 85     word = input("請輸入搜索關鍵詞(可以是人名,地名等): ")
 86     # add = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E5%BC%A0%E5%A4%A9%E7%88%B1&pn=120'
 87     url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + word + '&pn='
 88     tot = Find(url)
 89     Recommend = recommend(url)  # 記錄相關推薦
 90     print('經過檢測%s類圖片共有%d張' % (word, tot))
 91     numPicture = int(input('請輸入想要下載的圖片數量 '))
 92     file = input('請建立一個存儲圖片的文件夾,輸入文件夾名稱即可')
 93     y = os.path.exists(file)
 94     if y == 1:
 95         print('該文件已存在,請重新輸入')
 96         file = input('請建立一個存儲圖片的文件夾,)輸入文件夾名稱即可')
 97         os.mkdir(file)
 98     else:
 99         os.mkdir(file)
100     t = 0
101     tmp = url
102     while t < numPicture:
103         try:
104             url = tmp + str(t)
105             result = requests.get(url, timeout=10)
106             print(url)
107         except error.HTTPError as e:
108             print('網絡錯誤,請調整網絡后重試')
109             t = t + 60
110         else:
111             dowmloadPicture(result.text, word)
112             t = t + 60
113 
114     print('當前搜索結束,感謝使用')
115     print('猜你喜歡')
116     for re in Recommend:
117         print(re, end='  ')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM