V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
raighne
V2EX  ›  Python

python 爬虫怎么把 url 类似于 www.xxx.com/0001.jpgwww.xxx.com/9999.jpg 范围的图片保存到本地啊

  •  
  •   raighne · 2016-02-22 14:58:06 +08:00 · 7742 次点击
    这是一个创建于 3203 天前的主题,其中的信息可能已经有所发展或是发生改变。
    46 条回复    2016-02-23 18:29:42 +08:00
    leeyiw
        1
    leeyiw  
       2016-02-22 15:05:42 +08:00
    shell:
    `for i in {0..9999}; do wget www.xxx.com/$i.jpg; done`
    supersf
        2
    supersf  
       2016-02-22 15:06:26 +08:00
    有地址了直接下载不就好了。
    donghouhe
        3
    donghouhe  
       2016-02-22 15:11:58 +08:00 via iPad
    关键在于什么?在于产生 0001-9999 , for num in xrange(1, 10000) str(num).zfill(4)
    yougg
        4
    yougg  
       2016-02-22 15:14:34 +08:00   ❤️ 2
    一楼的不满足条件.

    是从 0001 到 9999
    不是从 1 到 9999

    应该这样:

    for i in {10001..19999}; do
    wget www.xxx.com/${i:1}.jpg;
    done
    skydiver
        5
    skydiver  
       2016-02-22 15:15:48 +08:00   ❤️ 1
    @yougg 为什么这么麻烦,直接写{0001..9999}不就行了
    yougg
        6
    yougg  
       2016-02-22 15:20:29 +08:00
    @skydiver

    你的 shell 是什么版本可以直接遍历{0001..9999}直接生成
    0001, 0002, 0003, 0004 ...... 9999
    这样的带前缀的序列码?

    我的 bash 不行
    izoabr
        7
    izoabr  
       2016-02-22 15:23:06 +08:00
    @leeyiw 对呀,还 py 神马 thon 啊
    skydiver
        8
    skydiver  
       2016-02-22 15:24:13 +08:00
    @yougg
    试了两个版本的都可以啊,我也一直这么用的

    GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

    GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)

    难道旧版的不行么?
    Laobai
        9
    Laobai  
       2016-02-22 15:24:25 +08:00
    我不小心点了下 URL ,好污
    vincenttone
        10
    vincenttone  
       2016-02-22 15:26:16 +08:00
    for i in {1..10}; do echo www.xxx.com/`printf %04d $i`.jpg;done
    yangxiongwei
        11
    yangxiongwei  
       2016-02-22 15:26:20 +08:00
    @Laobai 我去,既然有这种网站....

    域名不错
    vincenttone
        12
    vincenttone  
       2016-02-22 15:26:52 +08:00
    @vincenttone 应该是 for i in {1..9999}; do wget www.xxx.com/`printf %04d $i`.jpg;done
    yougg
        13
    yougg  
       2016-02-22 15:27:55 +08:00
    @skydiver

    看来是新版本特性, 我这里生产环境版本都很老.

    # bash --version
    GNU bash, version 3.2.51(1)-release (x86_64-suse-linux-gnu)
    Copyright (C) 2007 Free Software Foundation, Inc

    $ bash --version
    GNU bash, version 3.1.23(1)-release (i686-pc-msys)
    Copyright (C) 2005 Free Software Foundation, Inc.
    skydiver
        14
    skydiver  
       2016-02-22 15:29:27 +08:00
    @yougg 这也太老了。。。
    yougg
        15
    yougg  
       2016-02-22 15:31:17 +08:00
    @skydiver

    公司的环境那是没办法 :)

    还是我那个绕弯的方法能兼容.
    tSQghkfhTtQt9mtd
        16
    tSQghkfhTtQt9mtd  
       2016-02-22 16:53:25 +08:00
    @Laobai 我去瞎了
    DIYgod
        17
    DIYgod  
       2016-02-22 16:55:10 +08:00
    @liwanglin12 我举报楼主涉嫌传播色情网站
    rock_cloud
        18
    rock_cloud  
       2016-02-22 16:58:50 +08:00
    seq -w 1 1000
    @donghouhe
    raighne
        19
    raighne  
    OP
       2016-02-22 17:14:59 +08:00
    @DIYgod 我随便输入的一个网址啊,竟然 我无辜啊
    @yangxiongwei
    @Laobai
    em70
        20
    em70  
       2016-02-22 17:21:24 +08:00 via iPhone
    不用写程序,迅雷和快车都直接这种地址批量下载,设置规则即可
    ChefIsAwesome
        21
    ChefIsAwesome  
       2016-02-22 17:23:34 +08:00
    我不是搞 python 的,不了解 python 爬虫的机制,只是看到这帖子好奇,顺便问下:上万个图片下载,一个下完接下一个么?会不会太慢,中间出错了怎么办
    YUX
        22
    YUX  
       2016-02-22 17:25:10 +08:00 via Android
    @ChefIsAwesome 错了 pass
    DaCong
        23
    DaCong  
       2016-02-22 17:38:28 +08:00
    强烈建议各位在发帖的时候不要再使用 xxx.com 作为域名的示范,实在不行用 google.com 虚构一个也好啊
    raighne
        24
    raighne  
    OP
       2016-02-22 17:51:04 +08:00
    @DaCong 明白了,多谢提醒
    zhjits
        25
    zhjits  
       2016-02-22 20:58:40 +08:00
    @DaCong URL 里面的 host 标准示例: example.com (可戳)
    lhbc
        26
    lhbc  
       2016-02-22 21:30:07 +08:00
    curl -O "http://www.xxx.com/[0001-9999].jpg"
    Frapples
        27
    Frapples  
       2016-02-22 21:56:06 +08:00
    @ChefIsAwesome 可以使用多线程下载,比如开五个线程同时下载五张图片,带宽足够就能加速 5 倍。当然实际考虑的情况还有其它的因素。
    mianju
        28
    mianju  
       2016-02-22 22:41:41 +08:00
    要不开十个线程,每个线程下 1000 个图片?
    SlipStupig
        29
    SlipStupig  
       2016-02-22 22:49:10 +08:00
    import urllib2, os

    downloader = lambda number:[(open(str(k), 'wb').write(urllib2.urlopen('http://baidu.com/%s' % i).read())) for i in xrange(number) for k in xrange(number)]
    print downloader(999)
    raysonx
        30
    raysonx  
       2016-02-22 22:58:54 +08:00
    @DaCong RFC 中保留了 gTLD 中的 example.com example.orgexample.net 作为示范域名
    MyFaith
        31
    MyFaith  
       2016-02-22 23:15:46 +08:00
    楼主问的是 Python ,为什么回复都是 shell ?改变了问题的本意
    macroideal
        32
    macroideal  
       2016-02-22 23:47:38 +08:00
    讯雷都这个功能.
    imlinhanchao
        33
    imlinhanchao  
       2016-02-23 00:20:22 +08:00
    @MyFaith 同问。
    toono
        34
    toono  
       2016-02-23 03:04:02 +08:00
    有地址的话,迅雷的批量下载可以根据表达式下载 XD
    Liang
        35
    Liang  
       2016-02-23 08:36:01 +08:00
    迅雷下载啊,哥哥
    dawncold
        36
    dawncold  
       2016-02-23 08:45:52 +08:00
    @yougg 我的 zsh 也是可以的, zsh 5.0.2 (x86_64-pc-linux-gnu)
    billion
        37
    billion  
       2016-02-23 09:01:13 +08:00
    import requests
    content = requests.get('http://xxx.com/1.jpg').content
    with open('1.jpg', 'wb') as f:
    f.write(content)
    laobaozi
        38
    laobaozi  
       2016-02-23 09:10:10 +08:00
    我点开了链接.......
    楼主是想干什么
    latteczy
        39
    latteczy  
       2016-02-23 09:39:12 +08:00
    我记得有个 retrive 方法,可能拼写不对
    firemiles
        40
    firemiles  
       2016-02-23 10:44:24 +08:00
    curl http://example.com/pic[0001-9999].jpg
    dant
        41
    dant  
       2016-02-23 12:04:42 +08:00
    @MyFaith 因为这个问题并不需要用 Python
    SlipStupig
        42
    SlipStupig  
       2016-02-23 12:35:51 +08:00
    @latteczy
    import urllib

    downloader = lambda number:[urllib.urlretrieve('http://baidu.com/%s' % i, '%s.jpg' % i) for i in xrange(number)]
    downloader(1)
    MyFaith
        43
    MyFaith  
       2016-02-23 16:12:45 +08:00
    @dant 确实不需要用 Python ,但是楼主的问题就是关于 Python 的,也许人家是在学习,你们这样改了问题的本意,对楼主本人帮助不大,他问的问题不是:有什么好的方法 而是: Python 怎么做到。
    jinxihexi
        44
    jinxihexi  
       2016-02-23 18:25:12 +08:00
    楼主,你的问题感觉有点难呢。推荐一个程序员专用看干货,找大牛,勾搭妹纸的必备 APP 神器,叫同行说,上面很多干货和同行经验交流哦!
    administrator321
        45
    administrator321  
       2016-02-23 18:25:25 +08:00
    @donghouhe 这个就可以
    suixn
        46
    suixn  
       2016-02-23 18:29:42 +08:00
    #!/usr/bin/env python
    # coding=utf-8


    import urllib
    import time
    import urllib.request
    import os

    def getPhoto(num):
    response = urllib.request.urlopen('http://example.com/getuserphoto.jsp?userid=20135%s'%num)
    thePage = response.read()
    f = open(('./photo1/%s.jpg'%(num)),'wb')
    f.write(thePage)
    f.close()

    stunum = 1
    while(stunum <= 9999):
    if stunum < 10:
    stu_num = '000%d'%(stunum)
    elif stunum < 100:
    stu_num = '00%d'%(stunum)
    elif stunum < 1000:
    stu_num = '0%d'%(stunum)
    else:
    stu_num = stunum
    getPhoto(stu_num)
    #time.sleep(1)
    stunum = stunum + 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2850 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 06:57 · PVG 14:57 · LAX 22:57 · JFK 01:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.