利⽤python爬⾍实现在⽬标⽹页上爬取图⽚的功能
利⽤python爬⾍实现在⽬标⽹页上爬取图⽚的功能。
爬取图⽚
要实现⽬标功能⾸先考虑的是要如何实现从⽹上爬取图⽚,通过在⽹上参考学习我选择通过引⽤python的requests和re、os模块实现爬⾍。下⾯我简单介绍⼀下引⽤这三个模块的⽬的,有兴趣深⼊了解的话⽹上都能搜到相关的详尽的⽂章。
requests是使⽤Apache2 licensed 许可证的HTTP库,⽤python编写。⽐urllib2模块更简洁。Request⽀持HTTP连接保持和连接池,⽀持使⽤cookie保持会话,⽀持⽂件上传,⽀持⾃动响应内容的编码,⽀持国际化的URL和POST数据⾃动编码,在python内置模块的基础上进⾏了⾼度的封装,从⽽使得python进⾏⽹络请求时,变得⼈性化,使⽤Requests可以轻⽽易举的完成浏览器可有的任何操作。
python 中使⽤正则表达式需要引⼊re模块,正则表达式是⽤来匹配处理字符串的 。
需要查操作⽂件,⽐如说查配置⽂件(从⽽读取配置⽂件的信息),查测试报告(从⽽发送测试报告邮件),要对⼤量⽂件和⼤量路径进⾏操作,这就依赖于os模块。
爬⾍代码
引⽤需要的的模块。
#_*_coding:utf-8_*_
import requests
import re
import os
接下来我们定义⼀个爬⾍类,⽤于从⽹页上爬取图⽚,⾸先是初始化函数。定义url(爬⾍⽬标⽹站的⽹址),从主界⾯获取⽹址字符串。headers(⽤于将python程序伪装成⼀个浏览器), 对于⼀些⽹站,如果不是从浏览器发出的请求,则得不到响应。所以,需要将爬⾍程序发出的请求伪装成浏览器。 User Agent是Http协议中的⼀部分,中⽂名叫⽤户代理,属于头域的⼀部分。在访问⽹站时通过⽤户代理向服务器提供⽤户使⽤的操作系统及版本、浏览器版本及类型、浏览器的内核等信息标识。通过改写Us-er-Agent将Python爬⾍伪装成浏览器。
dir_path(通过python⾃带的os库到该程序源⽂件存放的⽬录),path(在源⽂件⽬录下新建⼀个imgs⽂件夹⽤于存放从⽹站上爬取的图⽚),判断imgs⽂件夹是否存在,若不存在则新建⼀个imgs⽂件夹。
def__init__(self,url):
self.url = url
self.headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' }
self.dir_path = os.path.dirname(os.path.abspath(__file__))
self.path = self.dir_path+'/imgs'
isExists = ists(self.dir_path+'/imgs')
# 创建⽬录
if not isExists:
os.makedirs(self.path)
然后定义下载函数。尝试指定url,下载⽬标⽹站的图像,若下载失败则打印“下载失败”。
def download(self,url):
try:
res = (url,headers=self.headers)
return res
except Exception as E:
print(url+'下载失败,原因:'+E)
接下来定义解析函数。解码指定⽹站的内容,通过正则表达式到所有图像的⽹址并存⼊imgs_list中,最后下载imgs_list中的内容。注意将指定的⽹址填⼊字符串中。
好莱坞将拍新冠电影def parse(self,res):
content = t.decode()
# print(content)
img_list = re.findall(r'<img.*?src="(.*?)"',content,re.S)
img_list =['指定的⽹站⽹址'+url for url in img_list]
return img_list
下⾯是保存函数。如果imgs⽂件夹存在,保存通过write将下载下来的图像写⼊⽂件夹中。
佟丽娅二婚老公def save(self,res_img,file_name):
if res_img:
with open(file_name,'wb')as f:
f.write(res_im
print(url+'下载成功')
最后运⾏函数run()即依次执⾏,下载函数、解析函数和保存函数。
def run(self):
# 下载
res = self.download(self.url)
# 解析
url_list = self.parse(res)
# 下载图⽚
for url in url_list:
res_img = self.download(url)
name = url.strip().split('/').pop()
江哥刘鑫的故事file_name = self.path+'/'+name
# 保存
self.save(res_img,file_name)
下⾯附上主函数。填⼊⽬标⽹址,可以填多个到列表中。
if __name__ =='__main__':
url_list =['⽬标⽹址']
for url in url_list:
text = GetImage(url)
text.run()
这⾥附上我在⽹上到的测试⽹址,这个程序⽤这个⽹址是可以跑通的。
图形化界⾯
爬⾍代码跑通了之后考虑做⼀个界⾯可以在界⾯上输⼊要爬的⽹址,并且可以浏览爬取下来的图⽚。因为我是单独学的图形化后来与代码强⾏合并的,加上代码写得不好,有些问题,暂且把成果附上,之后可能会再从新修改。
#_*_coding:utf-8_*_
import requests开机时主机响
import re
import os
import shutil
import time
from tkinter import*#导⼊tkinter模块的所有内容
import tkinter as tk,os
from PIL import Image, ImageTk
import tkinter.scrolledtext as tst
class Application2(tk.Frame):
def__init__(self,master=None):
self.files = os.listdir(GetImage(app.link()).path)
self.index =0
self.img = ImageTk.PhotoImage(file=GetImage(app.link()).path+'\\'+self.files[self.index])
tk.Frame.__init__(self,master)
self.pack()
self.lblImage = tk.Label(self,width=800,height=600)
self.lblImage['image']= self.img
self.lblImage.pack()
self.f = tk.Frame()
self.f.pack()
self.btnPrev = tk.Button(self.f, text ='上⼀张',command = self.prev)
self.btnPrev.pack(side = tk.LEFT)
self.btnNext = tk.Button(self.f,text ='下⼀张',command = )
self.btnNext.pack(side = tk.LEFT)
def prev(self):
self.showfile(-1)
def next(self):
self.showfile(1)
def showfile(self,n):
self.index += n
if self.index <0:self.index =len(self.files)-1
if self.index >len(self.files)-1:self.index =0
self.img = ImageTk.PhotoImage(file= GetImage(app.link()).path+'\\'+self.files[self.index])
self.lblImage['image']= self.img
class Application(Frame):
def__init__(self, master=None):
Frame.__init__(self, master)
self.pack()
def createWidgets(self):
self.Label1 = Label(self, text='⽬标url')
self.Label1.pack(side = LEFT)
三国志建造self.Input = Entry(self)
self.Input.pack(side = LEFT)
self.d = Frame()
self.d.pack()
self.quitButton = Button(self.d, text='爬取', command=lambda:Insert())
self.quitButton.pack(side = LEFT)
self.lookButton = Button(self.d, text='浏览', command=lambda: MessageBox())
self.lookButton.pack(side = LEFT)
self.z = Frame()
< = tst.ScrolledText(self.z, width=50,height=20)
def link(self):
url = ()
return url
def Insert(self):
while True:
self.ScrolledText.insert(END,'www.yangqq/下载成功\n')
self.ScrolledText.update()
time.sleep(1)
class GetImage(object):
def__init__(self,url):
self.url = url
self.headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36' }
self.dir_path = os.path.dirname(os.path.abspath(__file__))
self.path = self.dir_path+'/imgs'
isExists = ists(self.dir_path+'/imgs')
# 创建⽬录
if not isExists:
def download(self,url):
try:
res = (url,headers=self.headers)
return res
except Exception as E:
print(url+'下载失败,原因:'+E)
def parse(self,res):
content = t.decode()
# print(content)
img_list = re.findall(r'<img.*?src="(.*?)"',content,re.S)
img_list =[app.link()+url for url in img_list]
return img_list
def save(self,res_img,file_name):
if res_img:
with open(file_name,'wb')as f:
f.write(res_im
print(url+'下载成功')
def run(self):
# 下载
res = self.download(self.url)
# 解析
url_list = self.parse(res)
# 下载图⽚
for url in url_list:
res_img = self.download(url)
name = url.strip().split('/').pop()
file_name = self.path+'/'+name
# 保存
self.save(res_img,file_name)
if __name__ =='__main__':
def MessageBox():
top = tk.Toplevel()
top.title('图⽚浏览')
5分钟前兰州地震了app2 = Application2(master = top)
def Remove():
path = GetImage(app.link()).path
if(ists(path)):
<(GetImage(app.link()).path+'/'+app.link().strip().split('/').pop())
def Insert():
app.quit()
time.sleep(1)
app = Application()
# 设置窗⼝标题:
app.master.title('图像爬⾍')
#设置窗⼝⼤⼩
ry("800x600")
# 主消息循环:
app.mainloop()
url_list =[app.link()]
for url in url_list:
text = GetImage(url)
text.run()
图形化界⾯我是⽤tkinter写的,其中⼀些功能我虽然写了,但没有实现,可能代码写得还是有问题,例如将爬⾍的信息实时打印到⽤户界⾯没实现。
总结
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论