设为首页 收藏本站
查看: 861|回复: 0

[经验分享] python抓取网页图片

[复制链接]

尚未签到

发表于 2015-4-21 10:17:02 | 显示全部楼层 |阅读模式
  网页的图片大致是用Image导入的,使用的是相对路径,例如




  通过匹配可以获取image/bg.jpg,与页面地址组合可以得到图片的地址
  除了直接引入的图片,还有通过CSS,HTML引入的图片,也需要处理



# -*- coding: utf-8 -*-
import urllib, httplib, urlparse
import sys
import re
def httpExists(url):
host, path = urlparse.urlsplit(url)[1:3]
if ':' in host:
# port specified, try to use it
host, port = host.split(':', 1)
try:
port = int(port)
except ValueError:
print 'invalid port number %r' % (port,)
return False
else:
# no port specified, use default port
port = None
try:
connection = httplib.HTTPConnection(host, port=port)
connection.request("HEAD", path)
resp = connection.getresponse( )
if resp.status == 200:       # normal 'found' status
found = True
elif resp.status == 302:     # recurse on temporary redirect
found = httpExists(urlparse.urljoin(url,resp.getheader('location', '')))
else:                        # everything else -> not found
print "Status %d %s : %s" % (resp.status, resp.reason, url)
found = False
except Exception, e:
print e.__class__, e, url
found = False
return found
"""根据url获取文件名"""
def gGetFileName(url):
if url==None: return None
if url=="" : return ""
arr=url.split("/")
return arr[len(arr)-1]
"""根据url下载文件,文件名参数指定"""
def gDownloadWithFilename(url,savePath,file):
#参数检查,现忽略
try:
urlopen=urllib.URLopener()
fp = urlopen.open(url)
data = fp.read()
fp.close()
print 'download file url :',url
file=open(savePath + file,'w+b')
file.write(data)
file.close()
except IOError:
print "download error!"+ url
def gDownload(url,savePath):
fileName = gGetFileName(url)
gDownloadWithFilename(url,savePath,fileName)
def getRexgList(lines,regx,searchRegx):
if lines==None : return
lists =[]
for line in lines:
ismatch = re.search(regx,line,re.IGNORECASE)
if ismatch :
matchs = re.search(searchRegx,line,re.IGNORECASE)
if matchs != None:
groups = matchs.groups()
for str in groups:
if str not in lists:
lists.append(str)
return lists
def checkLine(lines):
for line in lines :
matchs = re.search(r'url\((\S+)\)',re.IGNORECASE)
if matchs != None :
print matchs.groups()
def  getPageLines(url):
if url==None : return
if not httpExists(url): return
try:
page = urllib.urlopen(url)   
html = page.readlines()
page.close()
return html
except:
print "getPageLines() error!"
return
def getCurrentPageImage(url,savePath):
lines = getPageLines(url)
print 'lines.length',len(lines)
regxlists =  getRexgList(lines,r'src\s*="images(\S+)"',r'src\s*="(\S+)"')
if regxlists==None: return
print 'getCurrentPageImage() images.length',len(regxlists)
for jpg in regxlists:
jpg =url + jpg
gDownload(jpg,savePath)
def getCSSImages(link,savePath,url):
lines = getPageLines(link)
print 'lines.length',len(lines)
regxlists =  getRexgList(lines,r'url\((\S+)\)',r'url\((\S+)\)')
if regxlists==None: return
print 'getCurrentPageImage() images.length',len(regxlists)
for jpg in regxlists:
jpg =url + jpg
gDownload(jpg,savePath)
"""根据url获取其上的相关htm、html链接,返回list"""
def gGetHtmlLink(url):
#参数检查,现忽略
rtnList=[]
lines=getPageLines(url)
regx = r"""href="?(\S+)\.htm"""
for link in getRexgList(lines,regx,r'href="(\S+)"'):
link =url + link
if link not in rtnList:
rtnList.append(link)
print link
return rtnList
"""根据url获取其上的相关css链接,返回list"""
def gGetCSSLink(url):
#参数检查,现忽略
rtnList=[]
lines=getPageLines(url)
regx = r"""href="?(\S+)\.css"""
for link in getRexgList(lines,regx,r'href="(\S+)"'):
link = url + link
if link not in rtnList:
rtnList.append(link)
return rtnList   
def getPageImage(url,savePath):
"""getCurrentPageImage(url,savePath)"""
"""读取其他的CSS,html文件中的图片
links=gGetHtmlLink(url)
for link in links:
print u'get images on link-html读取'
getCurrentPageImage(link,savePath)"""
links=gGetCSSLink(url)
for link in links:
print 'get images on link:',link
getCSSImages(link,savePath,url)
if __name__ == '__main__':
url = 'http://www.templatemo.com/templates/templatemo_281_chrome/'
savePath = 'd:/tmp/'
print 'download pic from [' + url +']'
print 'save to [' +savePath+'] ...'
getPageImage(url,savePath)
print "download finished"
  具体使用的时候根据URL的情况,具体分析得到图片地址的方式。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-59146-1-1.html 上篇帖子: Python GUI开发环境的搭建 下篇帖子: Python标准库04 文件管理 (部分os包,shutil包)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表