百科问答小站 logo
百科问答小站 font logo



利用爬虫技术能做到哪些很酷很有趣很有用的事情? 第1页

  

user avatar   yemo 网友的相关建议: 
      

把学校所有重要的在线服务用爬虫集合成了一套JSON API ,然后开发成了App,并且加了一个类似微信朋友圈的功能,可以说是校友圈吧。全校同学和同班同学都可以通过它互相交流,和微信不同的是,同班之间的交流会有消息推送。

App有iOS版和Android版,可以下载并查看教学文档和习题文件,老师有新的通告也会发推送给同学们,还可以查看成绩,课程表,考试时间,个人财务,校园新闻,出勤率等。

目前基本全校都在使用。 一个人开发了两个月。App名字叫MMUBee
开发这个App,我一毛钱都没赚,每年还赔进去四百多美元的开发者注册费和VPS租用费。两个月里也基本上起早贪黑的做。没太多原因,就是喜欢做东西。

我不经常去上课,不过去的时候都可以看见大家在用MMUbee,有一次一个同学打开MMUbee然后对着我说,你快来下载MMUbee,It's awesome!,我说这是我开发的,他没反应过来,过了5秒钟,一脸兴奋的问我Are u kidding me?类似的事情还有很多,比如在上课的时候老师会说,大家不许把考试答案发在MMUbee里。
MMUbee的校友圈里,前两个月90%的Post都是好评。Twitter和Facebook上也都是同学们的一片叫好声,校内论坛更是沸沸扬扬了一段时间。虽然MMUbee本身没有盈利,却给我带来了很多机遇。


查看通告,下载课件,联系导师,点击通告中的日期还可以直接创建提醒:

校内新闻:

校友圈(可以设置查看权限为同班同学或者整个校区):

学生中心(时间表,出勤率,考试时间和成绩等等):

用户评价:





user avatar   emily-lou 网友的相关建议: 
      

谢邀.

2011年夏天我在google实习的时候做了一些Twitter数据相关的开发,之后我看到了一片关于利用twitter上人的心情来预测股市的论文(

battleofthequants.net/w

)。实习结束后我跟几个朋友聊了聊,我就想能不能自己做一点twitter的数据挖掘,当时只是想先写个爬虫玩玩,没想最后开发了两年多,抓取了一千多万用户的400亿条tweet。

上分析篇

先给大家看一些分析结果吧。大家几点睡觉呢? 我们来统计一下sleep这个词在twitter上出现的频率。

看来很多人喜欢在睡前会说一声我睡了。那我们再看一个更有意思的 :"Thursday"这个词的每天出现的频率。

这里2月2号是周四,不出意料,这一天提到周四的频率最高。而且好像离周四越近这个频率越高。可是,为什么2月1号的频率反而低了呢?是因为2月1号大家不说周四而说明天了(有的人会说2月2号也可以说是今天,但是因为在2月2号提到当天的次数太高,因此还是有很多人用周四这个词)。

做了词频统计我们还可以做一些语义分析。我们可以利用unsupervised learning来分析一条tweet的感情色彩。我们对每一条tweet的高兴程度在0至1之间打分,并对每天做平均值,就得到了下面这张图。这里最明显的特征恐怕就是周期性了。是的,大家普遍周末比较高兴。不过这张图的开始和中间有两个点与周期不吻合。如果我告诉你这两天是1月1日和2月14日,那你肯定会想到为什么了,元旦和情人节很多人是很高兴的(不排除slient majority存在的可能)。

这很有意思,但似乎没什么用啊。那我们来看下面这张图,还是2012年的情感分析,不过这里对用户进行了过滤,只保留了来自投资人和交易员的tweet (根据用户的tweet我们可以估计他/她的职业)。蓝线是这些用户的感情色彩,红线是S&P 500指数。看来行情好的时候大家都高兴啊。

最后我们再来看两个统计图吧。2012年是美国大选年,这里统计了在所有和奥巴马相关的tweet里跟提到经济的tweet占的比例。红线是这个比例,黑线是S&P 500

貌似和美国经济有负相关性啊!为什么呢,我们看下面的图就明白了。这个比例和美国失业率正相关,而经济和失业率又是负相关的。换句话说,美国人(尤其是共和党的)找不到工作了就开始埋怨奥巴马了。

除了上面的分析外我做了很多其他的研究,比如如何判断一个用户的职业,验证六度分隔理论, 以及网络扩张速度的建模,不过这里就先不赘述了。

最后要说的是以上的分析在统计上都是不严谨的,twitter上的信息杂音非常大,又有很强的demographic bias,有很多因素都没有考虑。我们只能希望大数定律能过弥补一些误差。写在这里只是抛砖引玉,给大家看一下爬虫可以做什么。大家感兴趣的话之后我可以补充一下这两个话题:

1. 怎样判断一条tweet的感情色彩

2. 怎样估计一个twitter用户的职业

下技术篇

当时Twitter用户大概已经有上亿了,每天新的tweet也有几千万甚至上亿。能不能把这些数据全部抓取下来呢?这是可能的。Twitter是有API的,不过每个IP地址每小时可以抓取150个用户最近的tweet,以这个速度要把几亿个用户抓取一遍需要近一百年。但是,大部分Twitter用户是不活跃甚至从来不发tweet的,还有很多用户是印尼等国家(不是他们不重要,我真的看不懂他们发的tweet),如果我们把不说英语,不发tweet以及follow人数不超过5个(好像注册twitter后用户会被要求follow 5个人)的用户过滤掉,我们就剩下了大约10,000,000个用户,十年就可以搞定了。

十年好像还是太长了。。。不过twitter的访问限制是基于IP地址的,只要我从多个IP访问twitter不久好了(我真的没有DDOS twitter的意思啊)?那么下一步就是搜集大量代理服务器来访问twitter api。为了做twitter的爬虫我专门做了一个爬虫去搜集免费代理服务器。免费的东西总是有代价的,这些服务器非常不稳定。因此我又建立了一套代理服务器管理系统,定期更新IP地址,删除不能用的服务器。最后这套系统平均每天有几百个可用的服务器,大约半个月就可以把一千万个用户抓取一遍了。

此外我又做了一些动态优化,根据twitter用户的follower数量决定他们的抓取频率,以提高重要用户tweet的实时性。

在一年半的时间里,这套系统一共抓取了400亿条tweet,加起来得有10TB,估计占来自美国tweet数量的一半左右。那么问题来了,怎么存贮这些tweet呢?如果要做分析的话恐怕把数据读一遍就要好几天了。很多人马上会说hadoop, cassandra, spark等等。不过作为一个穷学生我哪里有钱去做一个cluster呢?这些数据存在AWS上就得每月1000刀了。

自己动手,丰衣足食。解决方案就是自己组装一个服务器,买了8块3T硬盘做了一个12TB的磁盘矩阵放在寝室里。

软件使用了最为传统的MySQL,这是一个存了400亿条数据的MySQL数据库。我花了大量时间去做优化,尝试了各种各样的partition, ordering, indexing。最后可以实现一天之内对100-200亿条数据进行线型搜索或过滤,或者几秒钟内调取某一天的或某一条tweet。

这台服务器现在留在了MIT,毕业后我把它提供给了一位教授做研究。

PS:

这个项目在2013年停止了,因为social media已经不在火,而且twitter于2013年中关闭了相关的API接口。

这个项目的初衷是学术性质的,我不想违反twitter的服务条款,因此这些数据没有被出售或者用来谋求商业价值,而是留给了MIT做研究。

在这期间与几个朋友进行了很愉快的合作,未征得他们允许就不在此提名了。

暂时没有开源的打算,因为当时水平有限,代码写得太丑了(用java写的)。

PS2:

很多人问怎么找代理服务器,请大家google一下吧。当然如果不能翻墙的话有代理服务器恐怕也不能用。

谢绝转载。


user avatar   DaniloShan 网友的相关建议: 
      
彩蛋:

彩蛋已关闭

骚瑞

为后来的同学解释一下彩蛋怎么回事,顺便对昨晚12点之后收不到彩蛋的同学抱歉(鞠躬),被屏蔽了

  • 彩蛋是如果赞了这条答案会自动收到一条随机的私信,里面是一则短笑话
  • 笑话是在某网站上爬下来的,一共几十条随机发送

起因是昨天写完原答案,突然想到如果加上彩蛋会不会很多人点赞(说我不是骗赞自己也不信)

于是写了个小脚本,跑了起来试了一下

第一次高潮出现在回答完30分钟后,突然多了一两百的赞,由于私信发送时间间隔太短,挂掉了

修复后坚持到了晚上十二点,本机和VPS都不能再持续发送私信,于是停掉了

今早起来发现赞又多了3000,崩溃的我决定还是不接着发了。。。

代码和逻辑如下:

       // 代码不全,只有主要的逻辑 // 用到的库如下:  var request = require('superagent'); var cheerio = require('cheerio'); var fs = require('fs');  // 首先是这样的一个接口,可以取到某个答案所有赞同的人数 // 每次取会返回10条数据,是编译好的HTML模版,还有下一组数据的地址 // 遍历这10条数据并取到所有人的ID即可 // config 是Cookie、Host、Referer等配置  var sourceLink = 'https://www.zhihu.com/answer/' + code + '/voters_profile';  function getVoterList(link, fn) { var next = ''; if (postListLength && !sleepIng) { console.log('waiting'); sleepIng = true; return setTimeout(function () { sleepIng = false; sleep = 1; getVoterList(link, fn); }, 1000 * 60); } request.get(link) .set(config) .end(function (err, res) { if (err || !res.ok) { return console.log(err); } var result = JSON.parse(res.text), voterList = '', $;  if (result.paging && result.paging.next) { next = result.paging.next; }  if (result.payload && result.payload.length) { voterList = result.payload.join(''); $ = cheerio.load(voterList);  $('.zm-rich-follow-btn').each(function () { var id = $(this).attr('data-id');  if (voterIdList.indexOf(id) === -1 && oldIdList.indexOf(id) === -1) { console.log('new id: ', id); voterIdList.push(id); } else { dupIdLen += 1; } }); }  if (next && dupIdLen < 20) { setTimeout(function () { getVoterList('https://www.zhihu.com' + next, fn); }, 3000); } else { dupIdLen = 0; fn(); } }); }  // 在爬取完该接口后,新的点赞人数会暂存在数组中,遍历该数组,并发送请求 // 如请求发送成功,将各ID保存在某一个文件中,如发送失败,等几分钟后重试  function sendPost() { var hasError = false; var tempArr = []; postListLength = voterIdList.length; console.log('send post');  if (voterIdList.length) { voterIdList.forEach(function (id, i) {  if (hasError) { // 处理发送失败的情况,等待5分钟重试 if (!sleepIng) { console.log('waiting'); sleepIng = true; return setTimeout(function () { sleepIng = false; sleep = 1; sendPost(); }, 1000 * 60 * 5); }  return console.log('has error'); }  var index = (function () { return i; })(i); var postIndex = index > postList.length ? index % postList.length : index;  setTimeout(function () { // 一波发送完成之前不会启动下一波私信发送 postListLength--; request.post('https://www.zhihu.com/inbox/post') .send({ member_id: id, content: postList[postIndex], token: '', _xsrf: '' // 这里是发送者的Cookie }) .set(config) .set({"Accept": "*/*"}) .set({"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"}) .end(function (err, res) { console.log('hasError: ', hasError); console.log(new Date()); console.log(res.text); var resObj = {};  try { resObj = JSON.parse(res.text); } catch (e) { console.log(e);  if (!sleepIng) { hasError = true; sleep = 5; console.log('waiting'); sleepIng = true; return setTimeout(function () { sleepIng = false; sleep = 1; sendPost(); }, 1000 * 60 * 5); } }  if (err || !res.ok || resObj.r !== 0) { console.log(err); hasError = true; sleep = 5; tempArr = voterIdList.slice(0, index); oldIdList = oldIdList.concat(tempArr); fs.writeFile('./idlist.json', oldIdList, function (err) { if (err) console.log(err); }); } }); }, 20 * 1000 * index * sleep);  if (index === voterIdList.length - 1) { console.log('last'); oldIdList = oldIdList.concat(voterIdList); voterIdList = []; setTimeout(function () { console.log('run again'); getVoterList(sourceLink, sendPost); }, 1000 * 60 * 15);  fs.writeFile('./idlist.json', oldIdList, function (err) { if (err) console.log(err); });  console.log('done '); } }); } else { setTimeout(function () { console.log('run again'); getVoterList(sourceLink, sendPost); }, 1000 * 60); } }      

代码花了半个小时写的,比较糙,不过跑了一下确实能用,既然已经不发了就不改了,有同学要求就发上来了

PS 知乎的策略应该有变化,昨晚12点之前只要对同一个人两条私信不重复,把握好发送时间间隔就没问题,12点之后我的VPS已经不能用了,时间间隔再久也会返回500错误,1点后我的本机也不行了,不断的返回500和403,Cookie也有更新,索性就停掉了

这是昨晚爬到的ID


还有我的视角所看的我的私信列表= =


就酱


==============================

某人有一天书荒了,想要看豆瓣上的高分书,然而豆瓣并没有提供按评分的检索,于是拜托我写一个小东西,要求是能按现有标签来分类检索豆瓣图书,并按分数从高到低排序

需求不难,就是数据没有,于是写了个爬虫按标签爬下来豆瓣所有的书

爬的时候只爬了分类的列表,这样有书籍的名称,链接,评分,分类,够用了,而且一次请求可以拿到较多的数据,并发不高的情况下能较快的爬完豆瓣所有的书

爬数据的时间大概两个多小时左右,每次请求间隔3秒,倒是没被屏蔽

代码用node写的,包括外网访问的服务器,基本满足了某人的需要,现在跑在我自己的VPS上,有域名可以直接访问

爬完知道豆瓣热门标签下大概有6万多本书,是会不断更新的,所以还要定期爬一下更新一下数据

下面是预览,时间所限页面写的糙了点,反正用户就一个- -




user avatar   li-de-53 网友的相关建议: 
      

没想到得到这么多赞,有点小害怕啊~有一些问题我在下面回答以下把。

------------------------------------------------正常分割线----------------------------------------------------

2011年,我还在学校读书,写了个软件注册了几十万个新浪微博账号。(那时候还不要求实名制,真怀念)。然后就要养账号,写了几个爬虫软件从搜狐微博上爬昵称用来更新我新浪微博上的昵称,从大V的粉丝中爬他们的头像用来更新自己的微博头像(我对不起大家!),从笑话微博中爬微博内容来发到自己微博中。用这这几十万个微博账号去参与抽奖,一年获利了七万多块钱。读书那几年我承包了我们宿舍所有的水电费和我们班男生宵夜啤酒鸭霸王的费用。

------------------------------------------问题回答--------------------------------------------------------------

1、是不是用Python写的,用别的语言可以实现不啦?

答:是用C#写的,Python没有学过,毕竟专业不是计算机,毕业后所从事的工作也不是程序员,所以没有学习这个的动力。别的语言肯定也是可以实现的,计算机语言之间都有相似性,只是实现起来的难易程度不一样。上学时学习C#完全是出于爱好,在学习、工作上能够解决自己的问题即可。我不适合专职做程序员,去理解别人的需求很痛苦,其实曾经尝试着去当一名伟大的软件程序员来着,可惜北漂未遂。

2、怎么知道你的帐号中奖了?

答:我自己的帐号我一眼就能认得出来。我一般用一个大号去参加抽奖(大号一般不会被封),然后用软件去监测我的大号参与抽奖。这样我的小号转发的有奖活动跟我的大号之间就几乎相同了(为什么说几乎,因为有部分会失败)。活动开奖后,我只要从我的大号中进入抽奖页面查看中奖帐号即可。我自己的帐号全部申请了10个左右的勋章,有昵称、有头像、有学校、有年龄、有标签,最重要的是从所转发的微博和抽奖活动来看,一个有奖活动中间夹杂几个正常微博,正常微博的内容我是从谁的微博中抓取的我也都能认识。只要疑似自己的帐号,把它的UID或者nickname放入数据中中检索便知结果。

3、新浪微博不封号?

答:肯定封,而且经常好几千上万那样封。所以我一次性都是用一万个左右的帐号去参加抽奖,封掉了就用下一批。此外换IP是常识,之前十个左右换一个IP,后来严格了,基本上三五个就换一次IP。封号和反封号跟新浪也是斗智斗勇,每次帐号被封之后我都会把同一批使用但幸存的那么几百个帐号来进行分析。同批次参与活动为什么大部分帐号被封,但是还有几百个幸存的呢,他们之间肯定是有差异的,找到这种差异去猜测新浪技术然后改进我的软件。

4、现在还做不做这方面的软件了,不做可惜了,能不能帮我写个某某软件,批量生成一些知乎点赞帐号和点赞软件?

答:现在不做,从来都没有想过把这个当作所谓的事业。现在有了正经工作,而且收入也比做这个要多,为什么还要去做这种边缘性的东西。

5、鸭霸王是什么?

答:下酒菜,湖南特色,辣的够滋味,毕业了怀念。

6、碉堡?

答:会很疼,还是不要。


user avatar   CatchFish 网友的相关建议: 
      

死宅一枚。爬取5000张二次元妹子的图片,生成了下面这张图(查看原图小图清晰可见,没有奇奇怪怪的图片)。

上手难度低,适合新手。


具体制作流程:

  • 使用 Scrapy 框架爬取5000张二次元图片
  • 使用 Pillow 批量格式化图片
  • 将图片按照 HSV 的欧式距离排序重新组合图片,实现效果
  • 或者借助软件类似 Foto-Mosaik-Edda 实现相同效果



合成软件下载地址:Welcome | FMEdda | Foto-Mosaik-Edda

Github项目地址 https://github.com/ThomasHuai/puzzle


为了彰显社会主义核心价值观,请各位在使用爬虫的时候遵守网站robots.txt中的爬虫协议,图片以个人收集为目的,不要占用站长大量带宽。

一、安装开发环境


  1. 安装 Scrapy 爬虫框架
       pip install Scrapy     


windows 安装可以点击此处


2.安装 numpy 科学计算库

       pip install numpy     


3. 初始化一个 Scrapy 项目 acg

       scrapy startproject acg     


  • 2018年4月10日优化后不再使用openCV(各别同学反映太难安装),改用Pillow,效果一样。

二、爬取图片

2018年4月20日更新内容

  • 修复抓取路径到 2018-4-20 可用
  • 使用 ImagesPipeline 下载图片
  • 抓取时不处理图片(对应一些人想要原图的要求)

爬取详细

  • 图片默认存储路径是 database/full 文件夹,图片名为hash值
  • 自定义路径请在 setting.py 中进行修改
  • 自定义文件名请在 pipelines.py 中重构 ImagesPipeline 类


       #coding=utf-8 #update at 2018-4-20 from acg.items import ImageItem import scrapy import numpy as np import os  class acgimages(scrapy.Spider):  """docstring for acgimages"""  name = 'images'  start_urls = [   "http://www.acg.fi/anime/page/1"  ]  page = 1  count = 0  MAX_CATCH_PAGES = 1000  item = ImageItem()  def parse(self,response):   next_page = response.xpath('//div[@class="grid-bor"]//a/@href').re(r'http://www.acg.fi/anime/([0-9]+).htm')   used = []   for page in next_page:    if page not in used:     used.append(page)   print('find %d secound pages' % len(used))   for number in used:    url = "http://www.acg.fi/anime/%s.htm" % number    self.item['url'] = url    yield scrapy.Request(url, callback = self.post_page)    if self.page < self.MAX_CATCH_PAGES:    self.page = self.page + 1   next_url = "http://www.acg.fi/anime/page/%d" % self.page   yield scrapy.Request(next_url, callback = self.parse)   def post_page(self,response):   images_url = response.xpath("//div[@id='entry-content']//img/@src").extract()   print('find %d images' % len(images_url))   self.item['images'] = images_url   return self.item     

三、生成图片


软件下载地址:Welcome | FMEdda | Foto-Mosaik-Edda


1.创建一个图片数据库

2.导入图片

3.导入过程中

4.创建一个马赛克风格图片

5.打开原图

6.选择已经上传的数据库



7.生成完成

简单高效的平民玩法到此结束。


逼格不够?

下面分享用 python 代码实现该软件的马赛克拼图效果。


一、安装依赖


1.安装图像处理库 pillow


       pip install pillow     


二、使用 Python 做到马赛克拼图效果


1.使用 hsv (颜色空间)完成颜色精准适配

2.自定义图片重复数量

3.增加命令行进度条,增加命令行可自定义参数

4.创建完成拼图数据库后可以直接合成,不用重复执行创建

5.多线程处理图片提高效率


hsv (颜色空间模型)



hsv 两点间距离公式(欧式距离):


/main.py

       import os from PIL import Image,ImageOps import argparse import time from multiprocessing import Pool import random import math import sys from colorsys import rgb_to_hsv  SLICE_SIZE = 85 OUT_SIZE = 5000 IN_DIR = "database/full/" OUT_DIR = "output/" REPATE = 0  def get_avg_color(img):     width, height = img.size     pixels = img.load()     if type(pixels) is not int:         data = []         for x in range(width):             for y in range(height):                 cpixel = pixels[x, y]                 data.append(cpixel)         h = 0         s = 0         v = 0         count = 0         for x in range(len(data)):             r = data[x][0]             g = data[x][1]             b = data[x][2]             count += 1             hsv = rgb_to_hsv(r / 255.0,g / 255.0,b / 255.0)             h += hsv[0]             s += hsv[1]             v += hsv[2]          hAvg = round(h / count,3)         sAvg = round(s / count,3)         vAvg = round(v / count,3)          if count > 0:              return (hAvg,sAvg,vAvg)         else:             raise IOError("读取图片数据失败")     else:         raise IOError("PIL 读取图片数据失败")   def find_closiest(color, list_colors):     diff = 1000     cur_closer = False     arr_len = 0     for cur_color in list_colors:         n_diff = math.sqrt(math.pow(math.fabs(color[0]-cur_color[0]), 2) + math.pow(math.fabs(color[1]-cur_color[1]), 2) + math.pow(math.fabs(color[2]-cur_color[2]), 2))         if n_diff < diff and cur_color[3] <= REPATE:             diff = n_diff             cur_closer = cur_color     if not cur_closer:         raise ValueError("没有足够的近似图片,建议设置重复")     cur_closer[3] += 1     return "({}, {}, {})".format(cur_closer[0],cur_closer[1],cur_closer[2])   def make_puzzle(img, color_list):     width, height = img.size     print("Width = {}, Height = {}".format(width,height))     background = Image.new('RGB', img.size, (255,255,255))     total_images = math.floor((width * height) / (SLICE_SIZE * SLICE_SIZE))     now_images = 0     for y1 in range(0, height, SLICE_SIZE):         for x1 in range(0, width, SLICE_SIZE):             try:                 y2 = y1 + SLICE_SIZE                 x2 = x1 + SLICE_SIZE                 new_img = img.crop((x1, y1, x2, y2))                 color = get_avg_color(new_img)                 close_img_name = find_closiest(color, color_list)                 close_img_name = OUT_DIR + str(close_img_name) + '.jpg'                 paste_img = Image.open(close_img_name)                 now_images += 1                 now_done = math.floor((now_images / total_images) * 100)                 r = '
[{}{}]{}%'.format("#"*now_done," " * (100 - now_done),now_done)                 sys.stdout.write(r)                                           sys.stdout.flush()                     background.paste(paste_img, (x1, y1))             except IOError:                 print('创建马赛克块失败')     return background   def get_image_paths():     paths = []     for file_ in os.listdir(IN_DIR):         paths.append(IN_DIR + file_)     if len(paths) > 0:         print("一共找到了%s" % len(paths) + "张图片")     else:         raise IOError("未找到任何图片")      return paths   def resize_pic(in_name,size):     img = Image.open(in_name)     img = ImageOps.fit(img, (size, size), Image.ANTIALIAS)     return img  def convert_image(path):     try:         img = resize_pic(path,SLICE_SIZE)         color = get_avg_color(img)         img.save(str(OUT_DIR) + str(color) + ".jpg")     except IOError:         print('图片处理失败')  def convert_all_images():     paths = get_image_paths()     print("正在生成马赛克块...")      pool = Pool()     pool.map(convert_image, paths)     pool.close()     pool.join()     def read_img_db():     img_db = []     for file_ in os.listdir(OUT_DIR):         if file_ == 'None.jpg':             pass         else:                  file_ = file_.split('.jpg')[0]             file_ = file_[1:-1].split(',')             file_ = list(map(float,file_))             file_.append(0)             print(file_)             img_db.append(file_)         return img_db  if __name__ == '__main__':      parse = argparse.ArgumentParser()     parse.add_argument("-i",'--input',required=True,help='input image')     parse.add_argument("-d", "--db", type=str, required=True,help="source database")     parse.add_argument("-o", "--output", type=str, required=True,help="out directory")     parse.add_argument("-s","--save",type=str,required=False,help="create image but not create database")     parse.add_argument("-is",'--inputSize',type=str, required=False,help="inputSize")     parse.add_argument("-os",'--outputSize',type=str, required=False,help="outputSize")     parse.add_argument("-r",'--repate',type=int, required=False,help="repate number")     args = parse.parse_args()     start_time = time.time()     args = parse.parse_args()     image = args.input      if args.db:         IN_DIR = args.db     if args.output:         OUT_DIR= args.output     if args.inputSize:         SLICE_SIZE = args.inputSize     if args.outputSize:         OUT_SIZE = args.outputSize     if not args.save:         convert_all_images()     if args.repate:         REPATE = args.repate      img = resize_pic(image,OUT_SIZE)     list_of_imgs = read_img_db()     out = make_puzzle(img, list_of_imgs)     img = Image.blend(out, img, 0.5)     img.save('out.jpg')      print("耗时: %s" % (time.time() - start_time))     print("已完成")       


命令行

  • -s -- save 已经存在output文件夹已经有马赛克图片,快速生成图片
  • -i -- input 原始图片路径
  • -d -- database 爬虫图片数据集
  • -o -- output 马赛克图标生成路径
  • -is -os 输入(马赛克块)/ 输出(生成图) 图片尺寸
  • -r --repate(int) 重复(建议在图片集少的时候设置


       python puzzle.py -i test.jpg -d database/full/ -o output/      


上传一张5000张不重复结果图



已知问题

  • 少数图片,图片后缀名错误,比如说jpg图片修改后缀名为png进行伪造将会影响 Pillow 读取像素信息。(4-20 更新已经跳过影响图片)
  • 效果较差的原因有可能是,图片集数量不够(建议5000之内设置重复),黑白构图图片太多会直接影响 hsv 结果,图片单一,无法就近匹配。
  • 更多优化建议,bug信息请在评论区回复,感谢支持。


原创不易,欢迎点赞。

四斋蒸鹅心。


那么。数据爬虫帮你搞定了,还不赶紧趁热来一发数据挖掘或者机器学习?

欢迎关注后续文章。


---------------------- 分割线 -----------------------

2019.10.21

看看我发现了什么。。。



Github项目地址

参考文档:


user avatar   liu-wen-long-60-30 网友的相关建议: 
      

我个人并不是很看好。

html5,js以及类似的技术替代原生大家喊了很久了,就是大热的react native目前看来也依然很不完善。微信的应用应该都是运行在腾讯浏览器的X5内核里,这东西怎么样大家心里也都有数。我感觉还是只能做一些低交互的应用,大概也就是比网页快捷方式高一级别,要利用os的炫酷特性,原生还是跑不掉,而且目前原生开发很成熟了,框架库很多,门槛也很低。

对于不用下app省空间我不是很理解,只不过是把app浪费的空间挪动到微信里而已。

微信所倡导的用完即走的理念也只有腾讯有资本装b才会这么说,其它公司无论如果始终还是会想办法更多的占用用户的时间。

腾讯现在原本就掌握了渠道,现在连app的审核等生杀大权也都掌握,你说苹果恶心,但他起码还勉强算公平,而腾讯可以随便打着为了用户(和你妈说为了你好)进行系统抖动,非腾讯系全都会抖,想怎么搞你怎么搞你。


结局都是类似的,中小型公司都很激动,以为有了小应用他们就有了腾讯爸爸的几亿用户,这种幻觉很美好,但他们可能会面临更加惨烈的竞争,变成临时解决用户欲望的千斤顶,以及腾讯渠道那可怕的推广分成费用。大公司肯定都很不情愿的跟进,又没办法,估计会简单开发一些应用,然而尽可能的往自己原生的app上导入,心态很微妙,不过短期内肯定会先爆发一波星座血型算命起名你的前世今生颜值计算能活多少岁等一些QQ空间喜闻乐见的低质量辣鸡应用,目前也不知道腾讯审核时是否会做一些限制。

微信也许已经不是聊天软件了,我朋友偶尔用了一下QQ,惊叹的说,QQ真好用呀,聊天记录都能自动存下来! 微信当初也许吸引大家的是我们只想要一个广聊天的QQ,现在已经要变成微信os了,是不是以后也要走和当年QQ一样的路?整个腾讯系全压在这款app中? 我不知道,在集团利益,业绩增长的车轮下,什么张小龙王小龙,什么鬼的用户体验,什么产品经理说不的坚持,有多少碾碎多少。

仅是个人一点感悟和粗浅看法,不太对请见谅


user avatar   like-33 网友的相关建议: 
      

我个人并不是很看好。

html5,js以及类似的技术替代原生大家喊了很久了,就是大热的react native目前看来也依然很不完善。微信的应用应该都是运行在腾讯浏览器的X5内核里,这东西怎么样大家心里也都有数。我感觉还是只能做一些低交互的应用,大概也就是比网页快捷方式高一级别,要利用os的炫酷特性,原生还是跑不掉,而且目前原生开发很成熟了,框架库很多,门槛也很低。

对于不用下app省空间我不是很理解,只不过是把app浪费的空间挪动到微信里而已。

微信所倡导的用完即走的理念也只有腾讯有资本装b才会这么说,其它公司无论如果始终还是会想办法更多的占用用户的时间。

腾讯现在原本就掌握了渠道,现在连app的审核等生杀大权也都掌握,你说苹果恶心,但他起码还勉强算公平,而腾讯可以随便打着为了用户(和你妈说为了你好)进行系统抖动,非腾讯系全都会抖,想怎么搞你怎么搞你。


结局都是类似的,中小型公司都很激动,以为有了小应用他们就有了腾讯爸爸的几亿用户,这种幻觉很美好,但他们可能会面临更加惨烈的竞争,变成临时解决用户欲望的千斤顶,以及腾讯渠道那可怕的推广分成费用。大公司肯定都很不情愿的跟进,又没办法,估计会简单开发一些应用,然而尽可能的往自己原生的app上导入,心态很微妙,不过短期内肯定会先爆发一波星座血型算命起名你的前世今生颜值计算能活多少岁等一些QQ空间喜闻乐见的低质量辣鸡应用,目前也不知道腾讯审核时是否会做一些限制。

微信也许已经不是聊天软件了,我朋友偶尔用了一下QQ,惊叹的说,QQ真好用呀,聊天记录都能自动存下来! 微信当初也许吸引大家的是我们只想要一个广聊天的QQ,现在已经要变成微信os了,是不是以后也要走和当年QQ一样的路?整个腾讯系全压在这款app中? 我不知道,在集团利益,业绩增长的车轮下,什么张小龙王小龙,什么鬼的用户体验,什么产品经理说不的坚持,有多少碾碎多少。

仅是个人一点感悟和粗浅看法,不太对请见谅




  

相关话题

  如何看待微软辟谣「断供」中国用户,称类似细则早已存在? 
  有人说 Java 程序员离开框架就什么都不是,如何看待这一言论? 
  用户帐号系统设计的原则有哪些? 
  如何看待各大电商平台上售价极低的进口婴儿奶粉?是否有假货的嫌疑? 
  想买一个向日葵控控A2,但是好贵啊,为什么这么贵? 
  如何看待近期互联网上掀起的反百度浪潮? 
  外国人分得清大陆人和台湾人吗? 
  个人信息保护法 11 月 1 日正式实施,将产生什么影响?有哪些方面的解读? 
  产品经理怎样进行无授权领导呢? 
  如何看待网传「豆瓣网」发生重大股权变更,原创始人阿北已退出? 

前一个讨论
我想用Qt做一个第一视角的赛车游戏,请问我应该看哪些相关书籍?
下一个讨论
如何看待肃宁枪击案牺牲政委妻子跳楼身亡?





© 2024-11-21 - tinynew.org. All Rights Reserved.
© 2024-11-21 - tinynew.org. 保留所有权利