zoukankan      html  css  js  c++  java
  • 利用python3.x实现小爬虫下载贴吧内图片

    Hi, I'm back.

     
    寒假在家只有一台笔记本,也懒得把台式机上的键盘拆下来用,因此编程被我暂时搁置,转而在网易云课堂上学了一下Python。可惜的是云课堂的Python教程是基于Python2.x,而且更加悲剧的是我在网上买的《Python核心编程》也是基于Python2.x的。而我本着学新不学旧的原则,脑子一抽安装了Python3.4,导致我学着编写示例代码的时候总是小心翼翼生怕踩到雷区。不过私以为学2.x写3.x等于是把两个版本都学了一下,还是有点好处的。
     
    回到学校之后学着视频里写了一个小脚本,功能很简单,就是下载贴吧图片帖内所有的图片到指定的文件夹。先上代码:
    import re
    import urllib.request
    
    # ------ 获取网页源代码的方法 ---
    def getHtml(url):
        page = urllib.request.urlopen(url)
        html = page.read()
        return html
    
    # ------ getHtml()内输入任意帖子的URL ------
    html = getHtml("http://tieba.baidu.com/p/3205263090")
    # ------ 修改html对象内的字符编码为UTF-8 ------
    html = html.decode('UTF-8')
    
    # ------ 获取帖子内所有图片地址的方法 ------
    def getImg(html):
        # ------ 利用正则表达式匹配网页内容找到图片地址 ------
        reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
        imgre = re.compile(reg);
        imglist = re.findall(imgre, html)
        return imglist
    
    imgList = getImg(html)
    imgName = 0
    for imgPath in imgList:
        # ------ 这里最好使用异常处理及多线程编程方式 ------
        f = open("pic/"+str(imgName)+".jpg", 'wb')
        f.write((urllib.request.urlopen(imgPath)).read())
        f.close()
        imgName += 1
    
    print("All Done!")

     

    先总结一下在编写过程中被“坑”的地方(Python:怪我咯?)
    1.urllib在Python3.x中发生了改变,按照这份脚本来说,原本在urllib下的urlopen()方法现在在urllib.request下。
    2.必须修改html对象内的字符编码,因为获取的字符都是以字节形式保存在对象中(因此图片可以直接通过read()方法保存在文件中)。
    3.正则表达式修改了好几次,这个下面说。
    4.Python中没有i++这种写法,所以"pic/"+str(++imgName)+".jpg"没有效果。
     
    (以下为废话,如果你是百度这份代码直接使用的话下面的内容可以忽略)
    说一下和正则表达式“斗智斗勇”的过程。
    贴吧中图片标签内是这么写的
    <img class="..." src="..." pic_ext="jpeg" ...>

    一开始我的想法很简单,正则表达式如下

    reg = r'src="(.*\.jpg)" pic="jpeg"'

    因为“.”这个元操作符会匹配换行符外所有字符,因此当爬到格式为png或者gif的图片的时候也会匹配,差不多就是下面这种效果:

    [..., 'http://.....png" ....... <src="...jpg"']
    简单来说就是会从无关图片的“src”一直匹配到我需要下载的图片的末尾“pic="jpeg"”
    解决的办法就是匹配到空格的时候就忽略,所以要将“.”和“\S”放在同一个字符类中,要么匹配除了空白符之外的所有字符,要么忽略。
     
    小彩蛋时间,这是我下载到的所有图片(逃
  • 相关阅读:
    分数拆分
    thinkphp URL规则、URL伪静态、URL路由、URL重写、URL生成(十五)
    iOS_12_tableViewCell的删除更新_红楼梦
    关于0基础磁盘管理(gpt UEFI...)最好的一篇文章(来自gentoo linux)
    HDU 3564 Another LIS splay(水
    jsp表达式
    XML(四)dom4j解析XML
    Android学习笔记(十八)——使用意图筛选器和实现浏览网页(附源代码)
    Oracle企业管理框架
    em grid control网格控制
  • 原文地址:https://www.cnblogs.com/zhouxuchen/p/4341034.html
Copyright © 2011-2022 走看看