BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #3008同步于 2014/8/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

Python Spider? A quick and dirty aproach......

reverland
2014/8/20镜像同步36 回复
This work is licensed under the Creative Commons Attribution-ShareAlike 4.0 International License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/4.0/. ------------------------------------------------ 你用python做什么? 很严肃的东西:比如项目、工作、比如blablabla 你学一门语言为了干什么? 因为好奇、因为想提高自己、因为blablabla 然而一门语言真正能干什么? 复杂的东西离我们太远,我们不用构建一个成千上万用户级的大型网站、不用计算火箭轨道、不用尝试穷举破解密码系统,不用在云端与大数据共舞,在集群中并行。那些听上去离我们很远。 简单的东西太不堪入目。打印出钻石型的字符串、编写一个能读取我们输入的C程序、计算一个字符串的长度,做小学应用题…… 一门语言应该这样、即使没有深厚的数据结构和算法基础,你依然知道可以用它来真正的做到你想要做的事情。同时不用过分陷入底层的细节和种种优化问题。 我觉得python一定程度上做到了这点,真的是一门属于每个人的计算机语言。无论他/她是什么背景。 Let's Rock With Python now. For fun and profit. ## TOC - 工欲善其事,必先利其器 - 百度音乐(requests) - 学生购电网络查询系统: 用电数据爬取(requests+lxml) - 超星数字图书馆(北邮镜像): 在线阅读书籍爬取转换(selenium) - 北京邮电大学迎新网:新生宿舍情况爬取(selenium) - 北邮人论坛:在线用户数据爬取(scrapy) - Hikvision视频监控系统:摄像头发现与默认密码登录(gevent) 看了看不想写了……好麻烦…… 如果有空,一点一点更吧。 ## 环境配置——工欲善其事,必先利其器 我在linux下使用python,强烈建议任何没什么特殊要求的人在linux环境下使用python。最不济,也得是unix吧。 如果,你坚持在windows使用python。给您个参考:http://v2ex.com/t/127612 所谓quick and dirty,是因为我实在没有本事把代码写得优美、高效,它能起作用,管它什么样子我也懒得去管它了。我个人没有不断优化啊封装啊的癖好和耐心。仅仅做到我想做的事就够了。 所以,如果下面的代码看上去不堪入目、那就对了…… 首先讲环境的配置,强烈建议你使用ipython, ipython提供了一个增强太多的交互shell,让你能像使用matlab一样一边试验一边写代码,以一种迭代开发模式来完成心愿,我觉得这是解释型语言的一大优点。 另外python3能让生活变得简单,但也许你像我一样懒,那2就2吧。 linux下安装ipython很简单,用包管理器比如apt-get安装就是了,别傻兮兮的自己编译。 sudo emerge ipython 还需要python的包管理器。一般叫pip或者python-pip或者类似名字的 sudo emerge pip 接着需要安装一些常用的非标准库中的模块, 这时你可以使用linux的包管理器来装(查清楚名字,不同发行版打包不一样),如果有的话最好。 sudo emerge requests gevent lxml scrapy selenium 或者用pip来装。(有些模块会依赖其它东西比如lxml会依赖libxml2,要是我没记错的话,如果出错认真看错误信息,不会有什么奇葩问题)。 pip install --user requests lxml gevent Scrapy selenium 如果想让人生简单一点,就别傻兮兮的下载各个python模块的包自己手动装。 然后,完事了,就是这么简单。别听上面的讨论瞎扯要什么四个小时,这时候就可以天马行空的hacking了,什么nose什么virtualenv等等真不是必要的。 linux下简单的配置,你就可以干很多事情了。不相信,那以后再说吧。 最后的结果,应该像这里https://www.python.org/shell/ 如果你那个交互式控制台加载不进来,那么你大概需要翻墙,不然google打不开、stackoverflow加载不了还怎么愉快地玩耍。chon同学似乎在做vpn https://moevpn.com/, you may consider it。想想像chon大大这么用python构建严肃应用的才叫牛逼啊…… 洗衣服去了,有兴致了再说,忘记了就算了。 基本爬虫这种东西,写着写着就从find到re从re到xpath/css selector最后没有啥性能要求的就愉快的开始selenium……
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
wangqc机器人#1 · 2014/8/21
大神牛掰,给学长点个赞,果然是实验室的二把手。。。
melot机器人#2 · 2014/8/21
厉害
doug机器人#3 · 2014/8/21
火速膜拜 reverland,实验室一把手,没有二把手。 【 在 wangqc 的大作中提到: 】 : 大神牛掰,给学长点个赞,果然是实验室的二把手。。。
dasha机器人#4 · 2014/8/21
终于有人提lxml了
chflyingbear机器人#5 · 2014/8/21
借楼推荐evoluvpn.com 也是django架构的 另外windows用推荐用spyder和pythonxy 库很全 python跨平台属性很好 不依赖linux完全无所谓
chinapds机器人#6 · 2014/8/21
chon的vpn卖了好多年了
reverland机器人#7 · 2014/8/21
跨平台属性很好……这句话我持保留意见,还行,但说不上好。 pythonxy是用来做科学计算和数据分析的……虽然别人打包好了比较方便,但多少失去了些通用性。 另外如果专注科学计算和数据分析,engthought python distribution在windows下体验也不错。 就本文来看,你要是不介意装一大堆东西也行,把twisted(scrapy依赖)装上就行,关于“良好”的跨平台性 看看这里http://twistedmatrix.com/trac/wiki/Windows 不过确实能用: http://www.kylen314.com/archives/1529 【 在 chflyingbear 的大作中提到: 】 : 借楼推荐evoluvpn.com 也是django架构的 另外windows用推荐用spyder和pythonxy 库很全 python跨平台属性很好 不依赖linux完全无所谓
reverland机器人#8 · 2014/8/21
## Take a sad song, and make it better:爬取百度音乐 以下,个人的一个trial and error的过程,仅供参考。 用到一些基本知识比如HTTP请求啊,html啊,json啊,ajax啊,当然,不懂也没关系…… 使用了一些工具比如firefox啊,firebug啊,python啊……当然你们喜欢用chrome/chromium还是IE都一样…… --- 也许是我听的歌太小众了,经常会发现有些歌在线听的好好的,竟然没有下载链接 对此,很不理解,在线可以听到就说明浏览器已经把媒体文件下载下来并且播放出来了……为啥会告诉我没有下载链接? 某天,听到Beatles的Hey Jude,我忽然觉得得动手找找音乐文件是哪里的。于是,打开firebug,选择network标签下的media标签,可是什么也没有。 唉?于是又确认了下,百度音乐在线播放器不是flash,满满的html5标签= = 凭借直觉,应该和xmlhttprequest有关系,于是抱着试试看的心理打开firebug上的xhr标签 哇,果然有好多请求,咦?songlink?凭借直觉似乎是音乐链接地址…… 打开返回的json看了看果然有个来自file.qianqian.com的疑似歌曲链接(有时候用firebug的搜索功能也不失为良策)…… 把引号中的链接复制粘帖到地址栏,哇,果然是歌曲mp3啊 我们可以再认真看看返回的json,其中有lrc歌词链接,有封面图片链接、歌曲文件大小啊等等 接下来的问题是,如果想下载其它歌曲怎么办。首先观察之前我们获取想要mp3链接的POST请求。 请求参数中有一个songID?似乎很清晰的样子,我猜吧,每个歌曲在百度音乐库中都对应这么一个ID 后来发现确实差不多。 至此,可以开始写自己的爬虫了…… 关键部分大致这样 def download_by_song_id_list(song_id_list): song_data = 'songIds=' + "%2C".join(song_id_list) song_link_url = "http://play.baidu.com/data/music/songlink" headers = {"X-Requested-With": "XMLHttpRequest", "Content-Type": "application/x-www-form-urlencoded;\ charset=UTF-8"} r = requests.post(song_link_url, data=song_data, headers=headers) data = json.loads(r.content) for it in data['data']['songList']: print '\n' + it['songName'], ': ', it['size'], "bytes" # print it['songLink'] r_song = requests.get(it['songLink'], stream=True) with open(it['songName'] + '.' + it['format'], 'wb') as f: dl = 0 total_length = int(it['size']) for b in r_song.iter_content(): if not b: break dl += len(b) f.write(b) done = int(50 * dl / total_length) sys.stdout.write("\r[%s%s] %.2f%%" % ('=' * done, ' ' * (50 - done), 100.0 * dl / total_length)) sys.stdout.flush() print '\n' + it['songName'] + '.' + it['format'], " finished"
tanoximi机器人#9 · 2014/8/21
赞。。。膜拜大神 来自「北邮人论坛手机版」