美文网首页
20行PYTHON代码爬取微博高清大图,小白练手绝佳案例

20行PYTHON代码爬取微博高清大图,小白练手绝佳案例

作者: 鸡仔说 | 来源:发表于2017-04-15 12:09 被阅读476次

    <h1>0. 前戏说明</h1>

    环境说明
    • python3版本
    • 所需库:<code>Beautifulsoup</code> 、<code>re</code> 、<code>requests</code>
    • 知识点:正则表达式、基本网页请求与解析、文件写入
    • 适用人群:小白
    • 最终目标:20行代码爬取<a href='http://weibo.com/5263375497/Eq3GVEgEq?from=page_1005055263375497_profile&wvr=6&mod=weibotime&type=comment#_rnd1492222234309'>微博 @来点儿设计 的九张图片</a>
    • 最终效果:
    效果预览

    <h1>1. 分析网页</h1>

    1. 打开微博链接,Chrome浏览器调用网页解析器(快捷键:Mac:⌘ + shift + c, Windows:Ctrl + shift + c)得到如下页面
    微博页面

    2.点击如图所示的小按钮,把它转到移动显示,然后刷新页面。注意链接会变成<code>m.weibo.cn</code>至于为什么要转移动端嘛,移动端代码优雅很多,爬虫起来方便。

    Paste_Image.png

    3.点开第一张图,然后点击代码页面左上角那个指针,再把它移到页面上大图的位置,会在右边看到一行对应的链接地址

    Paste_Image.png

    4.复制在<code><src></code>中的内容<code>http://wx1.sinaimg.cn/large/005KcApbly1fbknniwmsij30go0got9a.jpg</code>然后键入⌘+f (windows: ctrl + f )查找,在左下角的位置复制地址进去,看下结果有两条显示。

    Paste_Image.png

    5.输入回车,会发现我们的结果出现在如图所示的黄色部位。

    第一处 第二处
    1. 等等,我们往下翻的时候,却惊喜的发现更多类似的链接,这是不是意味着,我们只要把接下来的链接全部爬出来就能把所有的图片提取出来了?
    Paste_Image.png

    7.打开那些链接一看,果然是这样,不愧我看了这么多侦探小说。那么接下来逻辑就简单了,找到<code>script</code>提取<code>pics</code>下面所有<code>url</code>对应的链接就可以了。

    <h1>2. 开始撸码</h1>

    #coding:utf8
    
    from bs4 import BeautifulSoup
    import requests,re
    
    #requests.get方法获取response响应
    req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
    #用美丽的汤BeautifulSoup解析网页html信息
    soup = BeautifulSoup(req.text, 'lxml')
    print(soup)
    

    可以在Pycharm中运行一下,你将得到一连串如图的结果。

    Paste_Image.png

    你会发现想要的链接<code>"url": "http://wx1.sinaimg.cn/orj360/005KcApbly1fbknniwmsij30go0got9a.jpg",</code>都在<code>"url":"</code>和<code>",</code>之间,那么用正则去匹配一下,就很容易拿出来了。

    Paste_Image.png
    #coding:utf8
    
    from bs4 import BeautifulSoup
    import requests
    import re
    
    #requests.get方法获取response响应
    req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
    #用美丽的汤BeautifulSoup解析网页html信息
    soup = BeautifulSoup(req.text, 'lxml')
    
    #用正则匹配url中间的内容,其中\"表示转义这个"\"符号,不懂的小伙伴,要去补一下正则的知识了哦!(.*?)表示懒惰模式下匹配0个或任意个字符,re.S表示包括换行符在内的任意字符,就是说啥都匹配,我全能!!! 
    r = re.compile(r'"url": \"(.*?)",', re.S)
    a = r.findall(soup.text)
    print(a)
    

    -------------雪中送炭:正则基础可以去这里看一下☞☞☞戳这里-------------

    上面的输入结果是

    Paste_Image.png

    我们发现,这丫的不止9张图啊。我们打开每个链接看一下,原来每张图片被输出了两次,一次是缩略图,一次是整张图。而且,我们还发现一个规律,就是链接是一张缩略图,一张大图。那也就简单了。我们只要从第二张开始,隔行提取就可以啦。上代码:

    from bs4 import BeautifulSoup
    import requests
    import re
    
    #requests.get方法获取response响应
    req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
    #用美丽的汤BeautifulSoup解析网页html信息
    soup = BeautifulSoup(req.text, 'lxml')
    
    #用正则匹配url中间的内容,其中\"表示转义这个"\"符号,不懂的小伙伴,要去补一下正则的知识了哦!(.*?)表示懒惰模式下匹配0个或任意个字符,re.S表示包括换行符在内的任意字符,就是说啥都匹配,我全能!!! 
    r = re.compile(r'"url": \"(.*?)",', re.S)
    a = r.findall(soup.text)
    #从第二个开始,即索引为1。然后隔行提取直到最后,这个是Python切片的知识,不懂的小伙伴要去补一补了哈。
    aaa = a[1::2]
    
    print(aaa)
    
    

    输出的结果是这样的。我们打开链接看看,果然是没错的。

    Paste_Image.png

    是不是已经看见了胜利的曙光,好了接下来就方便了。用fp写入文件就好了,黑喂狗。

    from bs4 import BeautifulSoup
    import requests
    import re
    
    #requests.get方法获取response响应
    req = requests.get('http://m.weibo.cn/status/Eq3GVEgEq?luicode=20000061&lfid=4062107219597130&featurecode=20000180#_rnd1492224492863')
    #用美丽的汤BeautifulSoup解析网页html信息
    soup = BeautifulSoup(req.text, 'lxml')
    
    #用正则匹配url中间的内容,其中\"表示转义这个"\"符号,不懂的小伙伴,要去补一下正则的知识了哦!(.*?)表示懒惰模式下匹配0个或任意个字符,re.S表示包括换行符在内的任意字符,就是说啥都匹配,我全能!!! 
    r = re.compile(r'"url": \"(.*?)",', re.S)
    a = r.findall(soup.text)
    #从第二个开始,即索引为1。然后隔行提取直到最后,这个是Python切片的知识,不懂的小伙伴要去补一补了哈。
    aaa = a[1::2]
    
    #定义一个num,用来为文件夹命名,从0开始。以后每次执行循环就+1
    num = 0
    #把aaa集合里面的链接一次次的丢给aa
    for aa in aaa:
    #这里有一个坑要注意,aa得到的是一个个链接,但是我们要的是能够写入的二进制文件,所以这里还是要请求一下链接再转换成二进制文件。
        b = requests.get(aa)
    #为什么要保存成.gif格式呢?因为平时我们可能还要撸一些gif图,如果是写成.jpg,保存下来的gif就动不了,为了偷懒,写成".gif"以后就不用改啦
        with open(str(num)+'.gif', 'wb') as f:
    #b.content就是链接所得到的二进制文件
            f.write(b.content)
            f.close()
    #上面讲过,为了写入文件名的时候用,计数+1
        num = num + 1
    
    

    至此,就得到了如下几张图片

    最终效果

    不到二十行(不信的小伙伴可以把备注全部删掉看看),一个简单的微博撸图神器就完成了。把这个送给每天要爬图的新媒体运营的妹纸,就等着她投来仰慕的眼神,下班约你吃饭,然后去速八,然后嘿嘿嘿吧~

    很重要的废话:转载的话,通知我一声就可以了。就是说通知,不需要等我回复的那种,别拿走了说也不说哈,我生气的话,后果很严重。

    相关文章

      网友评论

          本文标题:20行PYTHON代码爬取微博高清大图,小白练手绝佳案例

          本文链接:https://www.haomeiwen.com/subject/hzjinttx.html