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”放在同一个字符类中,要么匹配除了空白符之外的所有字符,要么忽略。
     
    小彩蛋时间,这是我下载到的所有图片(逃
  • 相关阅读:
    dotnet 新项目格式与对应框架预定义的宏
    dotnet 线程静态字段
    dotnet 线程静态字段
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 拿到显卡信息
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取指定进程的输入命令行
    dotnet 通过 WMI 获取系统信息
    dotnet 通过 WMI 获取系统信息
    PHP show_source() 函数
  • 原文地址:https://www.cnblogs.com/zhouxuchen/p/4341034.html
Copyright © 2011-2022 走看看