资讯专栏INFORMATION COLUMN

使用python抓取百度漂流瓶妹纸照片

bang590 / 3262人阅读

摘要:无意中发现贴吧也出了个漂流瓶的东西,随手翻了翻发现居然有好多妹子图,闲来无事于是就想写个爬虫程序把图片全部抓取下来。具体获取一页内容的如下看参数很容易明白,就是当前页码,就是当前页中包含的漂流瓶数量。

无意中发现贴吧也出了个漂流瓶的东西,随手翻了翻发现居然有好多妹子图,闲来无事于是就想写个爬虫程序把图片全部抓取下来。

这里是贴吧漂流瓶地址
http://tieba.baidu.com/bottle...

1.分析

首先打开抓包神器 Fiddler ,然后打开漂流瓶首页,加载几页试试,在Fiddler中过滤掉图片数据以及非 http 200 状态码的干扰数据后,发现每一页的数据获取都很有规律,这就给抓取提供了便利。具体获取一页内容的url如下:

http://tieba.baidu.com/bottle...

看参数很容易明白,page_number 就是当前页码,page_size 就是当前页中包含的漂流瓶数量。

访问后得到的是一个json格式的数据,结构大致如下:

{
    "error_code": 0,
    "error_msg": "success",
    "data": {
        "has_more": 1,
        "bottles": [
            {
                "thread_id": "5057974188",
                "title": "美得不可一世",
                "img_url": "http://imgsrc.baidu.com/forum/pic/item/a8c87dd062d9f2d3f0113c2ea0ec8a136227cca9.jpg"
            },
            {
                "thread_id": "5057974188",
                "title": "美得不可一世",
                "img_url": "http://imgsrc.baidu.com/forum/pic/item/a8c87dd062d9f2d3f0113c2ea0ec8a136227cca9.jpg"
            },
            ...
   }
}

内容很直白一眼就看出,bottles 中的数据就是我们想要的(thread_id 瓶子具体id, title 妹纸吐槽的内容, img_url 照片真实地址),遍历 bottles 就可以获得当前页的所有漂流瓶子。(其实现在得到的只是封面图哦,打开具体的瓶子有惊喜,因为我比较懒就懒得写了,不过我也分析了内部的数据,具体url是:http://tieba.baidu.com/bottle...瓶子thread_id>)

还有一个参数 has_more 猜测是是否存在下一页的意思。
到这里采集方式应该可以确定了。就是从第一页不停往后循环采集,直到 has_more 这个参数不为 1 结束。

2.编码

这里采用的是 python2.7 + urllib2 + demjson 来完成此项工作。urllib2 是python2.7自带的库,demjson 需要自己安装下(一般情况下用python自带的json库就可以完成json解析任务,但是现在好多网站提供的json并不规范,这就让自带json库无能为力了。)

demjson 安装方式 (windows 不需要 sudo)

sudo pip install demjson

或者

sudo esay_install demjson

2.1获得一页内容
def bottlegen():
    page_number = 1
    while True:
        try:
            data = urllib2.urlopen(
                "http://tieba.baidu.com/bottle/bottles?page_number=%d&page_size=30" % page_number).read()
            json = demjson.decode(data)
            if json["error_code"] == 0:
                data = json["data"]
                has_more = data["has_more"]
                bottles = data["bottles"]
                for bottle in bottles:
                    thread_id = bottle["thread_id"]
                    title = bottle["title"]
                    img_url = bottle["img_url"]
                    yield (thread_id, title, img_url)
                if has_more != 1:
                    break
                page_number += 1
        except:
            raise
            print("bottlegen exception")
            time.sleep(5)

这里使用python的生成器来源源不断的输出分析到的内容。

2.2根据url保存图片数据
for thread_id, title, img_url in bottlegen():
    filename = os.path.basename(img_url)
    pathname = "tieba/bottles/%s_%s" % (thread_id, filename)
        print filename
        with open(pathname, "wb") as f:
            f.write(urllib2.urlopen(img_url).read())
            f.close()
2.3全部代码如下
# -*- encoding: utf-8 -*-
import urllib2
import demjson
import time
import re
import os

def bottlegen():
    page_number = 1
    while True:
        try:
            data = urllib2.urlopen(
                "http://tieba.baidu.com/bottle/bottles?page_number=%d&page_size=30" % page_number).read()
            json = demjson.decode(data)
            if json["error_code"] == 0:
                data = json["data"]
                has_more = data["has_more"]
                bottles = data["bottles"]
                for bottle in bottles:
                    thread_id = bottle["thread_id"]
                    title = bottle["title"]
                    img_url = bottle["img_url"]
                    yield (thread_id, title, img_url)
                if has_more != 1:
                    break
                page_number += 1
        except:
            raise
            print("bottlegen exception")
            time.sleep(5)

def imggen(thread_id):
    try:
        data = urllib2.urlopen(
            "http://tieba.baidu.com/bottle/photopbPage?thread_id=%s" % thread_id).read()
        match = re.search(r"\_.Module.use("encourage/widget/bottle",(.*?),function(){});", data)
        data = match.group(1)
        json = demjson.decode(data)
        json = demjson.decode(json[1].replace("
", ""))
        for i in json:
            thread_id = i["thread_id"]
            text = i["text"]
            img_url = i["img_url"]
            yield (thread_id, text, img_url)
    except:
        raise
        print("imggen exception")

try:
    os.makedirs("tieba/bottles")
except:
    pass

for thread_id, _, _ in bottlegen():
    for _, title, img_url in imggen(thread_id):
        filename = os.path.basename(img_url)
        pathname = "tieba/bottles/%s_%s" % (thread_id, filename)
        print filename
        with open(pathname, "wb") as f:
            f.write(urllib2.urlopen(img_url).read())
            f.close()

运行后会先获得每页所有瓶子,然后再获得具体瓶子中的所有图片,输出到 tieba/bottles/xxxxx.jpg 中。(因为比较懒就没做错误兼容,见谅 ^_^,,,)

结论

结论是,,, 都是骗人的就首页有几张好看的 - -,,, 他喵的,,,

最后贴下采集成果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/38580.html

相关文章

  • Python爬虫基础:爬取妹子图片并保存到本地

    摘要:作为爬虫的入门教程,我想有必要来个爬虫程序压压惊,爬取性感美女的图片,然后保存到自己的电脑里面。爽歪歪先看下效果吧,这是我把爬取的图片自动存储到的文件夹里边爬虫三步骤抓取,分析,存储。相关文章入门基础有趣的教程 作为 Python 爬虫的入门教程,我想有必要来个爬虫程序压压惊,爬取性感美女的图片,然后保存到自己的电脑里面。爽歪歪~ 先看下效果吧,这是我把爬取的图片自动存储到的文件夹里边...

    happyfish 评论0 收藏0
  • 零基础如何学爬虫技术

    摘要:楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,。本文来源知乎作者路人甲链接楚江数据提供网站数据采集和爬虫软件定制开发服务,服务范围涵盖社交网络电子商务分类信息学术研究等。 楚江数据是专业的互联网数据技术服务,现整理出零基础如何学爬虫技术以供学习,http://www.chujiangdata.com。 第一:Python爬虫学习系列教程(来源于某博主:htt...

    KunMinX 评论0 收藏0
  • 手把手教你用Python爬虫煎蛋妹纸海量图片

    摘要:我们的目标是用爬虫来干一件略污事情最近听说煎蛋上有好多可爱的妹子,而且爬虫从妹子图抓起练手最好,毕竟动力大嘛。服务器超载尤其是对给定服务器的访问过高时。个人爬虫,如果过多的人使用,可能导致网络或者服务器阻塞。 我们的目标是用爬虫来干一件略污事情 最近听说煎蛋上有好多可爱的妹子,而且爬虫从妹子图抓起练手最好,毕竟动力大嘛。而且现在网络上的妹子很黄很暴力,一下接受太多容易营养不量,但是本着...

    tuantuan 评论0 收藏0
  • 【“探探”为例】手把手教你用最少的代码实现各种“机器人”

    摘要:探探机器人,自动根据不同妹纸汉子颜值年龄等类型,喜欢忽略,欢迎各位先看一下实现的结果吧今天要讲的主题是使用脚本实现你自己想要自动操控的任意手机。 前言 之前写了篇文章:【全是干货】谈谈如何学习一项新技能,没有理论,全是实战,里面第五点提到用脚本玩探探,昨天花了一个小时实现了该功能。 Github:探探机器人,自动根据不同妹纸/汉子颜值、年龄等类型,喜欢、忽略,欢迎各位star 先看一下...

    worldligang 评论0 收藏0
  • 首次公开,整理12年积累的博客收藏夹,零距离展示《收藏夹吃灰》系列博客

    摘要:时间永远都过得那么快,一晃从年注册,到现在已经过去了年那些被我藏在收藏夹吃灰的文章,已经太多了,是时候把他们整理一下了。那是因为收藏夹太乱,橡皮擦给设置私密了,不收拾不好看呀。 ...

    Harriet666 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<