爬虫系列(六)--爬取页面上的图像
马上国庆节了,要是再不写,可能又要到了十一过后才能写了。图像的爬取和普通页面的爬取是一样的,只是不需要进行转码,是二进制数据,直接写入文件中就行了。要注意的地方就是文件扩展名,还有图片文件是否已经存在了。
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年国庆过后写。