所需要導入的包:
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=' ')
