能利用爬虫技术做到哪些很酷很有趣很有用的事情?
准备学习python爬虫。各位大神都会用爬虫做哪些有趣的事情?
今天突然想玩玩爬虫,就提了这个问题。跟着YouTube上的一个tutor写了个简单的程序,爬了一点豆瓣的数据。主要用到request和bs4(BeautifulSoup)模块。虽然简陋,毕竟是人生中的第一只爬虫啊……以示纪念,代码写在博客里了:我的第一只爬虫:爬取豆瓣读书
1楼(未知网友)
之前一直想回答这个问题 , 但是感觉一点资格也没有. 现在我的python终于用到了 , 让我万分激动 , 怒答这个问题.
在我做了这件事情之后 , 她觉得我越来越懂她了 , 嘻嘻
有一天 , 我发现我心仪已久的妹纸在朋友圈里分享了知乎专栏的文章 , 就知道她也刷知乎 . 如果在知乎上关注她 , 我就能知道 , 她最近关注什么 , 心里想些什么 , 了解了解她喜欢的方面 , 还能作为谈资 , 简直太赞了 (*^^)v .
但是输入她的名字...... 在知乎上根本找不到好吗 (?`灬′?)
我们两个聊天的时候 , 刚好说到了她分享的那篇文章 ,
我很自然的说: "知乎上你用的不是真名呀, 就我这么天真用了真名.."
她笑着说:"那个可以改呀" ,
"凭什么知乎团队不让我改啊!!! ",我答道," 不如我们互粉吧^_- "
哎 , 于是她打开zhihu , 看了看我的主页 , 并没有关注我...... 可能是赞太少了吧... 达不到她的要求 , 或者她不想让我知道她在看什么吧 , 也许她希望自己的知乎是交浅言深 , 不希望被身边人看见... (?-﹏-?) 失望.
我回去想了想 , 她说名字可以改 , 那她可能以前也用的是真名 , 找到破绽了!
知乎的名字可以改 , 但是id是改不了的 !
(ps: 谢知友 @黑白异象@嘿嘿我在这儿@也之 纠正错误 这个id我记得以前是不能改的 , 现在叫做个性域名是默认的 , 但是可以改. 详见 2015-6-22更)
每个人的主页地址 , people后面那个就是TA的id,
http://www.zhihu.com/people/zhang-san-12-45
2楼(站大爷用户)
彩蛋:
彩蛋已关闭,人太多,已经发不过来了- -
本机和VPS不管频率间隔多慢,仍然不断被屏蔽,粗略算了一下多出的3000人如果发完可能要到下周了,所以停掉了
骚瑞
为后来的同学解释一下彩蛋怎么回事,顺便对昨晚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);
}
}
3楼(未知网友)
用爬虫最大的好处是批量且自动化得获取和处理信息。对于宏观或者微观的情况都可以多一个侧面去了解(不知道能不能帮统计局一些忙)。以下是我们自己用爬虫获得的信息然后做的呈现。
(多图预警)
1、获得各个机场的实时流量
2、获得热点城市的火车票情况
3、各种热门公司招聘中的职位数及月薪分布
4、某公司的门店变化情况
5、对某一类金融产品的检测和跟踪
6、对某车型用户数变化情况的跟踪
7、对某个App的下载量跟踪
4楼(未知网友)
我们用爬虫爬遍整个网络空间,爬那些主流端口,这背后是各种服务,其中 Web 服务最为复杂。
我们把这些服务的响应内容尽可能存储下来,加上大量指纹规则去识别它们都是什么。
于是我们得到了「全球网络设备」情况:
http://www.zoomeye.org/statistic/device
由于 Web 服务的特殊性,我们还得到了「全球 Web 服务」情况:
http://www.zoomeye.org/statistic/web
当我们看到这个时,对整个网络空间充满敬畏,于是内部的项目在 2013 年初考虑对外开放,首先开放了搜索:
http://zoomeye.org
取了个非常酷的名字:ZoomEye,中文叫:钟馗之眼,定位为:网络空间搜索引擎。当前已经是第三版。
由于这种搜索方式非常专业(并非面向普通大众),我们在首页上提供了「用户手册」,还有「搜索 Dork」,用户可以借助这两样快速入门。
我们做这个的目的是什么?
其实,我们是安全研究者(说通俗点:黑客),我们想解决一个问题:
一个漏洞爆发后,我们如何感知全球影响面?
这个问题背后的逻辑就是我们做这个搜索引擎的奥秘。
在黑客世界,攻击者与防御者,他们对抗的单元都可以细分到一个个「组件」,我们认为组件是构成网络空间的最小单元,比如你搭建一个网站,你要用 Ubuntu/PHP/MySQL/WordPress(附带各种插件)/jQuery 等等等,这些玩意就是一个个组件,你不需要重复劳动去创造它们,而是选择搭积木方式,这是整个网络空间进化的必然结果。正因为如此,如果一个组件出漏洞(这是必然的),那将影响一大批使用它的那些目标。
攻击者喜欢这样,因为一个组件出漏洞,攻击者可以大规模黑掉目标,然后做各种坏事(庞大地下产业链的一个关键环节)。
对我们来说,其实我们是防御者,我们可以站在攻击者角度去评估这种影响面,然后发出预警。
我们最成功的案例是,2014/4/8 心脏出血漏洞爆发时,我们是最快搞定整个权威预警的团队。可以看当时我们基于 ZoomEye 做出的心脏出血全球统计与一年后的相关解读:
http://www.zoomeye.org/lab/heartbleed
http://www.zoomeye.org/lab/heartbleed/2015
当时,我们的结论覆盖了央视、新华社、许多科技媒体、很多报刊杂志,还有国家相关监管机构,2014 年底时,入选极客公园评审的 2014 年互联网产品 50 强。这给了我们团队极大的信心,从一个内部实验性小项目逐渐成为安全圈/黑客圈炙手可热的平台。
这是一件大工程,如果你仔细体验这个平台,你会认可我的看法。
这是一个充满争议的平台,有人说我们通过 ZoomEye 就可以黑遍全世界。我们有能力做这事,但我们不会这样做,黑遍有什么好玩的,好玩在对抗,在促进整个网络空间的良性进化。
Google 爬了全球网站,他们说「不作恶」,对我们来说,全球网站只是我们面对庞大网络空间的一个子集(Google 的爬虫复杂度比我们只面对组件的爬虫的复杂度要高 N 个量级,这里不展开),为了把这个平台做好,我们还需要大量的人才与服务器、带宽、钱。
这是我这么多年带队做的最酷的爬虫项目,如果你也是 Python 工程师,对黑客这个领域充满好奇,可以私信我^_^
5楼(未知网友)
把学校所有重要的在线服务用爬虫集合成了一套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本身没有盈利,却给我带来了很多机遇,通过这些机遇做了一个上市公司的项目,赚了一大笔。
MMUbee Android: MMUbee - Android Apps on Google Play
MMUbee iOS: MMUbee on the App Store on iTunes
校友圈:
多媒体教学系统,列表里是我这学期拿的课,点进去后是老师的通告和课件下载:
老师的通告:
课程表,出勤,校历,考试时间表,考试成绩等等。
6楼(未知网友)
Python 开发交流群:113458033
---------------------------------------------------------------------------------
我的第一个爬虫是看了教程上模仿写的,区区十几行代码,也就是利用正则和urllib抓取贴吧上的图片,而且没有涉及到登录,以及下一页等,也就是为了批量下载一点美图。
dung_beetle/get_tieba.py at master · ZhangHang-z/dung_beetle · GitHub
然后尝试着更复杂一点的匹配,抓取豆瓣电影上新片榜, 口碑榜, 票房榜,也没有涉及到登录,复杂了全用正则就好像有点麻烦,也许我的水平不够,这时我发现了BeautifulSoup这个库。
dung_beetle/get_doubant.py at master · ZhangHang-z/dung_beetle · GitHub
我想试试登录,就参考别人的代码登录豆瓣,但是urllib,urllib2不是那么好用。。
dung_beetle/login_douban1.py at master · ZhangHang-z/dung_beetle · GitHub
所以我就用requests,简直是一键安装的效果。
dung_beetle/login_douban.py at master · ZhangHang-z/dung_beetle · GitHub
我作为新手一直喜欢用for循环一路走到底,但是循环的效率不怎么样,这时就开始尝试学习多线程库的使用了,一开始我想爬XX的,但是一直连接失败,无奈随便找了个论坛。原本如果用for循环需要100s, 多线程10s就好了。
dung_beetle/forum_crawler1.py at master · ZhangHang-z/dung_beetle · GitHub
这几天我考虑写稍大一点的东西,毕竟掌握一门语言的语法,库的使用要靠不断的写,碰到各种问题,才知道怎么解决。所以准备写个爬取知乎的爬虫,但是目前不尽人意。
ZhangHang-z/gzhihu · GitHub
效果:可把问题答案写入文件,但除了文本外,无法处理图片。
7楼(未知网友)
可以带逛呀!
爬了知乎12万用户的头像,把长得像的头像放在一起,方便浏览:http://lab.grapeot.me/zhihu/touxiang/bai-yuan-yuan-73.html
然后搜集了知友们的点击,预测出来这是你们(平均)最喜欢的人长的样子:
然后根据点击数据训练出来了一个带逛机器人,可以自动识别美女:
http://lab.grapeot.me/zhihu/autoface
更详细的信息可以参见我的专栏文章:
带逛传万世 因有我参与 - 挖掘知乎里有趣的东西 - 知乎专栏
你们最爱的知乎头像 - 挖掘知乎里有趣的东西 - 知乎专栏
头像带逛 - 挖掘知乎里有趣的东西 - 知乎专栏