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
O21
V2EX  ›  Python

Python 处女座 源码,抓取豆瓣妹子图片,卡壳了。。求助大神

  •  
  •   O21 ·
    ShenXuGongZi · 2014-07-14 22:00:35 +08:00 · 7217 次点击
    这是一个创建于 3883 天前的主题,其中的信息可能已经有所发展或是发生改变。
    代码:
    #-*- coding: utf-8 -*
    import urllib
    import urllib2
    import re
    import time
    import sys
    #解决中文报错
    reload(sys)
    sys.setdefaultencoding('utf-8')
    #HuoQ = 'http://www.douban.com/group/haixiuzu/?ref=sidebar'
    ### 代理模块(全局代理)
    print '#'*50
    print '本程序主要采集豆瓣<请不要害羞>小组的图片'
    print '#'*50
    print '采集前需要输入代理服务器地址,这样可以防止被豆瓣屏蔽.'
    print '推荐一个代理地址: http://cn-proxy.com/'
    print '只需要输入服务器地址以及端口号,不需要输入http'
    print '例子:127.0.0.1:8080'
    print '#'*50
    proxy_input = raw_input('请输入采集代理服务器:')
    proxy_handler = urllib2.ProxyHandler({'http':'%s'%proxy_input})
    opener = urllib2.build_opener(proxy_handler)
    urllib2.install_opener(opener)
    #采集本地路径全局变量
    #img_LuJ = raw_input("路径:")
    #/home/o21/文档/PythonEX/Doubanimg
    #设置UserAgent
    #req = urllib2.Request(HuoQ)
    #req.add_header('User-Agent','Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36')
    #reader = urllib2.urlopen(req)
    #输出
    #print reader.read()
    #模块化输出
    #获取帖子单页html
    def gethtml2(url2):
    html2 = urllib2.urlopen(url2).read().decode('utf-8')
    return html2
    #抽取图片并下载列表
    def gettoimg(html2):
    #添加正则 匹配url路径数字 d+代表获取0-9无限循环\转义符号
    reg2 = r'http://www.douban.com/group/topic/\d+'
    toplist = re.findall(reg2,html2)
    x = 0
    #限制下载图片数量
    #输出topicurl 每次输出一个 的循环
    for topicurl in toplist:
    x+=1
    return topicurl
    #下载图片到本地
    def download(topic_page):
    #获取贴内图片 正则 ".+\" .匹配任意字符 + 匹配前一个字符或无限次 \ 转移符号 也就是 匹配所有字符
    reg3 = r'http://img3.douban.com/view/group_topic/large/public/.+\.jpg'
    imglist = re.findall(reg3,topic_page)
    i = 1
    download_img = None
    for imgurl in imglist:
    #取图片id为文件名
    img_numlist = re.findall(r'p\d{7}',imgurl)
    for img_num in img_numlist:
    download_img = urllib.urlretrieve(imgurl,'/home/o21/文档/PythonEX/Doubanimg/%s.jpg'%img_num)
    time.sleep(1)
    i+=1
    print (imgurl)
    return download_img
    page_end = int(input('请输入采集页码数:'))
    num_end = page_end*25
    num = 0
    page_num = 1
    while num<=num_end:
    #获取页面数 从 0 开始
    html2 = gethtml2('http://www.douban.com/group/haixiuzu/discussion?start=%d'%num)
    #抽取下载图片
    topicurl = gettoimg(html2)
    topic_page = gethtml2(topicurl)
    download_img=download(topic_page)
    # download_img = download(topic_page)
    num = page_num*25
    page_num+=1
    else:
    print('程序采集完成')
    view raw Douban_z hosted with ❤ by GitHub


    目前路径是定死的。。

    我想用
    img_LuJ = raw_input("路径:") 来获取路径
    然后体现在
    68行
    download_img = urllib.urlretrieve(imgurl,'/home/Hang/文档/PythonEX/Doubanimg/%s.jpg'%img_num)
    download这个函数里面

    download_img = urllib.urlretrieve(imgurl,'%r/%s.jpg'%(img_LuJ,img_num))

    这样写。。 可是没用。。 他会获取到
    '/home/xxx'/'sss.jpg 路径上有引号。。。 我很无语。
    第 1 条附言  ·  2014-07-14 22:40:11 +08:00
    @paulw54jrn
    @izoabr
    @77421
    哈哈 感谢回复 我已经搞定啦~~~~
    方法
    引入 os
    import os
    img_LuJ = raw_input("路径:".decode('utf-8'))
    img_LuJ2 = os.path.abspath(img_LuJ)

    然后在函数里面

    download_img = urllib.urlretrieve(imgurl,img_LuJ2 + '/%s.jpg'%img_num)

    这样就木有问题啦~~ 哈哈哈啊哈哈哈哈哈哈~~~~


    题外话。。。 为什么不让我回复了。。。V2ex怎么设置的啊。。我没灌水。。
    "创建新回复过程中遇到一些问题:
    你回复过于频繁了,请稍等 1800 秒之后再试"
    第 2 条附言  ·  2014-07-15 09:50:59 +08:00
    成品源码: http://www.v2ex.com/t/122642

    欢迎指教 嘿嘿?
    23 条回复    2014-08-01 11:31:46 +08:00
    O21
        1
    O21  
    OP
       2014-07-14 22:01:28 +08:00
    =,= 写的有点乱。。新手,,请各位海涵~~
    77421
        2
    77421  
       2014-07-14 22:09:11 +08:00
    用正则。。
    O21
        3
    O21  
    OP
       2014-07-14 22:13:16 +08:00
    @77421 木有太看懂。。是用正则获取用户输入路径吗?
    izoabr
        4
    izoabr  
       2014-07-14 22:16:16 +08:00
    为什么是3个引号?
    Fotix
        5
    Fotix  
       2014-07-14 22:18:27 +08:00
    一看就是抓晒组的,果不其然
    O21
        6
    O21  
    OP
       2014-07-14 22:21:53 +08:00
    @izoabr
    错误是这个
    IOError: [Errno 2] No such file or directory: u"'/home/o21/img'/p8406921.jpg"
    izoabr
        7
    izoabr  
       2014-07-14 22:24:04 +08:00
    @O21 这个IOError是哪行报出来的?
    你试试先拼接目标路径+文件名到一个变量,不用%号去拼
    paulw54jrn
        8
    paulw54jrn  
       2014-07-14 22:27:16 +08:00
    @O21
    错误:
    IOError: [Errno 2] No such file or directory: u'/home/o21/\u6587\u6863/PythonEX/Doubanimg/p1616253.jpg'
    检查下Unicode的问题
    O21
        9
    O21  
    OP
       2014-07-14 22:29:26 +08:00
    @izoabr 我这样写了。
    img_LuJ = raw_input("路径:".decode('utf-8'))

    download_img = urllib.urlretrieve(imgurl,img_LuJ + '/%s.jpg'%img_num)

    然后报错
    IOError: [Errno 2] No such file or directory: u'/home/o21/img/p1611237.jpg'
    paulw54jrn
        10
    paulw54jrn  
       2014-07-14 22:30:24 +08:00
    把下载路径改成 '/tmp/%s.jpg' % img_num 用做测试的话,程序可以跑起来

    paul@PaulMBP:~/Desktop$ ipython test.py
    ##################################################
    本程序主要采集豆瓣<请不要害羞>小组的图片
    ##################################################
    采集前需要输入代理服务器地址,这样可以防止被豆瓣屏蔽.
    推荐一个代理地址: http://cn-proxy.com/
    只需要输入服务器地址以及端口号,不需要输入http
    例子:127.0.0.1:8080
    ##################################################
    请输入采集代理服务器:121.10.120.135:8001
    请输入采集页码数:1
    http://img3.douban.com/view/group_topic/large/public/p16112371.jpg
    http://img3.douban.com/view/group_topic/large/public/p16112380.jpg
    程序采集完成
    O21
        11
    O21  
    OP
       2014-07-14 22:30:26 +08:00
    @paulw54jrn 我这次木有用中文,也报错。。我楼上写了。。 很郁闷。
    paulw54jrn
        12
    paulw54jrn  
       2014-07-14 22:39:10 +08:00
    这样试试?

    file = "/home/o21/img/%s.jpg" % img_num
    try:
    download_img = urllib.urlretrieve(imgurl,file)
    except IOError:
    os.mkdir(file.[:file.rfind("/")])
    paulw54jrn
        13
    paulw54jrn  
       2014-07-14 22:39:46 +08:00
    唔..偷懒没用gist..
    缩进乱了..不过你懂的..
    kawaiiushio
        14
    kawaiiushio  
       2014-07-15 03:04:34 +08:00
    求成品分享
    O21
        15
    O21  
    OP
       2014-07-15 03:21:41 +08:00
    @kawaiiushio 在这里下载吧 HOHO http://162.244.92.122/DouBanMZ.zip
    WhyLiam
        16
    WhyLiam  
       2014-07-15 07:55:24 +08:00
    和我一样,我也前天写了抓 害羞组 图片的程序。同道中人啊
    但是写的比你简单多了。。。
    已经抓了近1700页了
    eslizn
        17
    eslizn  
       2014-07-15 08:01:55 +08:00
    我是来看害羞组的
    xavierskip
        18
    xavierskip  
       2014-07-15 08:32:50 +08:00
    哈哈,我写过抓取虎扑相册的工具。起初也是为了抓妹子图。

    http://hualbum.duapp.com/
    puyo
        19
    puyo  
       2014-07-15 10:15:15 +08:00
    可以加入多线程,速度要快一些。
    dingyaguang117
        20
    dingyaguang117  
       2014-07-15 10:34:53 +08:00
    至少 socket 的timeout 要加吧,不然死都不知道怎么死的
    sujin190
        21
    sujin190  
       2014-07-15 11:28:10 +08:00
    看来写过多注释也有不利的时候。。
    shyrock
        22
    shyrock  
       2014-07-15 22:27:19 +08:00
    请教解决中文报错那段是啥意思?
    horizon
        23
    horizon  
       2014-08-01 11:31:46 +08:00
    为什么要用代理?在header里直接加入cookies就可以了啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2662 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 03:16 · PVG 11:16 · LAX 19:16 · JFK 22:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.