zoukankan      html  css  js  c++  java
  • 我爱他身强力壮能劳动 我爱他下地生产真是有本领

    用了一天时间重新看了一遍Python的基本语法,晚上就写了两个爬汤站小图片的脚本,什么图片就不细说了。

    • 一个用作计划任务,每天定时运行一遍,爬取存档页第一次加载取到的所有图片,保存到以日期命名的文件夹里面,在保存之前检查前一天的文件夹里是不是已经有了,有了就不下了。
    • 另一个是按ID逐页爬取一个博客里的所有图片。

    现在重看Python,思路跟当初真的完全不一样了,好多当初不懂的现在也全懂了,比如类的问题和命令行操作,这种今非昔比的感觉真爽。

    代码因为很简单就不放了吧,毕竟不是当初刚入门的时候了,说说思路。


    爬虫的基本做法就是读取页面,正则匹配,然后逐个下载。

    也就是urllib.urlopen(url).read(),re.findall(regex, str), urllib.urlretrieve(url, file)这么三个函数。

    先说第一个

    存档页显示的都是缩略图,首先翻页面源码,找到这些缩略图的标签写出正则式,像这样:

    r'data-imageurl="(http.*.jpg)"'

    这个时候就要感谢汤站的讲究了,每张图片的名称最后都加上了图片的大小,缩略图的格式是×××_250.jpg,然后打开大图页面发现大图的格式是×××_1280.jpg,于是果断写个函数把所有链接中的文件名改掉,然后遍历下载就行了。

    但是有个问题,存档页用了瀑布流,页面滚到底部的时候才会加载更多图片,用火狐的调试器看了一下,貌似是用js做的,于是不知道该怎么弄了,好在这个博客每天更新得也不是很多,所以也没动力研究其他解决办法。虽然还是有几个想法的。

    然后就开始研究第二个了

    还是多亏汤站的讲究,逐页爬取就更容易了,因为每页的URL是这样的:

    http://<id>.tumblr.com/page/<number>

    而且图片也更好找了,还是原生大图:

    r'href="(http.*1280.jpg)"'
    

    另外借助别人的点拨还加上了超时重试的功能,首先用socket模块设置全局的超时时间:

    socket.setdefaulttimeout(30)

    这样打开页面(urllib.urlopen().read())时联网超过30秒就会抛出IOError异常,下载图片(urllib.urlretrieve())超时会抛出socket.timeout异常,只要对异常加以处理就可以了,举个栗子:

    while True:
        try:
            urllib.urlretrieve(link, file)
        except:
            print '下载超时,五秒后重试……'
            time.sleep(5)
        else:
            break
    

    改成for循环还可以控制重试的次数。

    另外要做超时重试是因为爬虫爬取页面过快经常会被网站发现,然后就被ban了,表现出来就是下载被卡住进行不下去,所以超时后休息五秒重新下载。

    按理说应该下完每张图都休眠一会。

    毕竟人家也怕自己服务器被爬死。

    体谅一下。

  • 相关阅读:
    SharePoint 2013 列表启用搜索
    SharePoint 2013 InfoPath 无法保存下列表单
    SharePoint 2013 图文开发系列之定义站点模板
    SharePoint 2013 图文开发系列之创建内容类型
    SharePoint 2013 图文开发系列之网站栏
    Linux的PCI驱动分析
    uCOS-ii笔记
    RTOS系统与Linux系统的区别
    Arduino+GPRS 的环境监控方案
    可视化机器学习工具软件的比较分析研究
  • 原文地址:https://www.cnblogs.com/chihane/p/4189030.html
Copyright © 2011-2022 走看看