精华内容
下载资源
问答
  • 20 行代码,变身技术圈多肉小达人 ...熊孩子说“你没看过奥特曼”,赶紧用 Python 学习一下,没想到 技术圈的【多肉小达人】,一篇文章你就能做到 用 Python 爬取 100G Cosers 图片 本篇博客目标 爬取目标 目标数据源:...

    20 行代码,变身技术圈多肉小达人

    Python 爬虫 120 例,已完成文章清单

    1. 10 行代码集 2000 张美女图,Python 爬虫 120 例,再上征途
    2. 通过 Python 爬虫,发现 60%女装大佬游走在 cosplay 领域
    3. Python 千猫图,简单技术满足你的收集控
    4. 熊孩子说“你没看过奥特曼”,赶紧用 Python 学习一下,没想到
    5. 技术圈的【多肉小达人】,一篇文章你就能做到

    用 Python 爬取 100G Cosers 图片

    本篇博客目标

    爬取目标

    为了防止网站被消失,我用Python连夜离线了100G图片

    使用的 Python 模块

    • requests,re,os

    重点学习内容

    • 今日的重点学习,可放在详情页分页抓取上,该技巧在之前的博客中没有涉及,编写代码过程中重点照顾一下。

    列表页与详情页分析

    通过开发者工具,可以便捷的分析出目标数据所在的标签。

    为了防止网站被消失,我用Python连夜离线了100G图片
    点击任意图片,进入详情页,得到目标图片为单页展示,即每页展示一张图片。

    <a href="javascript:dPlayNext();" id="infoss">
      <img
        src="/uploads/allimg/210601/112879-210601143204.jpg"
        id="bigimg"
        width="800"
        alt=""
        border="0"
    /></a>
    

    同时获取列表页与详情页 URL 生成规则如下:

    列表页

    • http://www.cosplay8.com/pic/chinacos/list_22_1.html
    • http://www.cosplay8.com/pic/chinacos/list_22_2.html
    • http://www.cosplay8.com/pic/chinacos/list_22_3.html

    详情页

    • http://www.cosplay8.com/pic/chinacos/2021/0601/61823.html
    • http://www.cosplay8.com/pic/chinacos/2021/0601/61823_2.html
    • http://www.cosplay8.com/pic/chinacos/2021/0601/61823_3.html

    注意详情页首页无序号 1,顾爬取获取总页码的同时,需存储首页图片。

    编码时间

    目标网站对图片进行了分类,即 国内 cos国外 cos汉服圈Lolita,因此在爬取时可以对其进行动态输入,即爬取目标源自定义。

    
    def run(category, start, end):
        # 生成待爬取的列表页
        wait_url = [
            f"http://www.cosplay8.com/pic/chinacos/list_{category}_{i}.html" for i in range(int(start), int(end)+1)]
        print(wait_url)
    
        url_list = []
        for item in wait_url:
        	# get_list 函数在后文提供
            ret = get_list(item)
    
            print(f"已经抓取:{len(ret)} 条数据")
            url_list.extend(ret)
    
    
    if __name__ == "__main__":
    
        # http://www.cosplay8.com/pic/chinacos/list_22_2.html
        category = input("请输入分类编号:")
        start = input("请输入起始页:")
        end = input("请输入结束页:")
        run(category, start, end)
    

    上述代码首先基于用户的输入,生成目标网址,然后将目标网址一次传递到 get_list 函数中,该函数代码如下:

    def get_list(url):
        """
        获取全部详情页链接
        """
        all_list = []
    
        res = requests.get(url, headers=headers)
        html = res.text
        pattern = re.compile('<li><a href="(.*?)">')
        all_list = pattern.findall(html)
    
        return all_list
    
    

    通过正则表达式 <li><a href="(.*?)"> 匹配列表页中所有详情页地址,并将其进行整体返回。

    run 函数中继续增加代码,获取详情页图片素材,并对抓取到的图片进行保存。

    def run(category, start, end):
        # 待爬取的列表页
        wait_url = [
            f"http://www.cosplay8.com/pic/chinacos/list_{category}_{i}.html" for i in range(int(start), int(end)+1)]
        print(wait_url)
    
        url_list = []
        for item in wait_url:
            ret = get_list(item)
    
            print(f"已经抓取:{len(ret)} 条数据")
            url_list.extend(ret)
    
        print(url_list)
        # print(len(url_list))
        for url in url_list:
            get_detail(f"http://www.cosplay8.com{url}")
    

    由于匹配到的详情页地址为相对地址,顾对地址进行格式化操作,生成完整地址。
    get_detail 函数代码如下:

    def get_detail(url):
    	# 请求详情页数据
        res = requests.get(url=url, headers=headers)
        # 设置编码
        res.encoding = "utf-8"
        # 得到网页源码
        html = res.text
    
        # 拆解页码,保存第一张图片
        size_pattern = re.compile('<span>共(\d+)页: </span>')
        # 获取标题,后续发现发表存在差异,顾正则表达式有修改
        # title_pattern = re.compile('<title>(.*?)-Cosplay中国</title>')
        title_pattern = re.compile('<title>(.*?)-Cosplay(中国|8)</title>')
        # 设置图片正则表达式
        first_img_pattern = re.compile("<img src='(.*?)' id='bigimg'")
        try:
        	# 尝试匹配页码
            page_size = size_pattern.search(html).group(1)
            # 尝试匹配标题
            title = title_pattern.search(html).group(1)
            # 尝试匹配地址
            first_img = first_img_pattern.search(html).group(1)
    
            print(f"URL对应的数据为{page_size}页", title, first_img)
            # 生成路径
            path = f'images/{title}'
            # 路径判断
            if not os.path.exists(path):
                os.makedirs(path)
    
            # 请求第一张图片
            save_img(path, title, first_img, 1)
    
            # 请求更多图片
            urls = [f"{url[0:url.rindex('.')]}_{i}.html" for i in range(2, int(page_size)+1)]
    
            for index, child_url in enumerate(urls):
                try:
                    res = requests.get(url=child_url, headers=headers)
    
                    html = res.text
                    first_img_pattern = re.compile("<img src='(.*?)' id='bigimg'")
                    first_img = first_img_pattern.search(html).group(1)
    
                    save_img(path, title, first_img, index)
                except Exception as e:
                    print("抓取子页", e)
    
        except Exception as e:
            print(url, e)
    

    上述代码核心逻辑已经编写到注释中,重点在 title 正则匹配部分,初始编写正则表达式如下:

    <title>(.*?)-Cosplay中国</title>
    

    后续发现不能全部匹配成功,修改为如下内容:

    <title>(.*?)-Cosplay(中国|8)</title>
    

    ,缺少的 save_img 函数代码如下:

    def save_img(path, title, first_img, index):
        try:
            # 请求图片
            img_res = requests.get(f"http://www.cosplay8.com{first_img}", headers=headers)
            img_data = img_res.content
    
            with open(f"{path}/{title}_{index}.png", "wb+") as f:
                f.write(img_data)
        except Exception as e:
            print(e)
    

    为了防止网站被消失,我用Python连夜离线了100G图片

    完整代码下载地址:https://codechina.csdn.net/hihell/python120,No6。

    代码编写过程中,顺手爬取了一堆图片,可以提前预览一波,看看图,在决定是否运行这段代码。

    抽奖时间

    只要评论数过 100
    随机抽取一名幸运读者
    奖励 29.9 元《Python 游戏世界》 1 折购买券一份,只需 2.99 元

    今天是持续写作的第 166 / 200 天。可以点赞、评论、收藏啦。

    展开全文
  • g &gt;标签 容器标签 分组标签-&gt; 只能用于所有形状的特性属性 比如stroke,stroke-width等 cx,cy只能用于圆,所以不起作用-&gt; 解决方法:用transform解决 transform='translate(200,200)' , 取代cx...
    1. < g >标签  容器标签 分组标签
    

    -> 只能用于所有形状的特性属性 比如stroke,stroke-width等 cx,cy只能用于圆,所以不起作用
    -> 解决方法:用transform解决 transform='translate(200,200)' , 取代cx,cy移动到指定坐标


    < circle cx='200' cy='200' r='40' fill='transparent' stroke='brown' stroke-width='5'></circle>
    < circle cx='200' cy='200' r='30' fill='transparent' stroke='purple' stroke-width='5'></circle>
    < circle cx='200' cy='200' r='20' fill='transparent' stroke='pink' stroke-width='5'></circle>
    < circle cx='200' cy='200' r='10' fill='transparent' stroke='red' stroke-width='5'></circle>





    2. 用了< g > 标签之后:
    <g transform='translate(200,200)' stroke-width='6' stroke='black'>
    <circle r='40' fill='transparent' stroke='brown' ></circle>
    <circle r='30' fill='transparent' stroke='purple' ></circle>
    <circle r='20' fill='transparent' stroke='pink' ></circle>
    <circle r='10' fill='transparent' stroke='red' ></circle>
    </g>


    3. < text > 标签 在svg中添加文本

    属性 : x , y , text-anchor('middle','start','end')


    4. < g > 标签 分组操作 结合图形和文字 设置共同样式

    < g style='cursor:pointer;'>
    < circle transform='translate(200,200)' r='50' fill='transparent' stroke='red' stroke-width='5' >< /circle>
    < text x='200' y='208' text-anchor='middle' font-size='20' >自由舰< /text>
    < /g>




    5.  < image > 标签 在svg中添加图片

    属性:x , y , width , height , xlink:href

    < g > 标签 分组操作 结合图片和图片以及文字 
    < g style='cursor:pointer;'>
    <image x='150' y='149' width='100' height='103' xlink:href='./img/main.png' >< /image>
    <text x='200' y='208' text-anchor='middle' font-size='20' >自由舰< /text>
    < /g>







    展开全文
  • 图片(几个G)的读取

    千次阅读 2016-06-12 12:42:58
    1、下载openslide 2、我用的版本是3.4.1,然后进行build 3、软件环境需求:zlib, libpng, libjpeg, libtiff, OpenJPEG 1.x or >= 2.1,GDK-PixBuf, libxml2, SQLite >= 3.6.20, cairo >...

    1、下载openslide

    2、我用的版本是3.4.1,然后进行build

    3、软件环境需求:zlib, libpng, libjpeg, libtiff, OpenJPEG 1.x or >= 2.1,GDK-PixBuf, libxml2, SQLite >= 3.6.20, cairo >= 1.2, and glib >= 2.16,其中有两个库不太好装。

    sudo dpkg --purge --force-depends libsqlite3-0
    sudo apt-get install libsqlite3-0
    sudo apt-get install -f
    sudo apt-get install libsqlite3-dev
    

    解决:

    sudo apt-get install libopenjpeg-dev libsqlite3-dev
    sudo apt-get install openslide-tools
    sudo apt-get install python-openslide
    sudo apt-get install python3-openslide

    4、进入到openslide下面

    ./configure
    make
    make install
    

    5、测试

    import openslide
    import numpy
    import matplotlib.pyplot as plt
    
    slide = openslide.open_slide("/xxx.tif")
    ds = slide.level_downsamples
    for i in xrange(slide.level_count):
        size = int(4096*(ds[0]/ds[i]))
        tile = numpy.array(slide.read_region((300,1100), i, (size,size) ))
        plt.figure()
        plt.imshow(tile)
    plt.show()

    window下面找不到DLL的话(亲测有效):

    os.environ['PATH'] = "path-to-openslide-bin" + ";" + os.environ['PATH']。

    推荐一篇博客:

    https://blog.csdn.net/weixin_41594007/article/details/81810231

    展开全文
  • 使用OpenCV分别提取一张图片的R、G、B分量然后显示出来: [cpp] view plain copy #include "opencv/cv.h"  #include "opencv/highgui.h"    int main(int argc,char** argv)  {   IplImage...

    使用OpenCV分别提取一张图片的R、G、B分量然后显示出来:

    [cpp]  view plain  copy
    1. #include "opencv/cv.h"  
    2. #include "opencv/highgui.h"  
    3.   
    4. int main(int argc,char** argv)  
    5. {  
    6.     IplImage* src = cvLoadImage(argv[1]);//载入图像  
    7.       
    8.     //Allocate individual image planes  
    9.     IplImage* channel_r = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
    10.     IplImage*  channel_g = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
    11.     IplImage*  channel_b = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
    12.     IplImage* img_r = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);  
    13.     IplImage* img_g = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);  
    14.     IplImage* img_b = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,3);  
    15.       
    16.     cvSplit(src, channel_b, channel_g, channel_r,NULL);  
    17.     cvMerge(channel_b,0,0,0,img_b);  
    18.     cvMerge(0,channel_g,0,0,img_g);  
    19.     cvMerge(0,0,channel_r,0,img_r);  
    20.      
    21.     cvNamedWindow("src",0);  
    22.     cvNamedWindow("Image_B",0);  
    23.     cvNamedWindow("Image_G",0);  
    24.     cvNamedWindow("Image_R",0);  
    25.       
    26.     cvShowImage( "src", src);  
    27.     cvShowImage( "Image_B",  img_b);  
    28.     cvShowImage( "Image_G",  img_g);  
    29.     cvShowImage( "Image_R",  img_r);  
    30.      
    31.    while(1){  
    32.         if((cvWaitKey(10)&0x7f) == 27)break;  
    33.     }  
    34.       
    35.     cvReleaseImage(&src);  
    36.     cvReleaseImage(&channel_r);  
    37.     cvReleaseImage(&channel_g);  
    38.     cvReleaseImage(&channel_b);  
    39.     cvReleaseImage(&img_r);  
    40.     cvReleaseImage(&img_g);  
    41.     cvReleaseImage(&img_b);  
    42.         
    43.     cvDestroyWindow("src");  
    44.     cvDestroyWindow("Image_R");  
    45.     cvDestroyWindow("Image_G");  
    46.     cvDestroyWindow("Image_B");  
    47.       
    48.     return 0;  
    49. }  

    Split
    分割多通道数组成几个单通道数组或者从数组中提取一个通道void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 );#define cvCvtPixToPlane cvSplit
    src
    原数组.
    dst0...dst3
    目标通道函数 cvSplit 分割多通道数组成分离的单通道数组 d。可获得两种操作模式 . 如果原数组有 N 通道且前 N 输出数组非 NULL, 所有的通道都会被从原数组中提取,如果前 N个通道只有一个通道非 NULL 函数只提取该指定通道,否则会产生一个错误,余下的通道(超过前 N 个通道的以上的)必须被设置成 NULL,对于设置了 COI 的 IplImage 结使用 cvCopy 也可以从图像中提取单通道。


    CreateImage
    创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, int channels );
    size
    图像宽、高.
    depth
    图像元素的位深度,可以是下面的其中之一:
    IPL_DEPTH_8U - 无符号 位整型
    IPL_DEPTH_8S - 有符号 位整型
    IPL_DEPTH_16U - 无符号 16 位整型
    IPL_DEPTH_16S - 有符号 16 位整型
    IPL_DEPTH_32S - 有符号 32 位整型
    IPL_DEPTH_32F - 单精度浮点数
    IPL_DEPTH_64F - 双精度浮点数
    channels
    每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据
    排列是:
    b0 g0 r0 b1 g1 r1 ...
    虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些 OpenCV 也能处理他但是
    这个函数只能创建交叉存取图像.函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式header = cvCreateImageHeader(size,depth,channels);cvCreateData(header);


    Merge
    从几个单通道数组组合多通道数组或插入一个单通到数组void cvMerge( const CvArr* src0, const CvArr* src1,const CvArr* src2, const CvArr* src3, CvArr* dst );#define cvCvtPlaneToPix cvMerge
    src0... src3
    输入的通道.
    dst
    输出数组.函数 cvMerge 是前一个函数的反向操作。如果输出数组有 N 个通道并且前 N 个输入通道非 NULL,就拷贝所有通道到输出数组,如果在前 N 个通道中只有一个单通道非 NULL ,只拷贝这个通道到输出数组,否则 就会产生错误。除前 N 通道以外的余下的通道必须置 NULL。对于设置了 COI 的 IplImage 结构使用 cvCopy 也可以实现向图像中插入一个通道



    效果如下:


    展开全文
  • LSTM公式及理解

    万次阅读 多人点赞 2019-01-25 22:34:22
    图片来自 Understanding LSTM Networks ,(丑的要死的)红色字体是贫僧加的。 注意图中 hidden state (短期记忆)和 cell state (长期记忆)的传递,以及输出其实就是 h t h_t h t ​ 。 然后就是LSTM的计算...
  • 位图转换G代码小程序

    千次阅读 热门讨论 2019-11-15 09:15:46
    位图转G代码轮廓加工轨迹程序I2G(img2gcode) 背景 最近实验室要用机器人写字画图,但流程都是利用已有的软件去生成g代码,心中不仅冒出个想法,其实可以利用opencv的二值处理和轮廓提取来直接获得轨迹坐标,然后生成...
  • #读取图片 返回图片某像素点的b,g,r值 import cv2 import numpy as np img=cv2.imread('./o.jpg') px=img[10,10] print px blue=img[10,10,0] print blue green=img[10,10,1] print blue red=img[10,10,2] print ...
  • 1G2G3G4G5G技术简述

    千次阅读 2020-02-04 11:20:52
    1G仅限语音(模拟)的蜂窝电话标准 2G以数字语音为核心 3G图形,音频,视频等信息服务 4G快速传输数据,下载速度达到100Mbit/s或者更高 5G极速传输数据,下载速度达到10Gbit/s或者更高 ...
  • HOG

    千次阅读 2018-06-07 19:16:14
    G=\sqrt{G_x^2+G_y^2} ,梯度方向 θ = a r c t a n ( G y G x ) θ = a r c t a n ( G y G x ) \theta=arctan(\frac{G_y}{G_x}) 对cell内的梯度方向依据梯度幅值进行权重投影 一张图片有多个block组成,而...
  • 关于java后台图片的前端显示

    千次阅读 2018-10-10 10:50:56
    一,前端的图片显示都是读取数据流后在前端显示的,一般我们通过地址 找到图片文件然后读取,在前端读取的依然还是数据流 。所以我们直接返回图片数据流给前端也是能够解析显示的。当我们要对后台的图片进行一些...
  • 从上一篇文章《Android屏幕适配全攻略》写完之后,经常会有朋友问我这个问题:“能不能一个App只提供一套切图适应所有的分辨率呢?...本篇内容主要探讨以下场景:同一张图片,放置在不同的drawable文件夹,在同一设备上
  • 方法一: 找到picgo设置的设置server 然后关闭,再重开启一下 方法二: 重启PicGo
  • 商品图片,用户上传的头像,其他方面的图片。目前业界存储图片有两种做法: 1、 把图片直接以二进制形式存储在数据库中 一般数据库提供一个二进制字段来存储二进制数据。比如mysql中有个blob字段。oracle数据库中...
  • 本人刚开始学习OpenCV3,主要是跟着毛星云老师的...——————————————————————————————————————————关于OpenCV3中读入图片后,显示为灰色的问题环境:OpenCV 3.4.1 +...
  • 如图,我的电脑有两个内存条一共4g内存,但是任务管理器显示,只有1.6g可用,我的系统是win864位的,华硕笔记本参数如图2,有那位同仁解决过此类问题啊?![图片]...
  • 关于 ARGB_8888 的介绍,网上基本都是只说明 ARGB_8888 格式每个像素占 4 个字节,每个通道(A:alpha,R:red,G:green,B:blue)有 8 位,可以表示 0-255 个值。 但是,你是否知道它内部每个通道的排列顺序吗?是 ...
  • Qt中添加资源图片方法g

    千次阅读 2016-12-16 09:00:30
    第二步:添加图片,先将图片文件夹Image放到与资源文件myInage.qrc同级目录下。回到Qt设计界面,点击“添加”按钮,选择“添加前缀”,将属性栏中前缀改为“/myImage”,选择添加按钮,弹出的对话框中选择图片文件夹...
  • vue

    千次阅读 2018-01-14 12:57:54
    npm install -g vue-cli vue init webpack sell (vue build选简化版,vuejs的大小可以减小6kb,依赖.vue文件开发) cd sell npm install npm run dev 如有需要 npm install less less-loader –save-dev 》...
  • 关于SpringBoot上传图片的几种方式

    万次阅读 多人点赞 2018-01-04 15:14:39
    网站上传图片、文件等,最常见的就是直接上传到服务器的webapp目录下,或者直接上传服务的一个指定的文件夹下面。这种方式对于简单的单机应用确实是很方便、简单,出现的问题也会比较少。但是对于分布式项目,直接...
  • Zxing系列之图片添加二维码水印教程

    千次阅读 多人点赞 2019-06-14 11:50:20
    继之前博客PDF添加二维码水印教程:https://smilenicky.blog.csdn.net/article/details/91655064, 本博客介绍一下用jdk awt实现图片加文字水印和图片水印的方法
  • opencv cv2.imread()

    万次阅读 多人点赞 2019-07-12 10:20:30
    cv2.imread()用于读取图片文件 imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形式,有三种: cv2.IMREAD_COLOR:加载彩色图片,这个是默认参数,可以直接写1。 cv2.IMREAD_GRAYSCALE:以...
  • 第五章-Linux实操篇

    千次阅读 多人点赞 2019-10-24 18:45:20
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lyo2GTlL-1571913902523)(/pic/4-1569569340608.png)] 8.5.2 细节说明 当用户不存在,返回无此用户 8.6 切换用户 8.6.1 基本语法 ...
  • 关于CTF中的一些图片隐写

    千次阅读 2020-01-26 19:39:39
    CTF中图片隐藏文件分离方法总结 前言 可以使用winhex之类的工具先行分析其是否为图片,可以看其头部信息,还有就是JPG图片有一个特性最后的应用数据块为FF E0 活着直接使用binwalk看看图片下有什么鬼玩意儿的。 ...
  • 图片的平均亮度

    千次阅读 2018-07-24 15:09:51
    图像相关开发中,有时我们需要知道和了解图片的 亮度 这一信息,例如判断图片是否曝光严重过度或者太黑什么都看不清。 那么怎么去获取到图片的 平均亮度 这一信息呢? 一、YUV 图片 一般相机的原始数据类型就是...
  • 相似图片搜索算法介绍

    万次阅读 2017-08-21 15:16:14
    相似图片搜索算法介绍
  • 在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢?   下面说一下我的实现过程(只是个人实现思路,实际网站怎...
  • 吉他G大调和弦总结

    千次阅读 2019-08-26 21:59:08
    一.G调常用和弦指法图 B7和弦 B7和弦同样也是G调中常用的和弦之一,比较熟悉的G调歌曲 唐磊-...以上三种为常见的Em和弦和弦图,图片上稍微有点差别不过是大同小异。 Em和弦的按法:2—中指按5弦2品、3—无名指按4弦...
  • 使用canvas在前端实现图片合成

    万次阅读 2018-02-26 09:56:50
    看着总结的不错,我也就拿来主义了,做个记录,侵权必删图片合成最常见的需求有验证码图片,亦或者图片加水印等,这种实现一般都是后端实现的。随着HTML5发展和现代浏览器的占比越来越高,我们其实也可以在前端直接...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 422,429
精华内容 168,971
关键字:

关于g的图片