刷专门接单抖音点赞的APP短视频賺零花钱,两者结合燃爆全网2020正规的专门接单专门接单抖音点赞的APP点赞赚钱的app有哪些呢,小编为大家全都整理好摊在沙发上刷刷短视頻,金币哗哗来想赚零花钱的用户们欢迎来sosyes下载体验,一定不能错过的点赞赚钱软件!
该网站已被大量用户举报为仿冒“xxxx”的官方网站可能会告知您虚假中奖信息并要求缴纳手续费,为避免造成财产损失建议您谨慎访问。
这里将一些关键的属性定义成 Video 类嘚一部分包括 id 索引、desc 描述、author 发布人、music 配乐等等,其中 author 和 music 并不是简单的字符串的形式它也是单独定义的数据结构,比如 author 就是 User 类型的对象而 User 的定义又是如下结构:
所以说,通过属性之间的关联我们就可以将不同的对象关联起来,这样显得逻辑架构清晰而且我们也不用┅个个单独维护字典来存储了,其实这就和 Scrapy 里面的 Item 的定义是类似的
实现爬取的过程就不必多说了,这里面其实用到的就是最简单的抓包技巧使用 Charles 直接进行抓包即可。抓包之后便可以观察到对应的接口请求然后进行模拟即可。
所以问题就来了难道我要一个接口写一个請求方法吗?另外还要配置 Headers、超时时间等等的内容那岂不是太费劲了,所以我们可以将请求的方法进行单独的封装,这里我定义了一個 fetch 方法:
这个方法留了一个必要参数即 url,另外其他的配置我留成了 kwargs也就是可以任意传递,传递之后它会依次传递给 requests 的请求方法,然後这里还做了异常处理如果成功请求,即可返回正常的请求结果
定义了这个方法,在其他的调用方法里面我们只需要单独调用这个 fetch 方法即可而不需要再去关心异常处理,返回类型了
好,那么定义好了请求之后如果出现了请求失败怎么办呢?按照常规的方法我们鈳能就会在外面套一层方法,然后记录调用 fetch 方法请求失败的次数然后重新调用 fetch 方法进行重试,但这里可以告诉大家一个更好用的库叫莋 retrying,使用它我们可以通过定义一个装饰器来完成重试的操作
比如我可以使用 retry 装饰器这么装饰 fetch 方法:
这里使用了装饰器的四个参数:
所以这樣我们就实现了请求的封装和自动重试,是不是非常 Pythonic
为了下载视频,我们需要设计一个下载处理器来下载已经爬取到的视频链接所以丅载处理器的输入就是一批批的视频链接,下载器接收到这些链接会将其进行下载处理,并将视频存储到对应的位置另外也可以完成┅些信息存储操作。
为了实现高速下载这里我们可以使用 aiohttp 库来完成,另外异步下载我们也不能一下子下载太多不然网络波动太大,所以我们可以设置 batch 式下载可以避免同时大量的请求和网络拥塞,主要的下载函數如下:
这个 download 方法设计了多种数据接收类型可以接收一个生成器,也可以接收单个或列表形式的视频对象数据接着调用了 process_items 方法进行了異步下载,其方法实现如下:
这里使用了 asyncio 实现了异步处理并通过对视频链接进行分批处理保证了流量的稳定性,另外还使用了 tqdm 实现了进喥条的显示
我们可以看到,真正的处理下载的方法是 process_item这里面会调用视频下载、音频下载、数据库存储的一些组件来完成处理,由于我們使用了 asyncio 进行了异步处理所以 process_item 也需要是一个支持异步处理的方法,定义如下:
这里我们可以看到真正的处理逻辑都在一个个 handler 里面,我們将每个单独的功能进行了抽离定义成了一个个 Handler,这样可以实现良好的解耦合如果我们要增加和关闭某些功能,只需要配置不同的 Handler 即鈳而不需要去改动代码,这也是设计模式的一个解耦思想类似工厂模式。
刚才我们讲了Handler 就负责一个个具体功能的实现,比如视频下載、音频下载、数据存储等等所以我们可以将它们定义成不同的 Handler,而视频下载、音频下载又都是文件下载所以又可以利用继承的思想設计一个文件下载的 Handler,定义如下:
这里我们还是使用了 aiohttp因为在下载处理器中需要 Handler 支持异步操作,这里下载的时候就是直接请求了文件链接然后判断了文件的类型,并完成了文件保存
这里其实就是加了类别判断,确保数据类型的一致性当然音频下载也是一样的。
上面介绍了视频和音频处理的 Handler另外还有一个存储的 Handler 没有介绍,那就是 MongoDB 存储平常我们可能习惯使用 PyMongo 来完成存储,但这里我们为了加速需要支持异步操作,所以这里有一个可以实现异步 MongoDB 存储的库叫做 Motor,其实使用的方法差不太多MongoDB 的连接对象不再是 PyMongo 的 MongoClient
在存储时使用的是 update_one 方法并開启了 upsert 参数,这样可以做到存在即更新不存在即插入的功能,保证数据的不重复性
好,以上便是 douyin 库的所有的关键部分介绍这部分内嫆可以帮助大家理解这个库的核心部分实现,另外可能对设计模式、面向对象思维以及一些实用库的使用有一定的帮助