爬蟲系列(六)--爬取頁面上的影象
阿新 • • 發佈:2018-11-13
爬蟲系列(六)--爬取頁面上的影象
馬上國慶節了,要是再不寫,可能又要到了十一過後才能寫了。影象的爬取和普通頁面的爬取是一樣的,只是不需要進行轉碼,是二進位制資料,直接寫入檔案中就行了。要注意的地方就是副檔名,還有圖片檔案是否已經存在了。
1.目標簡介
下面的內容要實現的是爬取取某個指定頁面上的圖片。要是想要爬取指定區域內的圖片或者是全站圖片的話,需要結合前面的幾篇文章的內容,稍微組合一下即可。
任務分解
- 單張圖片下載:給一個圖片url,下載下來
- 提取出頁面上需要的圖片的url
2.圖片下載
這裡實現一個函式,函式需要一個url,和一個檔案路徑和名稱,把該圖片下載到本地。
from urllib import request header_dict = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Language":"zh-CN,zh;q=0.9", "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", } def download_image(load_url,file_path_name,header=None): success=True try: req = request.Request(url=load_url,headers=header)#建立請求物件 connect = request.urlopen(req)#開啟該請求 byte_res = connect.read()#讀取所有資料,很暴力 #寫入檔案 f=open(file_path_name,"wb") f.write(byte_res) f.close() except Exception as e: print(e) success=False return success #測試呼叫 url="https://bpic.588ku.com//ppt_face/20/18/09/3930044398d0f5fc45c520f6a663c39d.jpg" fp="./bbb.jpg" download_image(url, fp, header_dict)
3.獲取頁面上的所有圖片url
這個和前面某篇文章中的獲取其他頁面連結是一樣的。這裡也寫成一個函式。
from urllib import request from lxml import etree header_dict = { "Accept":"application/json, text/javascript, */*; q=0.01", "Accept-Language":"zh-CN,zh;q=0.9", "User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36", } def get_http(load_url,header=None): res="" try: req = request.Request(url=load_url,headers=header)#建立請求物件 connect = request.urlopen(req)#開啟該請求 byte_res = connect.read()#讀取所有資料,很暴力 try: res=byte_res.decode(encoding='utf-8') except: try: res=byte_res.decode(encoding='gbk') except: res="" except Exception as e: print(e) return res def get_page_images(url): html_text=get_http(url,header_dict) tree=etree.HTML(html_text) dir(tree) img_urls=tree.xpath("//img/@src") return img_urls url="https://mil.news.sina.com.cn/jssd/2018-09-30/doc-ihkmwytq0705835.shtml" urls=get_page_images(url) print(urls) #輸出:['//beacon.sina.com.cn/a.gif?noScript', '//i.sso.sina.com.cn/images/login/thumb_default.png'...]
4.組裝2和3
from urllib import request
from lxml import etree
header_dict = {
"Accept":"application/json, text/javascript, */*; q=0.01",
"Accept-Language":"zh-CN,zh;q=0.9",
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36",
}
#影象下載
def download_image(load_url,file_path_name,header=None):
success=True
try:
req = request.Request(url=load_url,headers=header)#建立請求物件
connect = request.urlopen(req)#開啟該請求
byte_res = connect.read()#讀取所有資料,很暴力
#寫入檔案
f=open(file_path_name,"wb")
f.write(byte_res)
f.close()
except Exception as e:
print(e)
success=False
return success
#頁面下載
def get_http(load_url,header=None):
res=""
try:
req = request.Request(url=load_url,headers=header)#建立請求物件
connect = request.urlopen(req)#開啟該請求
byte_res = connect.read()#讀取所有資料,很暴力
try:
res=byte_res.decode(encoding='utf-8')
except:
try:
res=byte_res.decode(encoding='gbk')
except:
res=""
except Exception as e:
print(e)
return res
#獲取全部影象url
def get_page_images(url):
html_text=get_http(url,header_dict)
tree=etree.HTML(html_text)
dir(tree)
img_urls=tree.xpath("//img/@src")
return img_urls
url="https://mil.news.sina.com.cn/jssd/2018-09-30/doc-ihkmwytq0705835.shtml"
urls=get_page_images(url)
namei=1001
for url in urls:
url="http:"+url
file_name="./img_"+str(namei)
if url.find(".jpg")>=0:
file_name+=".jpg"
elif url.find(".png")>=0:
file_name+=".png"
elif url.find(".gif")>=0:
file_name+=".gif"
elif url.find(".jpeg")>=0:
file_name+=".jpeg"
else:
print("未知圖片型別",url)
continue
state=download_image(url,file_name,header_dict)
if state:
namei+=1
else:
print("下載失敗",url)
下一篇爬蟲文章的內容暫時保密,18年國慶過後寫。