写了个python爬虫

题记: 生命的乐趣在于折腾.

这个周末闲来无事,想写个爬虫批量下载图片.

使用正则表达式

在网上搜了很多资料,很多都是使用的框架,例如BeautifulSoup等等,但是我还是用的最原始的办法:正则表达式.因为, 抓图使用正则表达式完全足够了.

我从来没有系统的学习过正则表达式,但是,我写爬虫还是用的正则表达式提取的图片地址.我的正则表达式是用过谷歌临时查的.然后需要什么看什么,不过已经能满足我的需求了.

出师未捷,爬虫先死

一开始我瞄准了7-themes.没办法,谁叫它的图片质量高.但是这个网站似乎有防爬虫手段(果然,好网站没一个简单的).它的图片原始地址如果通过浏览器访问的话,会自动跳转到一个html页面,而不是单独一张图片,好蛋疼.

百度图片质量太差

于是我又换了目标,这回换成了百度,成功是成功了.使用的正则表达式提取的图片地址.

代码贴在这里了.

这个正则表达式适合所有百度贴吧的图片,只要把url改为想要抓取的帖子的地址,然后循环改成帖子的页数就可以了..至于更智能的自动判断页数的虫子我懒得写了..百度的图片太糟糕了.

但是..因为..百度图片的平均质量太差了.于是我又继续找别的目标了.

最终版本

最后我找到了wallhaven这个图片站.嗯这个站好爬呀.原图片地址也不会跳转啊.于是我成功了.

结果…我特么爬了一百张看看效果..结果.特么的竟然是缩略图thumb.真是气死我了.于是机智的我发现一个现象..那就是..wallhaven的图片都是用id来标识的.也就是说,每一张图片都有一个唯一的数字id.然后我点开一张原图片的地址..哈哈原来wallhaven的原图地址是这个结构wallpapers.wallhaven.cc/wallpapers/full/wallhaven-图片的数字id.jpg

例如这张图片:

示例图片

她的id是144985,她的地址就是http://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-144985.jpg

wallhaven还有一个超级棒的功能,就是random推送图片,嘎嘎嘎,随机图片戳这里, 嘎嘎嘎

然后,嘎嘎噶,我只要每次get一个random页面的html源代码,然后从html里面用正则表达式提取出随机图片的id..然后,嘎嘎嘎,把id往原始图片地址的模板里面一嵌套.就可以得到若干个图片的原始地址.

wget是个好东西

一开始我用的python自带的urllib库来实现图片的下载..但是,这个功能鸡肋不说,图片下载下来还会出现数据丢失的情况,还有很大可能被网站阻止(因为太多爬虫使用的urllib)..于是我又找到了神器wget.

使用wget批量下载图片的方式是这样的:

  1. 把图片的原始地址写入一个纯文本文件里面,每行一个图片url(必须每行一个url)
  2. 使用python自带的os库调用wget命令,格式如wget -P $path -c -i $temp_file
    \$path 是保存图片的路径 \$temp_file是存储图片地址的文本文件

这样子,爬虫的效率提升了不说,还变得更加稳定了,毕竟wget是一个久经考验的神器.而且下载下来的图片还不会出现任何的失真.

但是windows下使用wget还是要折腾几下的,不过还好我的电脑本身被折腾的很多工具都有了,例如wget就在gow里面自带了.

最终版爬虫源代码贴在这里.

妈妈再也不用担心我没有图片用啦~.~

服务器上的尝试

在自己本机上开了半天的爬虫, 发现速度无法忍受, 突然想起我还有一个vps.于是我用scp命令给把python源代码copy到了服务器上运行了一下.

玛德…服务器的速度好恐怖..平均下载速度5M/s..学校校园网简直坑爹..竟然才300K/s的平均速度.

在服务器上运行爬虫

在服务器上运行爬虫