iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python识别批量网站中的图片
  • 239
分享到

python识别批量网站中的图片

批量图片网站 2023-01-30 23:01:47 239人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

需要实现的功能:给出一个网站列表,抓出这些网页上的图片。 实现方式: 下载网页源码,在源码中识别包含图片url的标签,如<img>,<div>,<li>。由于对html了解较少,哪些标签可能含有图片是从

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

实现方式: 下载网页源码,在源码中识别包含图片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('按任意键退出...')
View Code

 

--结束END--

本文标题: python识别批量网站中的图片

本文链接: https://www.lsjlt.com/news/180457.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python识别批量网站中的图片
    需要实现的功能:给出一个网站列表,抓出这些网页上的图片。 实现方式: 下载网页源码,在源码中识别包含图片url的标签,如<img>,<div>,<li>。由于对html了解较少,哪些标签可能含有图片是从...
    99+
    2023-01-30
    批量 图片 网站
  • Python实现批量识别图片文字并存为Excel
    目录一、背景二、需求三、实战1.安装模块2.识别一张图片3.批量识别图片4.保存数据一、背景 大家好,我是J哥。 也许你还记得,前不久复旦大学一博士生写了130行Python代码,批...
    99+
    2024-04-02
  • python 图片识别
    安装库pip install pytesseract pip install Pillow windows安装 tesseract 中文识别下载地址:https://digi.bib.uni-mannheim.de/tesseract/运行...
    99+
    2023-01-31
    图片 python
  • 【Python • 图片识别】pytesseract快速识别提取图片中的文字
    提示:本文多图,请手机端注意流量。 文章目录 前言一、配置环境1. 安装python依赖2. 安装识别引擎安装tesseract识别引擎`(可跳过)`验证是否安装成功 二、使...
    99+
    2023-09-10
    python 开发语言
  • python 批量下载网页里的图片
    import requestsimport sys,re#设置提取图片url 的正则表达式imgre = re.compile(r"<img id=\"imgis\" src='(.*)'")#存放找到的 图片url的列表all_i...
    99+
    2023-01-31
    批量 下载网页 图片
  • Python如何实现批量识别图片文字并存为Excel
    今天小编给大家分享一下Python如何实现批量识别图片文字并存为Excel的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、...
    99+
    2023-07-02
  • python 3.7 识别图片
    为了把百度文档的内容弄下来,就弄了一下这个 基本环境操作系统:win7 64位系统 python版本:3.7 2.安装配套环境2.1 首先安装OCR字符识别库Tesseract 下载网址:https://digi.bib.uni-...
    99+
    2023-01-31
    图片 python
  • python利用pytesseract快速识别提取图片中的文字((图片识别)
    目录前言一、配置环境1. 安装python依赖2. 安装识别引擎二、使用步骤1.引入库2.提取图片文字3.运行效果总结 提示:本文多图,请手机端注意流量。 前言 利用python做图...
    99+
    2022-11-13
    python pytesseract识别图片文字 python pytesseract提取图片文字 python pytesseract图片中文字
  • Python中怎么批量处理图片
    Python中怎么批量处理图片,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.Pillow库介绍Pillow是Python里的图像处理库,提供了了广泛的文件格式支持,强大...
    99+
    2023-06-02
  • 怎么利用Python批量爬取网页图片
    你可以使用Python的requests库来发起HTTP请求,并使用BeautifulSoup库来解析HTML文档以获取图片的URL...
    99+
    2023-09-27
    Python
  • Java中怎么批量下载网络图片
    这篇文章将为大家详细讲解有关Java中怎么批量下载网络图片,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。先来看下Json数据格式:为了方便操作,我封装了一个数据实体类package ...
    99+
    2023-06-17
  • win10如何批量下载网页中图片
    本篇内容介绍了“win10如何批量下载网页中图片”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先要在电脑上安装迅雷打开电脑,打开自带的Ed...
    99+
    2023-07-01
  • python实现图片批量压缩
    目录第一种 一:安装包二:导入包三:获取图片文件的大小四:输出文件夹下的文件五:压缩文件到指定大小,我期望的是150KB,step和quality可以修改到最合适的数值六:...
    99+
    2024-04-02
  • 使用Python批量拼接图片
    前言 当需要将多张图像拼接成一张更大的图像时,通常会用到图片拼接技术。这种技术在许多领域中都有广泛的应用,例如计算机视觉、图像处理、卫星图像、地理信息系统等等。在实际应用中,拼接图像可以用于创建全景图像、地图、海报、广告牌等等。 本文将使用...
    99+
    2023-09-28
    python 图像处理
  • Python 批量下载图片示例
        使用Python find函数和urllib下载图片。A:#!/usr/bin/env python import time import urllib i = 0 url = ['']*10 name = ['']*10 con ...
    99+
    2023-01-31
    示例 批量 下载图片
  • 如何利用Python识别图片中的文字
    这篇文章将为大家详细讲解有关如何利用Python识别图片中的文字,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、Tesseract文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字...
    99+
    2023-06-15
  • 用python爬取某个图片网站的图片
    爬取单张图片 # 爬取单张图片import requests # 导入requests库url = "https://file.lsjlt.com/upload/f/202309/12/54vwhbwy2re.jpg" # 图片地址re...
    99+
    2023-09-12
    python 爬虫
  • 通过Python的pytesseract库识别图片中的文字
    文章目录 前言一、pytesseract1.pytesseract是什么?2.安装pytesseract3.查看pytesseract版本4.安装PIL5.查看PIL版本 二、Tesser...
    99+
    2023-09-12
    python 人工智能 计算机视觉 图像处理
  • python实现pptx批量向PPT中插入图片
    目录项目背景基础加亿点点细节最终代码项目结果图总结项目背景 实验结果拍摄了一组图片,数量较大,想要按顺序组合排版,比较简单的方式是在PPT中插入图片进行排版。但是PPT批量插入图片后...
    99+
    2024-04-02
  • Python批量裁剪图片的思路详解
    目录需求思路程序测试需求 我的需求是批量裁剪某一文件夹下的所有图片,并指定裁剪宽高。 思路 1、 先使用PIL.Image.size获取输入图片的宽高。2、宽高除以2得到中心点坐标3...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作