首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

Python 那位大神帮忙看一下 这段爬虫代码 跑一会儿就停了 没报错 也没提示就是不动了

  •  
  •   mojito · 26 天前 · 4378 次点击
        # -*- coding:utf-8 -*-
    
    # 声明:知乎上某个答主写的爬虫脚本,代码没有整理,自己重新整理排版了,已经调试并通过
    #      本人 Java 程序员,对 python 不熟,不过代码里面逻辑大概能看懂一些,这位答主的脚本是 python2 写的,
    #      我自己是 python3 的环境,所以有些细微的改动,目的是为了兼容 python3 可以正常运行
    #
    #      原始脚本地址: https://www.zhihu.com/question/297715922/answer/676693318
    #      如果觉得我冒犯了你的话,可以私信联系我,我删除。
    
    import re
    import requests
    import os
    import urllib.request
    import ssl
    
    from urllib.parse import urlsplit
    from os.path import basename
    
    # 全局禁用证书验证
    ssl._create_default_https_context = ssl._create_unverified_context
    
    headers = {
        'User-Agent': "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
        'Accept-Encoding': 'gzip, deflate'
    }
    
    
    def mkdir(path):
        if not os.path.exists(path):
            print('新建文件夹:', path)
            os.makedirs(path)
            return True
        else:
            print(u"图片存放于:", os.getcwd() + os.sep + path)
            return False
    
    
    def download_pic2(img_lists, dir_name):
        print("一共有{num}张照片".format(num=len(img_lists)))
    
        # 标记下载进度
        index = 1
    
        for image_url in img_lists:
            file_name = dir_name + os.sep + basename(urlsplit(image_url)[2])
    
            # 已经下载的文件跳过
            if os.path.exists(file_name):
                print("文件{file_name}已存在。".format(file_name=file_name))
                index += 1
                continue
    
            auto_download(image_url, file_name)
    
            print("下载{pic_name}完成!({index}/{sum})".format(pic_name=file_name, index=index, sum=len(img_lists)))
            index += 1
    
    
    def auto_download(url, file_name):
        # 递归下载,直到文件下载成功
        try:
            urllib.request.urlretrieve(url, file_name)
        except urllib.request.ContentTooShortError:
            print("文件下载不完整,重新下载。")
            auto_download(url, file_name)
        except urllib.request.URLError:
            print("网络连接出错,尝试重新下载。")
            auto_download(url, file_name)
    
    
    def download_pic(img_lists, dir_name):
        print("一共有{num}张照片".format(num=len(img_lists)))
        for image_url in img_lists:
            response = requests.get(image_url, stream=True)
            if response.status_code == 200:
                image = response.content
            else:
                continue
    
            file_name = dir_name + os.sep + basename(urlsplit(image_url)[2])
    
            try:
                with open(file_name, "wb") as picture:
                    picture.write(image)
            except IOError:
                print("IO Error\n")
                continue
            finally:
                picture.close()
    
            print("下载{pic_name}完成!".format(pic_name=file_name))
    
    
    def get_image_url(qid, headers):
        # 利用正则表达式把源代码中的图片地址过滤出来
        # reg = r'data-actualsrc="(.*?)">'
        tmp_url = "https://www.zhihu.com/node/QuestionAnswerListV2"
        size = 10
        image_urls = []
    
        session = requests.Session()
    
        while True:
            postdata = {'method': 'next',
                        'params': '{"url_token":' + str(qid) + ',"pagesize": "10",' + '"offset":' + str(size) + "}"}
            page = session.post(tmp_url, headers=headers, data=postdata)
            ret = eval(page.text)
            answers = ret['msg']
            print(u"答案数:%d" % (len(answers)))
    
            size += 10
    
            if not answers:
                print("图片 URL 获取完毕, 页数: ", (size - 10) / 10)
                return image_urls
    
            # reg = r'https://pic\d.zhimg.com/[a-fA-F0-9]{5,32}_\w+.jpg'
            imgreg = re.compile('data-original="(.*?)"', re.S)
    
            for answer in answers:
                tmp_list = []
                url_items = re.findall(imgreg, answer)
    
                for item in url_items:  # 这里去掉得到的图片 URL 中的转义字符'\\'
                    image_url = item.replace("\\", "")
                    tmp_list.append(image_url)
    
                # 清理掉头像和去重 获取 data-original 的内容
                tmp_list = list(set(tmp_list))  # 去重
                for item in tmp_list:
                    if item.endswith('r.jpg'):
                        print(item)
                        image_urls.append(item)
    
            print('size: %d, num : %d' % (size, len(image_urls)))
    
    
    if __name__ == '__main__':
        title = '拥有一副令人羡慕的好身材是怎样的体验?'
        question_id = 297715922
    
        # title = '身材好是一种怎样的体验?'
        # question_id = 26037846
    
        # title = '女孩子胸大是什么体验?'
        # question_id = 291678281
    
        # title = '女生什么样的腿是美腿?'
        # question_id = 310786985
    
        # title = '你的择偶标准是怎样的?'
        # question_id = 275359100
    
        # title = '什么样才叫好看的腿?'
        # question_id = 63727821
    
        # title = '身材对女生很重要吗?'
        # question_id = 307403214
    
        # title = '女生腿长是什么样的体验?'
        # question_id = 273711203
    
        # title = '女生腕线过裆是怎样一种体验?'
        # question_id = 315236887
    
        # title = '有着一双大长腿是什么感觉?'
        # question_id = 292901966
    
        # title = '拥有一双大长腿是怎样的体验?'
        # question_id = 285321190
    
        # title = '大胸女生如何穿衣搭配?'
        # question_id = 26297181
    
        # title = '胸大到底怎么穿衣服好看?'
        # question_id = 293482116
    
        zhihu_url = "https://www.zhihu.com/question/{qid}".format(qid=question_id)
        path = str(question_id) + '_' + title
        mkdir(path)  # 创建本地文件夹
        img_list = get_image_url(question_id, headers)  # 获取图片的地址列表
        download_pic2(img_list, path)  # 保存图片
    
    91 回复  |  直到 2019-05-22 15:45:51 +08:00
        1
    libaibuaidufu   26 天前
    可以运行 图片不错哦 是不是环境没有配对
        2
    xabc   26 天前
    原谅我 ,我笑了 😊
        3
    vcinex   26 天前 via Android
    1024
        4
    Outliver0   26 天前
    能跑,我直接复制的代码,图片可以的
        5
    libaibuaidufu   26 天前
    第一个就 3000 张图片 知乎会不会把我 ip 限制了
        6
    Outliver0   26 天前
    我下了六百多,关了,怕被封
        7
    zhze93   26 天前
    我佛了
        8
    jdgui   26 天前
    我怀疑你是来开车的,但是我没有证据
        9
    CSM   26 天前 via Android
    感谢分享,楼主好人一生平安
        10
    kkjinping   26 天前
    这是啥,是车吗
        11
    j4fun   26 天前
    我怀疑你是来开车的,但是我没有证据
        12
    Raynard   26 天前
    楼主你好,楼主再见
        13
    lonelygo   26 天前
    疑车无据
        14
    Eiden   26 天前 via Android
    不多说了,感谢楼主
        15
    fuchunliu   26 天前 via Android
    看了评论,赶紧打开电脑跑一下是啥图片😏
        16
    xloong   26 天前 via iPhone
    给 requests 等网络请求增加超时限制
        17
    Takamine   26 天前
    楼主放我出去,这不是去幼儿园的车!!!
        18
    wfd0807   26 天前
    设置超时时间,以前遇到过,requests 默认超时不报错,会一直等下去
        19
    hmxxmh   26 天前   ♥ 1
    谢谢,是你带我走上了爬虫的道路
        20
    hasoidhaio   26 天前
    好人一生平安 xd
        21
    purgle   26 天前 via Android
    一般是请求读超时阻塞了,对于外部请求,最好把 connect timeout 和 read timeout 都加上
        22
    stzz   26 天前   ♥ 4
    本人 Python 也不熟,但看到代码里的中文,我觉得我可以熟
        23
    dingyaguang117   26 天前
    不用看内容就知道是 socket 超时没设置
        24
    Zakl21   26 天前 via Android
    我要试试了
        25
    mrnull0   26 天前
    看前面说的,可能是 socket 的坑,这个坑我遇到过,只能加上延时了
        26
    sama666   25 天前 via Android
    这不是开往秋名山的车,放我下来
        27
    xwcs   25 天前 via Android
    我怀疑你在开车但是我没有证据,请求超时了吧
        28
    zw1027   25 天前
    楼主好人一生平安
        29
    wwg1994   25 天前
    我怀疑你在开车,并且证据确凿(俺硬盘都满了!)
        30
    d0m2o08   25 天前
    立即靠边停车,接受检查!
        31
    dreamusername   25 天前
    龟龟如何提高 python 爬虫水平
        32
    mojito   25 天前
    @libaibuaidufu 我的也能跑 但是下到 50 多张的时候就停了 没反应!
        33
    mojito   25 天前
    @Outliver0 我才能下 60 多张 然后就不动了!
        34
    mojito   25 天前
    @xloong 具体怎么加呢?指导一下!谢谢!
        35
    keepeye   25 天前
    这么漂亮的屁股,答应我别用来拉屎好吗? 233333
        36
    Outliver0   25 天前
    @mojito 我什么都没干,就运行一下代码,估计你被限制了
        37
    liujie333333   25 天前   ♥ 1
    以前还用过 tumblr 一键拉图的脚本, 那个更伤身体[滑稽]
        38
    libaibuaidufu   25 天前   ♥ 1
    @mojito 我 3000 多张都下载完了。。。。。 是不是你测试很多次 然后被封了 还能看知乎吗。。。
        39
    tikazyq   25 天前
    不管是不是开车,爬友们可以关注下爬虫平台 crawlab,更方便的管理你的爬虫,https://github.com/tikazyq/crawlab
        40
    coeo91   25 天前 via iPhone
    我桌面上莫名出现新建文件夹是不是有爬虫来过?
        41
    ervqq   25 天前
    代码车。。。。
        42
    mojito   25 天前
    @libaibuaidufu 还能看
        43
    xloong   25 天前 via iPhone
    @mojito 搜一下 requests timeout
        44
    gimp   25 天前
    我怀疑你在开车,并且电脑里已经保存了证据!
        45
    aaa5838769   25 天前
    楼主,你不用代理么,胆子这么大么= =
        46
    CatTom   25 天前
    车门已焊死,谁都别想下
    https://s2.ax1x.com/2019/05/21/EzN6BR.png
        47
    zhangpeter   25 天前
    上车了
        48
    pytth   25 天前
    感觉是好东西。

    ![微信图片_20190521105602.png]( https://i.loli.net/2019/05/21/5ce368d753edb20750.png)
        49
    xiaohuangya   25 天前
    我可以下载完成一个问题的图片,没有卡住。
        50
    Motoi   25 天前
    快让我下车
        51
    karottc   25 天前 via iPhone
    没问题。正常运行完成,一行没改。

    下载 297715922_拥有一副令人羡慕的好身材是怎样的体验?/v2-84eef01f7096b357aa0ae6f84aa65651_r.jpg 完成!(2974/2975)
    下载 297715922_拥有一副令人羡慕的好身材是怎样的体验?/v2-db77d7aebfea4516c2e05c06cbca9532_r.jpg 完成!(2975/2975)
        52
    jakeyfly   25 天前
    @dingyaguang117 scoket 怎么加延迟啊
        53
    TimPeake   25 天前
    楼主好人一生平安
        54
    usingnamespace   25 天前 via iPhone
    @dreamusername 爬虫真的是个简单玩意 大部分都跟好爬的 除了一些地狱难度的
        55
    usingnamespace   25 天前 via iPhone
    @coeo91 别人怎么可能可以在你那儿建文件夹
        56
    gosansam   25 天前
    稍等我安装一个 p3 的环境嗷
        57
    lofbat   25 天前
    疑开车,无证据
        58
    sola97   25 天前
    这个下载不行,会卡住,存一下 url 然后 aria2c -i 即可
        60
    gosansam   25 天前
    下载 297715922_拥有一副令人羡慕的好身材是怎样的体验?/v2-c12cfa89db2468492f195061f13c4420_r.jpg 完成!(2982/2982)
        61
    onecode   25 天前
    我决定写个.net core 的版本
        62
    xdlucky   25 天前
    下好的老哥能不能给个网盘, 我想看看爬虫的质量如何, 谢谢
        63
    jxf2008   25 天前
    ```c++
    while(0)
    {

    }
    ```
    楼主干脆把你的测试网站一起贴上来吧。。
        64
    glaucus   25 天前
    LZ 好人,变相发福利
        65
    aborigine   25 天前
    加了个循环已经跑到第四个问题了😂
        66
    ETiV   25 天前 via iPhone
    ……

    希望 iCloud 剪切板可以保持到我拉完屎还能在电脑上粘贴
        67
    registerrr   25 天前
    运行了一半我给它停住了,只建了个空文件夹没有下载?
        68
    onecode   25 天前
    那个,有没有搞个机器学习把跟主题无关的图片过滤掉呢
        69
    ioschen   25 天前
    以前看过爬虫作者发的这个,
    你复制过来开车干嘛,开车痕迹太大😂

    -------------------------
    python2 用户

    改动 1
    import urllib
    #import urllib.request

    改动 2
    from urlparse import urlsplit
    #from urllib.parse import urlsplit

    做两处改动,然后所有的 urllib.request 改为 urllib
        70
    wqzjk393   25 天前
    之前写的一个,只要 request 出错就暂停几秒钟然后随机更换 agent ip 之类的,继续做 request,直到成功才跳出循环。。用这个爬了笔趣阁好几本书。。。( https://s2.ax1x.com/2019/05/21/VSAF0A.png)
        72
    l0o0   25 天前
    我这边测试了之后达到了最大的循环数,就停止了
        73
    fhsan   25 天前   ♥ 1
        74
    goodryb   25 天前
    代码没毛病,似乎知乎没有因为这种情况屏蔽 IP
        75
    imyip   25 天前
    刚好在写队列, 把 img_list 扔进队列,开启多线程下载
        76
    danson1895   25 天前
    疑车无据
        77
    SbloodyS   25 天前
    这个车。。。
        78
    killerv   25 天前
    我怀疑你在开车
        79
    luolw1998   25 天前
    图不错😍
        80
    Rooney   25 天前
    楼主牛批,让我这个基本上不懂编程的非计算机专业的小白,在自己的摸索下第一次体验了爬虫的快乐,千言万语,不如一句先撸为精。
        81
    skymei   25 天前
    感谢楼主,已上车
        82
    Immortal   25 天前
    加入收藏 从此走上爬虫路
        83
    WantMarryGakki   25 天前
    等一个大神上传,分享链接
        84
    wangfei324017   25 天前
    6ZO+5o6lOmh0dHBzOi8vcGFuLmJhaWR1LmNvbS9zLzFsa3lLWHFlc005SFpWSFlkVkFObU9nICDlr4bnoIE6bWJlaw==
    @WantMarryGakki #83
    @Immortal #82
        85
    564425833   25 天前
    #84 大佬已经给了
        86
    a781305886   25 天前
    为了看福利 我踏马一个 php 跑去学了一下午的 py 终于跑起了
        87
    siboom   25 天前
    1024
        88
    yuanyunguoyan   25 天前
    成功运行,谢谢楼主
        89
    hyy1995   25 天前
    这个开车方式,很别致
        90
    aa1072551507   24 天前
    很好,看到这 我觉得我前端要转爬虫了
        91
    jzds001   24 天前
    😀
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   776 人在线   最高记录 5043   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 20:55 · PVG 04:55 · LAX 13:55 · JFK 16:55
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1