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

搞不定了,谁来帮我下。

  •  
  •   wex · 2016-05-06 23:53:35 +08:00 · 3778 次点击
    这是一个创建于 2912 天前的主题,其中的信息可能已经有所发展或是发生改变。
    可以采集到首页所有的连接,一共 98 页。
    但是内容页采集一直出错,要么是在同一页面一直循环,要么是内容页一直循环,跳不出去。
    如果可以的话,最好能写上去重。

    万分感谢
    17 条回复    2016-05-08 00:24:00 +08:00
    wex
        1
    wex  
    OP
       2016-05-07 11:06:03 +08:00 via Android
    有人帮忙呢?
    xiahei
        2
    xiahei  
       2016-05-07 13:45:44 +08:00
    楼主图站不错。
    wex
        3
    wex  
    OP
       2016-05-07 13:51:11 +08:00 via Android
    @xiahei 代码呢?
    wex
        4
    wex  
    OP
       2016-05-07 14:10:30 +08:00
    在顶一下,我是是在搞不定才来问的。、
    xiahei
        5
    xiahei  
       2016-05-07 14:12:01 +08:00
    @wex 没有仔细看你的代码,但是,只需要用 BeautifulSoup 就完全能够把图片地址全给爬下来,然后, urlretrieve 即可。
    wex
        6
    wex  
    OP
       2016-05-07 14:16:56 +08:00
    @xiahei 我爬出来的图片地址只有每个页面的第一个图片,然而进去页面也有很多图片,就不会了,
    我想着用循环即可,但是循环控制不好,跳不出去。一直就是要么在一个页面一直抓去,要么在内容页一直抓取(┬_┬)
    cphilo
        7
    cphilo  
       2016-05-07 14:25:06 +08:00
    楼主抓这个做什么?
    wex
        8
    wex  
    OP
       2016-05-07 14:28:15 +08:00
    @cphilo 学习。~ ~!
    xiahei
        9
    xiahei  
       2016-05-07 14:31:44 +08:00
    http://paste.ubuntu.com/16272437/
    诺,这样大概符合你的要求吧。
    xiahei
        10
    xiahei  
       2016-05-07 14:33:10 +08:00
    @wex 得到了每个相册地址再去里边把图片抓下来。 Nice!
    望楼主注意身体。
    wex
        11
    wex  
    OP
       2016-05-07 14:41:51 +08:00
    @xiahei 我知道得到相册地址,再进去把里面的图片抓下来,但是他运行完,不进行下一次抓取了,反而是循环抓取某一个页面,我如果用 continue 的话,那个进去的图片地址就一直循环,就是说,比如第一个相册有 22 张图,第二个连接相册也只能获取到 22 个,同理第三个一样
    xiahei
        12
    xiahei  
       2016-05-07 14:56:26 +08:00
    @wex 你仔细去分析相册 url 和相册里面每张图片 url 的规律,就会发现.对应图片的 url 就是对应相册的图片加上对应 index 。比如某相册的 url 为`http://www.souutu.com/mnmm/xgmm/7980.html`, 显示有 45 张图片,通过源码看见,对应 45 张图片的 url 都为`http://www.souutu.com/mnmm/xgmm/7980_**.html`(**从 1-45 ),而且发现,所有的相册都是这样的规律,这样一来都不用进每个相册再抓图片地址了。抓到相册地址和图片数直接列表解析就能吧图片地址全抓出来了。
    wex
        13
    wex  
    OP
       2016-05-07 15:11:37 +08:00
    @xiahei 大概明白你意思了!我在研究下
    imn1
        14
    imn1  
       2016-05-07 16:27:34 +08:00
    你的程序挺难读的,一来我不用 bs ,我多用正则;二来这个站三层页面,逐个循环抓,费劲
    这个站其实很好抓,参看 12 楼,其实可以放掉第一层页面,直接抓第二层,然后第三层只抓第一页(只需获取最大值:图片张数)就够了,然后按规律生成 url ,而不是抓取 url ,而且文字信息第一页就全了,没必要继续抓后面的 html
    由于 url 是生成的,也没有必要去重了

    这样的网站,别说瀑布流,连 referer 都没有用,爬虫像挠痒痒太舒服了,至少比抓微博图简单得多,直接用 shell+curl+wget 可能更快
    不过作为集图者,对这样的站也没什么兴趣,图片都是低质量压缩,还打上水印,早期练手就会拿来玩
    bdbai
        15
    bdbai  
       2016-05-07 17:22:50 +08:00
    @imn1 搭车问一下微博图有哪些坑,最近准备爬。
    imn1
        16
    imn1  
       2016-05-07 17:42:12 +08:00
    @bdbai
    好久没爬过了,据闻现在发现会封号……惊!
    以前的话就是抓包 XHR 比较麻烦
    qqmishi
        17
    qqmishi  
       2016-05-08 00:24:00 +08:00   ❤️ 1
    #encoding=utf8
    import requests
    import re

    def get_page_url(num):
    if num is 1:
    url = "http://www.souutu.com/mnmm/index.html"
    else:
    url = "http://www.souutu.com/mnmm/index_"+str(num)+".html"
    r = requests.get(url).content
    return re.findall("<a href=\"http://www.souutu.com/mnmm/([^\"]+).html\" target=\"_blank\"><img lazy", r)

    def get_pic_number(page_url):
    url = "http://www.souutu.com/mnmm/"+page_url+".html"
    r = requests.get(url).content
    return int(re.search("共(\d+)张",r).group(1))

    def get_pic_url(page_url,number):
    l=[]
    for i in range(1,number+1):
    if i is 1:
    url = "http://www.souutu.com/mnmm/"+page_url+".html"
    else:
    url = "http://www.souutu.com/mnmm/"+page_url+"_"+str(i)+".html"
    r = requests.get(url).content
    pic_url = re.search("<img id=\"bigImg\" src=\"([^\"]+)\"",r).group(1)
    l.append(pic_url)
    return l

    for i in range(1,99):
    page_urls = get_page_url(i)
    for page_url in page_urls:
    number = get_pic_number(page_url)
    pic_urls = get_pic_url(page_url,number)


    建议楼主去学习下正则,比 bs4 方便的多,适用范围也广。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1886 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:32 · PVG 00:32 · LAX 09:32 · JFK 12:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.