天天看點

入門百度圖檔爬取-----火影忍者桌面爬取

準備工作

我們這裡用的是Uc浏覽器,用百度搜尋 ’火影忍者桌面‘

這裡我們的網址是http://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%BB%F0%D3%B0%C8%CC%D5%DF%B1%DA%D6%BD&fr=ala&ala=1&pos=0&alatpl=wallpaper&oriquery=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8

這裡我們往下拉的時候是會有很多的圖檔

可以将網址中的index替換為flip。這樣的話我們就把網頁換成了這樣

入門百度圖檔爬取-----火影忍者桌面爬取
替換後的網址
http://image.baidu.com/search/flip?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%BB%F0%D3%B0%C8%CC%D5%DF%B1%DA%D6%BD&fr=ala&ala=1&pos=0&alatpl=wallpaper&oriquery=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8分成這樣一頁一頁的作用往後就知道啦 = =

爬取一張圖檔看看效果:

import os
import requests
url = "http://resource.58game.com/uploads/content/20170117/587d7c026f70e.jpg"
r = requests.get(url)     #  對于這個url我們先不要着急怎麼出來
filename = "./output/1.jpg"    #   這個檔案夾會産生在根目錄下,爬取了一張圖檔
if not os.path.exists("output"):	
    os.makedirs("output")
with open(filename,'wb')as f:
    f.write(r.content)            #  圖檔寫入

           

那麼剛剛這個url怎麼得到的呢?

我們打開這個替換後的網址Ctrl+U 檢視網頁源代碼,搜尋 ‘.jpg’

發現:相同的網址前邊是不一樣,那麼哪個才是我們需要的呢?

入門百度圖檔爬取-----火影忍者桌面爬取

這裡我們可以選擇其中一個看看能不能下載下傳下來 上邊例子選擇的是 “objURL” 這個下的網址 經過剛才 驗證正确

那麼我們怎麼找到所有的"objURL"呢?

我們可以用bs4,xpath,re等等 這裡我們用re來選取

一頁的圖檔url我麼已經拿到手了

怎麼搞到好幾頁的呢?我們依次打開第2,3,4頁 看看有沒有什麼規律

第一頁:http://image.baidu.com/search/flip?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=%BB%F0%D3%B0%C8%CC%D5%DF%B1%DA%D6%BD&fr=ala&ala=1&pos=0&alatpl=wallpaper&oriquery=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8

第二頁:http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8&pn=20&gsm=&ct=&ic=0&lm=-1&width=0&height=0

第三頁:http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8&pn=40&gsm=&ct=&ic=0&lm=-1&width=0&height=0

第四頁:http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8&pn=60&gsm=&ct=&ic=0&lm=-1&width=0&height=0

通過對比我們發現第二頁pn=20, 第三頁pn=40. 好了 規律我們也拿到了

很多時候會爬取失敗 我們可以看看他的頭檔案 将其偷偷換掉,讓他以為我們是一個浏覽器。

這裡用"middleURL"中的網址

import re
import os
import requests
import uuid
def fetchImage():
local_dir = check_local_dir()
    for i in range(1,3):
    	url = "http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%E7%81%AB%E5%BD%B1%E5%BF%8D%E8%80%85%E5%A3%81%E7%BA%B8&pn={}&gsm=&ct=&ic=0&lm=-1&width=0&height=0".format(20*i)
	kv = {"user-agent": "Mizilla/5.0"}
	r = requests.get(url, headers=kv)
	rt = r.text
	result = re.findall('"middleURL":"(.*?)",', rt)
	for remote_image_url in result:
	    file_patterm = remote_image_url[-3:]
	    print(remote_image_url)
	    filename = local_dir + '\{}.{}'.format(uuid.uuid4(), file_patterm)
	    image_local(remote_image_url, filename
def check_local_dir():
    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    aim_path = os.path.join(BASE_DIR, 'OutputTupian')
    if not os.path.exists(aim_path):
        os.makedirs(aim_path)
	    return aim_path
	    
def image_local(url,filename):
    try:
        request_header = {  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',"referer":"https://image.baidu.com"}
        image = requests.get(url,headers=request_header)
        with open(filename, 'wb') as f:
        f.write(image.content)
        f.close()
        print('url 為 {} 的圖檔下載下傳完成'.format(filename))
        return True
    except Exception as e:
        print(e)
        return False
    return True

if __name__ == '__main__':
    fetchImage()
           

完成了

入門百度圖檔爬取-----火影忍者桌面爬取

有點小問題代碼是一行一行複制的

謝謝浏覽~~

繼續閱讀