準備工作
我們這裡用的是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()
完成了
有點小問題代碼是一行一行複制的
謝謝浏覽~~