整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

网上动态图有多污?一看吓一跳!Python爬取上万条

网上动态图有多污?一看吓一跳!Python爬取上万条动态图!

在前面的话

夜凉如水,苍穹下,秋叶舞。

天桥下川流不息的斑斓车灯,人来人往的十字街角,喧嚣与繁华的城。

我需要看看小姐姐的图片,好好感受下这世界的温柔以待。

私信小编007或者01即可获取数十套PDF或者零基础入门资料一套哦!

一.思路分析

按照爬虫的基本规律:

1.找到目标

2.抓取目标

3.处理目标内容,获取有用的信息

行动

1.我们的目标是: http://gifcc.com/forum.php

这个网站呢,是一个论坛式网站,里面分了几大类,反正试试各种动图。

我们的目标呢,就是找到这(收)些(藏)动(到)图(自)的(己)地(电)址(脑).

2.看看各个模块的网址,有什么规律

对,没错,如果以游客的身份进行访问,那么各个模块的网址就是这样的形式:http://gifcc.com/forum-XX-1.html

开工动手

1.获取入口页面内容

即根据传入的URL,获取整个页面的源码

这里我们使用了webdriver以及PhantomJS这些模块,为什么呢?因为网页是动态加载的,这样可以抓取的数据全一点。

2.获取页码数

这里的页码处理用到了一个模板pq,采用PyQuery的方式查找我们需要的元素,感觉更好处理一点,挺方便的

同时这里的处理稍微有点意思,如果观察这个页面的话,会发现,每个模板的页码,在上面和下面都有一个,然后

我这里截取的一下,因为我们只需要一个页码数字即可

3-6 第三步到第六步一起来说

其实就是根据页码数,来进行遍历,获取到每一页的内容

然后得到每一页中的所有图片地址

在进行获取每一页的内容的时候,需要重新组装页面地址。

有了新的地址,就可以获取当前页面的内容,并进行数据处理,得到每一张图片的地址列表

在获取到图片列表后,再次解析,获取每一张图片的URL

将图片存到本地,以及将数据写入数据库

到这里其实大体的内容已经完成了,我们能够将这个论坛的各个模块的动图保存在本地,同时,也将数据放入数据库中.

数据库的筛选

在完成了将数据放入到数据库的之后, 我想着可以直接通过调用数据库,将图片保存

(为什么有这个想法呢,因为我发现如果直接在主程序中存贮图片,它跑的太慢了,不如将数据都放到数据库中,之后专门调用数据库来贮存图片)

但是这里发现一个问题,数据中的内容挺多的,然后发现了好多内容是重复的,因此我们需要对数据库进行去重

关于数据去重的内容,其实我之前的文章已经写过了(写那篇文章的时候,这个爬虫已经完成了呢~)

主要思路是针对某一个元素的数量进行操作,pymongo里面有一个方法是可以统计指定元素的数量的,如果当前元素只有一个,就不管,不是一个元素,就删除

核心代码如下:

读取数据库中的内容,存储图片

数据去重之后,再次进行图片的存储,就方便多了

之后图片删除了也不用重新跑一遍,核心代码如下:

完整代码

01_get_gif_url.py

02_delete_repeat_url_in_mongodb.py

谢谢阅读!!!

育机构在做定制化软件开发的时候,会遇到这样一个问题:机构需要定制自己的错题本封面和封底,并且题目界面需要有各种便签可供学生标记,例如下面这个图:


要显示这样的错题界面,如果用word形式,一种办法是通过html转换成word,但是这样会导致部分理科题目无法显示的情况;另一个办法是直接在word中显示html,这种形式其实还是html,体验不太好,打印出来也会出问题。所以我们采取的是通过PDF的形式展示这种格式,并且还可以定制封面和封底:如下图:



因为PDF是比较好的打印格式,不会出现混乱的情况,所以目前就是怎么解决html完美转换成PDF的问题。


我们尝试了很多插件以后,最终发现下面这2个工具比较合适:wkhtmltopdf和phantomjs,下面分别试一下他们的效果:


  • wkhtmltopdf:下载完成后需要添加到环境变量才能在代码中使用,比如我们使用的是PHP,就可以通过shell_exec执行命令行。通过官网我们知道wkhtmltopdf还是非常强大的,可以设置页面为A3或者A4格式,可以设置页眉页脚,也可以设置字间距,字体,边框等,能满足大部分的转换需求,但是wkhtmltopdf也有他的缺点,就是对于js渲染后的页面转换后显示不太友好。对于我们的需求而言,要解决的难点就是理科公式的问题,因为我们的latex公式基本都是js渲染后才显示。后来发现wkhtmltopdf有一个参数就是可以设置等待时间,最终我们设置等待5秒在导出,就解决了latex导出PDF的问题,并且实现了完美的打印


  • phantomjs:使用方法都差不多,只是phantomjs需要通过js来配置参数。一样的需要先添加phantomjs到环境变量,然后通过代码执行命令行实现,也可以设置加载时间来实现js对html的渲染,只是phantomjs没有wkhtmltopdf转换专业。


本文希望通过自己的开发经验,减少教育软件开发者的坑。可以通过下面这个网站进行测试:http://www.widomk12.cn

一篇:node.js 15 如何操作Excel文件

几乎所有的项目涉及到报表或者合同处理等,都会跟PDF打交道。


pdf

node.js中,用的比较多的是html-pdf,每周下载量达到8万多,是比较多了。


html-pdf

这款工具的特点是不光可以通过代码调用API生成pdf,还提供命令行工具html-pdf来将html文件转换成pdf文件。

接下来,我们看一下html-pdf的安装使用。

html-pdf 安装

 npm install -g html-pdf

由于html-pdf是基于phantomjs的,所以在安装过程中会自动下载phantomjs。

html-pdf命令行

html-pdf test/businesscard.html businesscard.pdf

直接运行html-pdf加上源html文件,后面加上pdf文件名就可以生成pdf文件。

创建PDF文件,代码示例

//引入fs, html-pef模块
var fs=require('fs');
var pdf=require('html-pdf');
//读取html文件
var html=fs.readFileSync('./test/businesscard.html', 'utf8');
//参数options, 将PDF format设为letter, 如果是A4,直接将下面代码中的letter换成A4即可
var options={ format: 'Letter' };

//创建pdf文件
pdf.create(html, options).toFile('./businesscard.pdf', function(err, res) {
  if (err) return console.log(err);
  console.log(res); // { filename: '/app/businesscard.pdf' }
});

相关API

var pdf=require('html-pdf');
pdf.create(html).toFile([filepath, ]function(err, res){
  console.log(res.filename);
});

pdf.create(html).toStream(function(err, stream){
  stream.pipe(fs.createWriteStream('./foo.pdf'));
});

pdf.create(html).toBuffer(function(err, buffer){
  console.log('This is a buffer:', Buffer.isBuffer(buffer));
});

HTML中的header 和footer可以直接读出

html-pdf 可以将html中的header和footer读出。只要是id为pageHeader或者pageFooter的都可以被识别出来。

<div id="pageHeader">Default header</div>
<div id="pageHeader-first">Header on first page</div>
<div id="pageHeader-2">Header on second page</div>
<div id="pageHeader-3">Header on third page</div>
<div id="pageHeader-last">Header on last page</div>
...
<div id="pageFooter">Default footer</div>
<div id="pageFooter-first">Footer on first page</div>
<div id="pageFooter-2">Footer on second page</div>
<div id="pageFooter-last">Footer on last page</div>

关于参数options

在调用API pdf.create(html, options).toFile()创建PDF时,这里面的参数options相当强大,可以传很多数据。包括之前说的A4格式。