python识别批量网站中的图片

需要实现的功能:给出一个网站列表,抓出这些网页上的图片。

实现方式: 下载网页源码,在源码中识别包含图片url的标签,如<img>,<div>,<li>。由于对html了解较少,哪些标签可能含有图片是从查看多个网站的源码中总结出来的。

调用的库:Selenium(加载Chrome驱动)--获取执行JS后的源码。

  threading--实现多进程

代码:

from urllib.parse import urljoin,urlparse
import os
import threading
from time import ctime
from selenium import webdriver
import re

class myThread(threading.Thread):
    def __init__(self,func,args,name=‘‘):
        threading.Thread.__init__(self)
        self.name=name
        self.func=func
        self.args=args
        self.is_end=False

    def getResult(self):
        return self.res

    def run(self):
        self.res=self.func(*self.args)

def filter_in_tag(page_file,tag):
    url_in_tag = []
    url_in_tag.append(‘------------------%s--------------------‘ % (tag))
    with open(page_file, ‘r‘, encoding=‘utf-8‘) as jj:
        for line in jj:
            ##先找出li所有标签
            reg = ‘<%s [^>]*>‘ % (tag)
            all_tag_str = re.findall(reg, line)

            for tag_str in all_tag_str:
                if re.search(‘https?://[^\‘\"\)]+‘, tag_str):
                    url_in_tag.extend(re.findall(‘http?://[^\‘\"]+‘, tag_str))
    return url_in_tag
def process(m_url):
    imgs,big_files,hrefs=[],[],[]
    ##先找出图片
    ##添加参数,使chrome不出现界面
    chrome_options = webdriver.chrome.options.Options()
    chrome_options.add_argument(‘--headless‘)
    chrome_options.add_argument(‘--disable-gpu‘)
    driver = webdriver.Chrome(r‘C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe‘,
                              chrome_options=chrome_options)  ##driver = webdriver.PhantomJS(executable_path=‘/bin/phantomjs/bin/phantomjs‘)#如果不方便配置环境变量。就使用phantomjs的绝对路径也可以

    driver.set_page_load_timeout(30)
    try:
        driver.get(m_url)
    except Exception as e: ##(HTTPError,URLError,UnicodeDecodeError,WindowsError) as e:
        err_info=‘url open error: %s\n, reason: %s\n‘%(m_url,e)
        print(err_info)
        err_log.write(err_info)
        #print(‘url open error: %s\n, reason: %s‘%(m_url,e))
        return []
    imgs = []
    imgs.append(‘------------------<img src=>-----------------‘)
    for x in driver.find_elements_by_tag_name("img"):
        imgs.append(x.get_attribute(‘src‘))

    # 找出所有div li标签中的链接
    with open(‘tmp_page_source.html‘,‘w‘,encoding=‘utf-8‘) as tmp_f:
        tmp_f.write(driver.page_source)
    for tag in (‘li‘, ‘div‘):
        imgs.extend(filter_in_tag(‘tmp_page_source.html‘,tag))

    ##列表去重复
    imgs_uniq = []
    for url in imgs:
        if (url not in imgs_uniq) and (url): ##url不在新列表中且url不为空
            imgs_uniq.append(url)

    ##查找页面中的a链接中的大文件和其它网页
    links=[a_link.get_attribute(‘href‘) for a_link in driver.find_elements_by_tag_name(‘a‘) if a_link.get_attribute(‘href‘)]
    driver.quit()

    for link in links:
        host = urlparse(m_url).netloc.split(‘@‘)[-1].split(‘:‘)[0]
        dom = ‘.‘.join(host.split(‘.‘)[-2:])
        if link.startswith(‘mailto:‘):
            continue
        if   not link.startswith(‘http‘):
            link=urljoin(m_url,link)
        f_name = urlparse(link).path.split(‘/‘)[-1]
        f_type = os.path.splitext(f_name)[1]
        if f_type not in (‘.htm‘,‘.html‘,‘shtml‘,‘‘):
            big_files.append(link)
            continue
        if link in seen_links:
            pass#print(link,‘--aleady processed,pass.‘)
        else:
            if dom not in link:
                pass#print(link,‘--not in domain,pass.‘)
            else:
                hrefs.append(link)
                seen_links.append(link)
    return imgs_uniq,big_files,hrefs

##对process处理结果进行分析,得出如下统计数据:
##图片:100,HTTP协议占比:80%,HTTP协议下各种后缀的数量:jpg-50,gif-30
##大文件:10,HTTP协议占比:100%,HTTP协议下各种后缀的数量:pdf-10

def ret_analyse(url_list):
    to_len=len(url_list)##含有3行标识信息,非url
    http_list= [url for url in url_list if url.startswith("http://")]
    http_perc=‘%.1f%%‘%(len(http_list)/to_len*100) if to_len>0 else ‘0‘
    exts_dict={}
    for url in url_list:
        if url.startswith(‘-----------‘): ##排除‘-------img:src-----’等
            continue
        f_name = urlparse(url).path.split(‘/‘)[-1]
        f_type = os.path.splitext(f_name)[1]
        if f_type not in exts_dict:
            exts_dict[f_type]=1
        else:
            exts_dict[f_type]+=1
    return to_len,http_perc,exts_dict

##对一组url调用process函数处理,并输出结果到文本
def group_proc(url_f , urls,is_analyse) :
    links=[] ##存储该页面除大文件外的a链接
    ##定义写日志的函数
    def wLog(*lines):
        for line in lines:
            try:
                url_f.write(line + ‘\n‘)
            except Exception as e:
                print(‘write eror,line:%s, err: %s‘%(line,e))
    for url in urls:
        proc_ret=process(url)
        if  proc_ret:
            img_list,bigfile_list,link_list=proc_ret
            wLog(‘*‘*40,‘from: ‘,url) # 分隔行+起始行
            if is_analyse:
                img_output=‘图片:%d,HTTP协议占比:%s,HTTP协议下各种后缀的数量:%s‘%(ret_analyse(img_list)[0]-3,ret_analyse(img_list)[1],ret_analyse(img_list)[2]) ##图片含有3行标识信息
                big_output = ‘大文件:%d,HTTP协议占比:%s,HTTP协议下各种后缀的数量:%s‘ % (ret_analyse(bigfile_list))
                wLog(img_output,big_output)
            img_list = ‘\n‘.join(img_list)
            bigfile_list = ‘\n‘.join(bigfile_list)
            wLog(‘imgs:‘,img_list,‘bigfiles: ‘,bigfile_list,‘*‘*40)

            imgs_f.write(img_list + ‘\n‘)
            if bigfile_list:
                bigfiles_f.write(bigfile_list + ‘\n‘)
            if link_list:
                links.extend(link_list)
    return links

def main(depth):
    u_file=open(‘urls.txt‘,‘r‘)
    links=[line.strip(‘\n‘) for line in u_file]
    links=[‘http://‘+link for link in links if not link.startswith(‘http‘)]
    u_file.close()

    for i in range(depth):
        is_analyse=True if i==0 else False ##对第一层数据需要分析统计
        url_f = open(‘layer‘ + str(i)+‘.txt‘,‘w‘)
        next_links=[]

        if not links:
            break
        else:
            print(‘第 %d 层开始爬取...‘%(i))
        ##将链接分配给5组
        avg=len(links)//5
        links_grp=[]
        if avg==0:
            grp_len=len(links)
            for i in range(grp_len):
                links_grp.append([links[i]])
        else:
            grp_len = 5
            links_grp=links[:avg],links[avg:avg*2],links[avg*2:avg*3],links[avg*3:avg*4],links[avg*4:]
        #for i in range(grp_len):
            #url_f.write(‘link_group %d:%s‘%(i,links_grp[i]))
       ##新建5个线程,分别处理5组url
        threads=[]
        for i in range(grp_len):
            t=myThread(group_proc,(url_f,links_grp[i],is_analyse),group_proc.__name__)
            threads.append(t)
        ##线程同时启动
        for i in range(grp_len):
            print(‘线程%d开始运行,时间:%s‘%(i,ctime()))
            threads[i].setDaemon(True)
            threads[i].start()

        ##等待线程结束,结束后将各组url中获取的外链加入到下一次处理的列表中
        for i in range(grp_len):
            threads[i].join()
            print(‘线程%d运行结束,时间:%s‘ % (i, ctime()))
            ret_links=threads[i].getResult()
            next_links.extend(ret_links)
        links=next_links
        url_f.close()

if __name__==‘__main__‘:
    seen_links = []
    imgs_f = open(‘图片.txt‘, ‘w‘,encoding=‘utf-8‘)
    bigfiles_f = open(‘大文件.txt‘, ‘w‘,encoding=‘utf-8‘)
    err_log = open(‘err_log.txt‘, ‘w‘,encoding=‘utf-8‘)
    depth=int(input(‘请输入爬取深度:‘))
    main(depth)
    err_log.close()
    imgs_f.close()
    bigfiles_f.close()
    input(‘按任意键退出...‘)

原文地址:https://www.cnblogs.com/qinfei88/p/10113951.html

时间: 2024-08-01 16:19:12

python识别批量网站中的图片的相关文章

python怎么处理html中的图片

在使用的是 Template(open(file)) 引入的 html, 在处理静态文件的时候,怎么处理图片? 可以这样: def imgFile(environ, start_response): ext = environ['PATH_INFO'].split('.') for n in ext: mime = n m = [('content-type', 'image/'+mime)] start_response('200 OK', m) image = open(os.getcwd(

Python抓取网页中的图片到本地

今天在网上找了个从网页中通过图片URL,抓取图片并保存到本地的例子: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 # Author: xixihuang 5 # Date : 2016/08/28 10:12 AM 6 # Desc: 抓取网页,获取图片URL,抓取图片内容并保存到本地. 7 8 import os 9 import uuid 10 import urllib2 11 import cookielib 12 '''获取

使用七牛云存储在网站中进行图片外链

在CSDN中写博客,如果想在文章中插入一张图片,其实是非常简单的,只要从你本机进行图片选择,然后选择上传,图片就会上传到CSDN的服务器,到时候在文章显示的时候就会读取该图片.但是如果是在自己的搭建的网站中要进行图片的显示就会遇到问题,因为图片无法从你本机读取,除非你的本机是一台服务器.所以我们要选择一个专门存储图片的服务商,同时存储的图片还能进行外链,即获得图片的URL地址,到时候就可以通过该URL访问并显示这张图片. 我推荐使用的图片存储商是七牛云存储,这是一个免费的存储空间,貌似百度云盘不

[python][爬虫]从网页中下载图片

说明:仅为测试下载图片.正则表达式 测试url为钢铁侠贴吧的一个介绍mark各代盔甲帖子 以下代码将第一页的图片全部下载到本程序根目录 #!/usr/bin/env python #! -*- coding: utf-8 -*- import urllib,urllib2 import re #返回网页源代码 def getHtml(url): html = urllib2.urlopen(url) srcCode = html.read() return srcCode def getImg(

手机网站中 限制图片宽度

<script type="text/javascript"> $(function () { var w = $(".content-co").width(); //容器宽度 $(".content-co img").each(function () {//如果有很多图片,我们可以使用each()遍历 var img_w = $(this).width(); //图片宽度 var img_h = $(this).height();

Python识别网站验证码

http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内容.入手难度大,但是入手后,可拓展性又非常广泛,可玩性极强,成就感也很足. 验证码图像处理 验证码图像识别技术主要是操作图片内的像素点,通过对图片的像素点进行一系列的操作,最后输出验证码图像内的每个字符的文本矩阵. 读取图片 图片降噪 图片切割 图像文本输出 验证字符识别 验证码内的字符识别主要以机

python下调用pytesseract识别某网站验证码

一.pytesseract介绍 1.pytesseract说明 pytesseract最新版本0.1.6,网址:https://pypi.python.org/pypi/pytesseract Python-tesseract is a wrapper for google's Tesseract-OCR( http://code.google.com/p/tesseract-ocr/ ). It is also useful as astand-alone invocation script

python爬虫20 | 小帅b教你如何使用python识别图片验证码

当你在爬取某些网站的时候 对于你的一些频繁请求 对方会阻碍你 常见的方式就是使用验证码 验证码的主要功能 就是区分你是人还是鬼(机器人) 人 想法设法的搞一些手段来对付技术 而 技术又能对付人们的想法 一来一去 就有了各种各样的变态验证码 也有了各种各样的应对方式 常见的验证码有这么几种 图像验证 语音验证 短信验证 极验验证 点击验证 今天 小帅b想跟你先说说如何识别图像验证码 那么 接下来就是 学习 python 的正确姿势 我们来看看这些图片验证码 (此图来源网络) 可以发现 这些验证码大

python爬取网站美女图片

今天周五,项目刚刚上线完,有些时间,闲着无聊,继续复习爬虫,这次打算爬取网站的美女图片.得先找到目标,然后目标网站还不会反爬虫,因为自己只是小白,好了开始. 寻找目标,发现了目标,哈哈 http://www.meizitu.com 里面图片按专题分类.先看下页面找出相关源码 页面 源码 即只要抓出来图片集的link跟图片集里面的link对应的jpg就可以了, 可以用beautifulsoup或者正则匹配,我这里用正则匹配需要的link.然后遍历整个网站就可以了 请看源码解释 #!bin/pyth