为避免尬聊,我用Python爬取了一千多张斗图!

爬取斗图吧网站并下载表情包 需求 获取斗图啦网站最新表情的信息,并下载图片到指定的文件夹。 为了提高下载速度可以使用多线程的方式操作。 获取需要用到的url 通过对网站url(https://www.doutula.com/photo/list/?page=1)的分析,可得page= 后的数字控制页数,那么就可以通过控制这个数字来获得每一页表情包的url for x in range(1,11): url = 'https://www.doutula.com/photo/list/?page=%d' % x 获取要爬取图片的 阅读详情

前几天和女神聊天的时候实在是太尬了,因为没有足够的斗图表情包,整个聊天的气氛都带动不起来,所以抑郁不得志!

为了追到心目中的完美女神,我爬了一千多张斗图表情包,只为下一次聊天的时候,主动权都在我的手上。

考虑到有些小伙伴可能在python基础不是很好,因此,啃书君决定先帮各位补补基础知识,大佬可以直接看实战内容。本次实战内容是爬取:斗图吧。

如果你不想看前面这些基础知识,可以直接拉到文章尾部的实战篇。

面向对象

python从设计开始就是一门面向对象的的语言,因此使用python创建一个类与对象是非常简单的一件事情。

如果你以前没有接触过面向对象的编程语言,那么你需要了解一些面向对象语言的一些基本特征,接下来就来感受python的面向对象语言。

面向对象简介

  • 类(Class):用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

  • 类变量:类变量在整个实例化的对象中是公共的。类变量定义在类中,且在函数体外。

  • 数据成员:类变量或实例变量,用于处理类及其实例对象的相关数据。

  • 方法重载:如果从父类继承的方法,无法满足子类的需求,可以对其进行改写,这个过程叫做覆盖,也称为方法的重载。

  • 实例变量:定义在方法中的变量,只作用于当前实例的类。

  • 继承:即一个派生类,继承基类(父类)的字段与方法。

  • 实例化:创建一个实例,类的具体对象。

  • 方法:类中定义的函数

  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

创建类与对象

类相当于一个模板,模板里面可以有多个函数,函数用于实现功能。

对象其实是根据模板创建的一个实例,通过创建的实例可以执行类中的函数。

# 创建类
class Foo(object):
    # 创建类中的函数
    def bar(self):
        # todo
        pass
 # 根据Foo类创建对象obj
 obj = Foo()
  • class是关键字,代表类

  • object代码父类,所有类都继承object类

  • 创建对象,类名称后加上括号即可

面向对象的三大特性

封装

封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。

所以,在使用面向对象的封装特性时,需要:

  • 将内容封装到某处

  • 从某处调用被封装的内容

class Foo(object):
    # 构造方法,根据类创建对象时自动执行
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
# 根据类Foo创建对象
# 自动启动Foo类的__init__方法
obj1 = Foo('Jack', 18)
obj2 = Fo('Rose', 20)

obj1 = Foo('Jack', 18)将Jack和18分别封装到obj1(self)的name和age属性中,obj2也是同样的道理。

self是一个形式参数,当执行obj1 = Foo('Jack', 18),self等于obj1,因此,每个对象都有name和age属性。

通过对象调用封装内容

class Foo(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
        
obj1 = Foo('Jack', 18)
print(obj1.name) # 调用obj1的name属性
print(obj1.age)  # 调用obj1的age属性

obj2 = Foo('Jack', 18)
print(obj2.name) # 调用obj2的name属性
print(obj2.age)  # 调用obj2的age属性

通过self间接调用封装的内容

class Foo(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def detail(self):
        print(self.name)
        print(self.age)

obj1 = Foo('Jack', 18)
obj1.detail()

obj2 = Foo('Rose', 20)
obj2.detail()

obj1.detail()python默认会将obj1传给self参数,即:obj1.detail(obj1),所以,此时方法内部的self=obj1,即self.name相当于obj1.name。

感受面向对象的简便

对于面向对象封装来说,其实就是使用构造方法将内容封装到对象中,然后通过对象直接或者self间接获取封装内容。

接下来,我们就来体验一下面向对象的简便性。

def kanchai(name, age, gender):
    print "%s,%s岁,%s,上山去砍柴" %(name, age, gender)


def qudongbei(name, age, gender):
    print "%s,%s岁,%s,开车去东北" %(name, age, gender)


def dabaojian(name, age, gender):
    print "%s,%s岁,%s,最爱大保健" %(name, age, gender)


kanchai('小明', 10, '男')
qudongbei('小明', 10, '男')
dabaojian('小明', 10, '男')


kanchai('老李', 90, '男')
qudongbei('老李', 90, '男')
dabaojian('老李', 90, '男')
函数式编程
 
class Foo(object):
    
    def __init__(self, name, age ,gender):
        self.name = name
        self.age = age
        self.gender = gender

    def kanchai(self):
        print "%s,%s岁,%s,上山去砍柴" %(self.name, self.age, self.gender)

    def qudongbei(self):
        print "%s,%s岁,%s,开车去东北" %(self.name, self.age, self.gender)

    def dabaojian(self):
        print "%s,%s岁,%s,最爱大保健" %(self.name, self.age, self.gender)


xiaoming = Foo('小明', 10, '男')
xiaoming.kanchai()
xiaoming.qudongbei()
xiaoming.dabaojian()

laoli = Foo('老李', 90, '男')
laoli.kanchai()
laoli.qudongbei()
laoli.dabaojian()

如果使用函数式编程,需要在每一个执行函数的时候都要传入相同的参数,如果参数多的话,就每一次都要复制粘贴,非常不方便;而对于面向对象来说,只需要在创建对象时,将所需要的参数封装到对象中,然后通过对象调用即可获取封装的内容。

继承

继承就是让类和类之间存在父子关系,子类可以直接访问父类的静态属性与方法。在python中,新建的类可以继承一个或多个父类,父类可以称为基类或超类,新建的类称为派生类或子类。

class ParentClass1: #定义父类1
    pass
class ParentClass2: #定义父类2
    pass
class SubClass1(ParentClass1):
    # 单继承,基类是ParentClass1,派生类是SubClass
    pass
class SubClass2(ParentClass1,ParentClass2):
    # python支持多继承,用逗号分隔开多个继承的类
    pass

print(SubClass1.__bases__)  # 查看所有继承的父类
print(SubClass2.__bases__)
# ===============
# (<class '__main__.Father1'>,)
# (<class '__main__.Father1'>, <class '__main__.Father2'>)

继承的规则

1、子类继承父类的成员变量与方法

2、子类不继承父类的构造方法

3、子类不能删除父类成员,但是可以重新定义父类成员

4、子类可以增加自己的成员。

具体代码,如下所示:

class Person(object):
 def __init__(self, name, age, sex):
  self.name = 'jasn'
  self.age = 18
  self.sex = sex

 def talk(self):
  print('I want to say someting to you')


class Chinese(Person):
 def __init__(self, name, age, sex, language):
  Person.__init__(self, name, age, sex) # 用父类的name, age, sex覆盖掉子类的属性
  self.age = age # 覆盖掉父类的age属性,取值为子类实例传入的age参数
  self.language = 'Chinese'

 def talk(self):
  print('我说的是普通话')
  Person.talk(self)


obj = Chinese('nancy', 30, 'male', '普通话')
print(obj.name)
print(obj.age)
print(obj.language)
obj.talk()

运行结果,如下:

jasn
30
Chinese
我说的是普通话
I want to say someting to you

因为,Chinese类覆盖了Person类,在开始的时候,我们将父类的属性覆盖了子类的属性,比如说name属性,子类没有去覆盖父类,因此,即使子类传来了name属性值,但依旧还是输出父类的name属性。

继承的作用

1、实现代码(功能)重用,降低代码冗余

2、增强软件的可扩充性

3、提高软件的维护性

继承与抽象的概念

面向对象的两个重要概念:抽象与分类。

class animal():   # 定义父类
    country = 'china'     # 这个叫类的变量
    def __init__(self,name,age):
        self.name = name   # 这些又叫数据属性
        self.age = age

    def walk(self):         # 类的函数,方法,动态属性
        print('%s is walking'%self.name)

    def say(self):
        pass

class people(animal): # 子类继承父类
    pass
    
class pig(animal): # 子类继承父类
    pass

class dog(animal): # 子类继承父类
    pass

aobama=people('aobama',60)   # 实例化一个对象
print(aobama.name)
aobama.walk()

上面的代码可以这样理解:我们将人、狗、猪抽象为动物,人、狗、猪都继承动物类。

python中super()的作用和原理

super()在类的继承里面非常常用,它解决了子类调用父类方法的一些问题。下面我们来看一下,它优化了什么问题。

class Foo(object):
 def bar(self, message):
  print(message)


obj1 = Foo()
obj1.bar('hello')

当存在继承关系的时候,有时候需要在子类中调用父类方法,此时最简单的方法就是把对象调用转换成类调用,需要注意的是这时self参数需要显示传递。

具体代码,如下所示:

class FooParent(object):
 """docstring for FooParent"""
 def bar(self, message):
  print(message)

class FooChild(FooParent):
 """docstring for FooChild"""
 def bar(self, message):
  FooParent.bar(self, message)



foochild = FooChild()
foochild.bar('hello')

这样的继承方式其实是存在缺陷的,比如说,我修改了父类的名称,那么子类中将要涉及多处修改。

因此python就引入了super()机制,具体代码如下所示:

class FooParent(object):
 def bar(self, message):
  print(message)


class FooChild(FooParent):
 def bar(self, message):
  super(FooChild, self).bar(message)


obj = FooChild()
obj.bar('hello')

多态

关于python多态的知识,因本次实战内容中并没有使用到,因此我就不再叙述了,小伙伴们可以自行查找资料去了解。

什么是生产者与消费者模式

比如有两个进程A与B,它们共享一个固定大小的缓冲区,A进程生产数据放入缓冲区;B进程从缓冲区取出数据进行计算,那么这里的A进程就相当于生产者,B进程相当于消费者。

为什么要使用生产者与消费者模式

在进程的世界里,生产者就是生产数据的进程,消费者就是使用(处理)数据的进程。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。同样的道理,如果生产者的处理能力大于消费者能力,那么生产者就必须等待消费者。

实现了生产者与消费者的解耦和,平衡了生产力与消费力,因为二者不能直接沟通,而是通过队列进行沟通。

生产者消费者模式

生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。

生产者与消费者不直接通信,而是通过阻塞队列进行通信,因此,生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是去阻塞队列中找数据。阻塞队列就类似于缓冲区,平衡了生产者与消费者的能力。

multiprocess-Queue实现

具体代码,如下所示:

from multiprocessing import Process, Queue
import time, random
from threading import Thread
import queue


# 生产者
def producer(name, food, q):
    for i in range(4):
        time.sleep(random.randint(1, 3))  # 模拟产生数据的时间
        f = '%s 生产了 %s %s个' % (name, food, i + 1)
        print(f)
        q.put(f)


# 消费者
def consumer(name, q):
    while True:
        food = q.get()
        if food is None:
            print('%s 获取到一个空' % name)
            break
        f = '%s 消费了 %s' % (name, food)
        print(f)
        time.sleep(random.randint(1, 3))


if __name__ == '__main__':
    q = Queue()  # 创建队列
    # 模拟生产者,产生数据
    p1 = Process(target=producer, args=('p1', '包子', q))
    p1.start()
    p2 = Process(target=producer, args=('p2', '烧饼', q))
    p2.start()

    c1 = Process(target=consumer, args=('c1', q))
    c1.start()
    c2 = Process(target=consumer, args=('c2', q))
    c2.start()

    p1.join()
    p2.join()
    q.put(None)
    q.put(None)

Thread-Queue实现

上面的代码是由多进程实现的,接下来就考虑一下多线程实现该功能。

具体代码,如下所示:

import random
import time
from threading import Thread
import queue


def producer(name, count, q):
    for i in range(count):
        food = f'{name} 生产第{i}个包子'
        print(food)
        q.put(food)


def consumer(name, q):
    while True:
        time.sleep(random.randint(1, 3))
        if q.empty():
            break
        print(f'{name} 消费了 {q.get()}')


if __name__ == '__main__':
    q = queue.Queue()
    print(q.empty())
    for i in range(1, 4):
        p = Thread(target=producer, args=(f'生产者{i}', 10, q))
        p.start()

    for i in range(1, 6):
        c = Thread(target=consumer, args=(f'消费者{i}', q))
        c.start()

生产者消费者模式特点

  • 保证生产者不会在缓冲区满的时候继续向缓冲区放入数据,而消费者也不会在缓冲区空的时候,消耗数据。

  • 当缓冲区满的时候,生产者会进入休眠状态,当下次消费者开始消耗缓冲区数据时,生产者才会被唤醒,开始往缓冲区添加数据;当缓冲区空的时候,消费者会进入休眠状态,直到生产者往缓冲区添加数据时才会被唤醒。

基础知识总结

到这里,我基本上就将本次实战需要用到的基础知识都教给大家了,相当于抛砖引玉。抛出我这块砖,引出小伙伴们的玉。本次的基础知识主要分为两大模块,第一个是面向对象的知识,第二个则是线程相关的知识,小伙伴们需要尽可能去熟悉,才能写出更加高效健壮的爬虫demo。

实战篇

工具库使用

本次爬虫所需要的工具库我先列举出来

import requests
from lxml import etree
import threading
from queue import Queue
import re

缺少哪些就自行安装。

抓取目标

本次实战所要抓取的网站是斗图吧。网址如下:

https://www.doutub.com/

我们需要抓取的内容是该网站下的斗图表情包。

瞬间让你成为斗图高手。啥也别说了,干就完事。

网页分析

定睛一看,好家伙,居然有26页的表情包,这不起飞?

首先来分析一下不同页面url的地址变化。

# 第一页
https://www.doutub.com/img_lists/new/1

# 第二页
https://www.doutub.com/img_lists/new/2

# 第三页
https://www.doutub.com/img_lists/new/3

看到这种变化的方式之后难道你不先窃喜一下。

页面url地址已经搞定,那接下来要弄清楚的就是每一张表情包的url地址了。

image-20210701200206882

这不是很容易就被聪明的你发现了吗?这些链接我们采用xpath将其提取出来即可。

生产者的实现

首先,我们先创建两个队列,一个用于存储每一页的url地址,另一个便用于存储图片链接。

具体代码,如下所示:

   # 建立队列
    page_queue = Queue()    # 页面url
    img_queue = Queue()     # 图片url
    for page in range(1, 27):
        url = f'https://www.doutub.com/img_lists/new/{page}'
        page_queue.put(url)

通过上面的代码,便将每一页的url地址放入了page_queue。

接下来再通过创建一个类,将图片url放入img_queue中。

具体代码如下所示:

class ImageParse(threading.Thread):
    def __init__(self, page_queue, img_queue):
        super(ImageParse, self).__init__()
        self.page_queue = page_queue
        self.img_queue = img_queue
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
        }

    def run(self):
        while True:
            if self.page_queue.empty():
                break
            url = self.page_queue.get()
            self.parse_img(url)

    def parse_img(self, url):
        response = requests.get(url, headers=self.headers).content.decode('utf-8')
        html = etree.HTML(response)
        img_lists = html.xpath('//div[@class="expression-list clearfix"]')
        for img_list in img_lists:
            img_urls = img_list.xpath('./div/a/img/@src')
            img_names = img_list.xpath('./div/a/span/text()')
            for img_url, img_name in zip(img_urls, img_names):
                self.img_queue.put((img_url, img_name))

消费者的实现

其实消费者很简单,我们只需要不断的从img_page中获取到图片的url链接并不停的进行访问即可。直到两个队列中有一个队列为空即可退出。

class DownLoad(threading.Thread):
    def __init__(self, page_queue, img_queue):
        super(DownLoad, self).__init__()
        self.page_queue = page_queue
        self.img_queue = img_queue
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
        }

    def run(self):
        while True:
            if self.page_queue.empty() and self.img_queue.empty():
                break
            img_url, filename = self.img_queue.get()
            fix = img_url.split('.')[-1]
            name = re.sub(r'[??.,。!!*\\/|]', '', filename)
            # print(fix)
            data = requests.get(img_url, headers=self.headers).content
            print('正在下载' + filename)
            with open('../image/' + name + '.' + fix, 'wb') as f:
                f.write(data)

最后,再让创建好的两个线程跑起来

    for x in range(5):
        t1 = ImageParse(page_queue, img_queue)
        t1.start()
        t2 = DownLoad(page_queue, img_queue)
        t2.start()
        t1.join()
        t2.join()

最后结果

一共抓取了1269张图片。

从今往后谁还能比得上你?就这?这不有爬虫就行!

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注菜鸟学Python。

左手Python,右手Java,升职就业不愁啦!

推荐阅读:入门: 最全的零基础学Python的问题  | 零基础学了8个月的Python  | 实战项目 |学Python就是这条捷径干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析 |   从万众期待到口碑扑街!唐探3令人失望  | 笑看新倚天屠龙记 | 灯谜答题王 |用Python做个海量小姐姐素描图 |碟中谍这么火,我用机器学习做个迷你推荐系统电影趣味:弹球游戏  | 九宫格  | 漂亮的花 | 两百行Python《天天酷跑》游戏!AI: 会做诗的机器人 | 给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!|  再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|年度爆款文案1).卧槽!Pdf转Word用Python轻松搞定!2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密 4).80行代码!用Python做一个哆来A梦分身 5).你必须掌握的20个python代码,短小精悍,用处无穷 6).30个Python奇淫技巧集 7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货 8).再见Python!我要学Go了!2500字深度分析!9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片点阅读原文,领AI全套资料
Python爬虫入门【12】: 斗图啦表情包多线程爬取 斗图啦表情包多线程爬取-写在前面 发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的。关键技术点 aiohttp ,你可以看一下我前面的文章,然后在学习一下。 网站就不分析了,无非就是找到规律,拼接URL,匹配关键点,然后爬取。 斗图啦表情包多线程爬取-撸代码 首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在... 阅读详情

相关推荐

多线程爬虫——图片爬取

斗图啦表情包+B站壁纸娘相册+某博客的文章头图

King 3503

map

pagewrestling themesxbox 360 gamesjetta used partscreditreportempresa nacional de telecomunicaciones s.a.homes vilonia arkansaspanera bread menuwho was leonardo da vincitortuga pirat

magicmuggle的专栏 3万+

Python网络爬虫实战1:百度新闻数据爬取

百度新闻网址:https://news.baidu.com/

简时刻的博客 1万+

GIF动图资源推荐

不管是在自媒体平台还是社交软件聊天中,GIF动图以其占用体积小,支持动画等特点广受大家欢迎,所以Relax君今天想给大家推荐一下GIF动图相关的资源。 GIF是一种使用LZW压缩,支持多张图像的容器。支持256色,透明通道为1bit。作为互联网表情包的载体,GIF这项80年代的技术依然生生不息。 图像互换格式(GIF,Graphics Interchange Format)是一种位图图形文件格...

xuedabao的博客 2万+

【python爬虫源代码】用python爬取百度搜索的搜索结果!

用python爬取百度搜索结果,字段包含:页码、标题、百度链接、真实链接、简介、网站名称。文件包含: 1、baidu_spider_0326.py 爬虫源码文件 2、爬取百度_马哥是谁_前5页.csv 爬取结果示例 - 同步讲解文章:https://zhuanlan.zhihu.com/p/479674917 同步讲解视频:https://www.zhihu.com/zvideo/1485565507402817537 - 我是【马哥python说】作者本人,全网各大技术平台,搜索即可了解我。

python采集百度搜索结果带有特定URL的链接代码实例

这篇文章主要介绍了python采集百度搜索结果带有特定URL的链接代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 #coding utf-8 import requests from bs4 import BeautifulSoup as bs import re from Queue import Queue import threading from argparse import ArgumentParser arg = ArgumentParser(description='baidu_url_collet py-scrip

送书|为避免尬聊,我竟爬取了一千多张斗图

大家好,我是啃书君。前几天和女神聊天的时候实在是太尬了,因为没有足够的斗图表情包,整个聊天的气氛都带动不起来,所以抑郁不得志!为了追到心目中的完美女神,我爬了一千多张斗图表情包,只为下一次...

tongtongjing1765的博客 1120

Python抓取百度查询结果的方法

本文实例讲述了Python抓取百度查询结果的方法。分享给大家供大家参考。具体实现方法如下: #win python 2.7.x import re,sys,urllib,codecs xh = urllib.urlopen(http://www.baidu.com/s?q1=123&rn=100).read().decode('utf-8') rc = re.compile(r'<td class=f><h3 class=t><a>.*?)</h3>',re.I) match = rc.finditer(xh) rcr = re.compile(r'<[^>

为避免尴尬,我竟爬取了两千多张斗图

大家好,我是啃书君。 前几天和女神聊天的时候实在是太尬了,因为没有足够的斗图表情包,整个聊天的气氛都带动不起来,所以抑郁不得志! 为了追到心目中的完美女神,我爬了一千多张斗图表情包,只为下一次聊天的时候,主动权都在我的手上。 考虑到有些小伙伴可能在python基础不是很好,因此,啃书君决定先帮各位补补基础知识,大佬可以直接看实战内容。本次实战内容是爬取:斗图吧。 面向对象 python从设计开始就是一门面向对象的的语言,因此使用python创建一个类与对象是非常简单的一件事情。 如果你以前没有接触过面向对象

weixin_42577686的博客 990

使用pytorch构建LSTM_AE模型的两种方式

2.基本LSTM_Unit计算——基本LSTM_AE结构 3.自定义LSTM_Unit计算——自定义LSTM_AE结构 1.LSTM-Encoder-Decoder模型结构及简要解析 图基本lstm计算单元

qq_37840762的博客 7275

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

100行代码教你爬取斗图网(Python多线程队列)

100行代码教你爬取斗图网(Python多线程队列) 前言 根据之前写的两篇文章,想必大家对多线程和队列有了一个初步的了解,今天这篇文章就来实战一下,用多线程 + 队列 爬取斗图网的全网图片。 你还在为斗图找图片而烦恼吗?快来跟我一起 happy 吧! PS:本文目的是抱以学习心态而分享,禁止用于非法以及商业途径,如有风险,一切后果自己承担! 成果演示 先来看看最后的成果: 启动程序后,可以...

melody_sy博客 1397

Vivado 2023.1及更早版本永久License全功能解锁:HLS、System Generator等IP核使用详解

本文深入解析Vivado 2023.1及更早版本的全功能许可证,详细指导如何解锁HLS、System Generator等高级IP核。通过许可证类型对比、功能验证方法和实战应用指南,帮助FPGA开发者充分利用Vivado工具套件,提升复杂系统设计和算法加速的效率。

weixin_31286719的博客 385

【Python】斗图啦表情包多线程爬取

斗图啦表情包多线程爬取-写在前面 发现好多人写爬虫都在爬取一个叫做斗图啦的网站,里面很多表情包,然后瞅了瞅,各种实现方式都有,今天我给你实现一个多线程版本的。关键技术点 aiohttp ,你可以看一下我前面的文章,然后在学习一下。 网站就不分析了,无非就是找到规律,拼接URL,匹配关键点,然后爬取。 斗图啦表情包多线程爬取-撸代码 首先快速的导入我们需要的模块,和其他文章不同,我把相同的表情都放在...

Python追梦 244

【重识云原生】第四章云网络4.9.5.1节下一代智能网卡——DPU综述

随着数据中心的高速发展,通信能力和计算能力成为数据中心基础设施的相辅相成的两个重要发展方向。若数据中心仅关注计算能力的提升,通信基础设施的提升跟不上,那么数据中心的整体系统性能依然受限,无法发挥出真正的潜力。DPU的提出背景就是应对这些数据量和复杂性的指数级增长。未来,需要将计算移至接近数据的位置,这是目前业界所公认的以数据为中心的体系结构下的创新。综上,DPU对数据中心来说,是通过更明细的分工来实现效率的提升、实现总体系统的成本最优化。...

junbaozi的专栏 1725

MIPI RFFE 信号完整性与硬件设计

MIPI RFFE信号完整性设计关键点 摘要:MIPI RFFE作为射频前端控制总线,其信号完整性设计需平衡速率、驱动能力与抗干扰性。核心挑战在于确保接收端在52Mb/s速率下保持足够的电压和时序裕量。关键设计考量包括: 驱动能力优化:过强导致过冲/振铃和射频杂散,过弱则恶化时序裕量,需与总线负载匹配。 波形质量指标:严格控制上升/下降时间(兼顾EMC和时序要求),抑制过冲/振铃幅度,管理VIO电源纹波和耦合噪声。

sinat_15150363的博客 241

python多线程url采集器 + github_100行代码教你爬取斗图网(Python多线程队列)

100行代码教你爬取斗图网(Python多线程队列)前言根据之前写的两篇文章,想必大家对多线程和队列有了一个初步的了解,今天这篇文章就来实战一下,用多线程 + 队列 爬取斗图网的全网图片。你还在为斗图找图片而烦恼吗?快来跟我一起 happy 吧!PS:本文目的是抱以学习心态而分享,禁止用于非法以及商业途径,如有风险,一切后果自己承担!成果演示先来看看最后的成果:启动程序后,可以发现目录下是同时出现...

weixin_39961369的博客 169

PCL RANSAC拟合分割圆柱体模型【2026最新版】

使用RANSAC拟合分割圆柱的原理介绍、官网示例代码实现以及一个可视化拟合出来的圆柱的具体应用案例。博客长期更新,最近一次更新时间为:2026年1月28日。

点云侠的博客 40万+

真香警告!多线程分类表情包爬取,一起斗图叭(*^▽^*)~~~

:点击上方[Python爬虫数据分析挖掘]→右上角[...]→[设为星标⭐]多线程爬取表情包有一个网站,叫做“斗图啦”,网址是:https://www.doutula.com/。这里面包...

公众号:Python研究者 489

R数据分析:潜在转化分析LTA的做法和解释(一)

之前给大家写了很多潜在类别分析的教程Mplus教程:如何做潜在类别分析LCAR数据分析:用R语言做潜类别分析LCAMplus数据分析:潜在类别分析(LCA)流程(详细版)R数据分析:再写潜在类别分析LCA的做法与解释,今天继续给大家拓展一步。 今天要介绍的就是潜在转换分析,这个东西就是LCA的纵向版本。是一个专门用来研究质变的统计技巧。有一句话叫做量变起质变,你怎么知道质变到底发生没有?就用潜在转换分析。 Latent transition analysis is an extension of...

Codewar的博客 7704

【光子AI 2026 企业级 Agent 架构指南】别再把 Skill 当 Tool:Agent Skills × MCP 企业级落地全指南(最新定义澄清 + 场景大全 + 选型决策树+安全工程清单)

摘要: 2026年企业级AI架构迎来两大核心标准——Agent Skills与MCP(Model Context Protocol),分别解决流程标准化与系统集成难题。Agent Skills通过“文件夹化能力包”(SOP+脚本+模板)固化专家流程,确保输出一致性;MCP则以类USB-C的协议统一外部系统接入,降低集成成本。两者差异显著:Skills专注程序性知识(如财报生成),MCP侧重动态连接(如跨平台数据调用)。实际场景中,复杂需求(如智能客服)需组合使用——MCP为骨架提供连接能力,Skills为大

AI天才研究院 2479

Python项目之爬取斗图网所有图片

这里选取的网址是 http://www.doutula.com 目的:爬取其中的图片 并且翻页爬取 首页图片的规则 <img src="https://ws3.sinaimg.cn/bmiddle/6af89bc8gw1f8oqmqwpjgj206o05k0ss.jpg" style="margin: 0px auto; min-he...

dengyan1183的博客 494

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

爬取斗图王图片

'''下方的库使用前需要进行安装操作 安装方法: 1.打开 cmd(命令提示符)win10系统直接打开开始菜单,然后输入cmd即可打开。 2.输入 pip install requests 以此类推,一个个安装。 下面第二行和第三行,安装 bs4 和lxml ''' import requests from bs4 import BeautifulSoup from lxml import et...

qq_37380036的博客 338

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Python爬虫爬取图片

** Python爬虫爬取网站指定图片(多个网站综合经验结论分享) ** 我想以这篇文章来记录自己学习过程以及经验感受,因为我也是个初学者。接下来我将分享几个我爬取过的图片网站,给大家们分享下自己的方法经验。嘿嘿! 我选了以下两个具有代表性的网站进行分享 网站1: 摄图网 第一步:导入需要用到的库:requests、BeautifulSoup和time import requests from bs4 import BeautifulSoup import time 第二步:伪装自己的爬虫 因为很多网站都

weixin_52136304的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

爬取小说斗破苍穹

从网上寻找小说斗破苍穹,爬取并保存。 import requests import time import re from lxml import etree from bs4 import BeautifulSoup headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.81 Safari/537.36 SE 2.X

小白的博客 388
上一篇: 周末聊聊,月入10000究竟能够超越全国多少人?
下一篇: 微软官宣 Win 11 即将到来,网友:没安卓,升个寂寞啊!
菜鸟学Python
博客等级 码龄9年 8088粉丝 571原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值