zoukankan      html  css  js  c++  java
  • [python](爬虫)如何使用正确的姿势欣赏知乎的“长得好看是怎样一种体验呢?”问答中的相片

    从在知乎关注了几个大神,我发现我知乎的主页画风突变。经常会出现

    ***长得好看是怎样一种体验呢?
    不用***,却长得好看是一种怎样的体验?
    什么样***作为头像?
    ...

    诸如此类的问答。点进去之后发现果然很不错啊,大神果然是大神,关注的焦点就是不一样。

    看多了几次之后,觉得太麻烦了。作为一个基佬,不,直男,其实并不关注中间的过程(文字)。其实就是喜欢看图片而已,得想个法子方便快捷地浏览,不,是欣赏这些图片。

    下载图片(第一版)

    python果然是个好东西,简单代码就可以方便快捷地down下一个页面中的图片:

    #coding=utf-8
    import urllib
    import re
    
    def getHtml(url):
        page = urllib.urlopen(url)
        html = page.read()
        return html
    
    def getImg(html):
        reg = r'original="([0-9a-zA-Z:/._]+?)" data-actualsrc'
        imgre = re.compile(reg)
        imglist = re.findall(imgre,html)
        x = 0
        for imgurl in imglist:
            print imgurl
            subreg = r'.([a-z]+?$)'
            subre  = re.compile(subreg)
            subs2  = re.findall(subre,imgurl)
            name = 'e://pics/%s.%s' % (x, subs2[0])
            urllib.urlretrieve(imgurl, name)
            x += 1
    
    def getPage(text):
        reg  = r'data-pagesize="([0-9]+?)"'
        rec  = re.compile(reg)
        list = re.findall(rec,text)
        return list[0]
    
    url = "https://www.zhihu.com/question/****"     # 把问题url贴到这里
    html = getHtml(url)
    getImg(html)
    print "page=%s" % getPage(html)
    print "done!"

    运行脚本

    (好像画风不太对啊)

    怎么才几张图片,原文里面应该很多图片的。

    下载图片(第二版)

    调试一下可以发现,网页并不是一次性加载出所有答案的。点击网页最底下的【更多】按钮,服务端才会返回剩下的内容。那么脚本就需要修改一下了:

    1. 先获取页面,从页面中获取页码;
    2. 根据页码,下载下所有页中的图片。
    #coding=utf-8
    import requests
    import shutil
    import re
    import urllib
    import ast
    
    count=0
    def getHtml(url):
        r = requests.get(url)
        return r.text
    
    def saveImage(url, path):
        r = requests.get(url, stream=True)
        if r.status_code == 200:
            with open(path, 'wb') as f:
                r.raw.decode_content = True
                shutil.copyfileobj(r.raw, f)
        del r
        return 0
    
    def getImg(html):
        global count
        reg = r'original="([0-9a-zA-Z:/._]+?)" data-actualsrc'
        imgre = re.compile(reg)
        imglist = re.findall(imgre,html)
        for imgurl in imglist:
            count += 1
            subreg = r'.([a-z]+?$)'
            subre  = re.compile(subreg)
            subs2  = re.findall(subre,imgurl)
            path = 'e://pics/%s.%s' % (count, subs2[0])
            I = saveImage(imgurl, path)
            print '%s --> %s ' % (count, imgurl)
    
    def getPage(text):
        reg  = r'data-pagesize="([0-9]+?)"'
        rec  = re.compile(reg)
        list = re.findall(rec,text)
        return list[0]
    
    question = 27203***          # 问题ID
    url = "https://www.zhihu.com/question/%s" % (question)
    html = getHtml(url)
    getImg(html)
    
    page = int(getPage(html))
    next_url = "https://www.zhihu.com/node/QuestionAnswerListV2"
    
    if page > 1:
        for i_page in range(2, page):
            next_page = i_page * 10
            params = '{"url_token":%s, "pagesize":%s, "offset": %s}' % (question, page, next_page)
            post_data = {'method':'next', 'params':params, '_xsrf': '521beffc0ca2d5747d6d981c6cc25dea'}
            data=urllib.urlencode(post_data)
            headers = {'Content-Type':'application/x-www-form-urlencoded'}
            r = requests.post(next_url, data=data, headers=headers)
            text = r.text
            text = ast.literal_eval(text)
            text = text['msg']
            text = ''.join(text)
            text = text.replace('\', '')
            getImg(text)
    
    print "page=%s" % page
    print "Down %s pics !!!" % count

    再次运行脚本

    画风终于对了,这个脚本顺利地爬下了10页中的所有图片。

    呃,我赶着去欣赏图片去了,拜了个拜。

  • 相关阅读:
    javascript时钟代码
    JavaScript继承 类变量(静态变量)和实例变量
    JavaScript闭包
    javascript经典特效(二)
    得到windows mobile 应用程序的路径
    windows mobile datagrid 样式
    windows mobile 日期问题
    json 字符串反序列化成DataSet
    遇到的错误,以及解决方法
    “xxxx”的重载均与委托“System.Threading.WaitCallback”不匹配
  • 原文地址:https://www.cnblogs.com/rond/p/5585706.html
Copyright © 2011-2022 走看看