爬取妹子图(python):爬虫(bs+rq)+ gevent多线程

原创 2017年07月15日 19:51:47

爬取妹子图(python):爬虫(bs+rq)+ gevent多线程

简介

我观察爬取妹子图算是爬虫专业户必做的事情之一,所以我也做了一个,结果是有3.45GB,49847张图。

打算依靠这个图库做个妹子颜值打分系统,或者别的什么图像处理的小项目。

Beautiful Soup + Requests 的学习算是告一段落了,下面开始尝试scrapy和Sasila。

https://github.com/DarkSand/Sasila

推荐一下Sasila。

scrapy的确对于新手很不友好。

代码已经全部上传至github:https://github.com/sileixinhua/beautiful_photo_scrapy

已经把图都下下来的同学,请给我github加个星,就当是给我辛苦费了,谢谢。

开发环境

Beautiful Soup 4.4.0 文档: http://beautifulsoup.readthedocs.io/zh_CN/latest/#id28

Requests : http://cn.python-requests.org/zh_CN/latest/

Python3

gevent : http://xlambda.com/gevent-tutorial/

Windows10

sublime (打算马上转战visual code)

爬虫目标网站

http://www.zjito.com/

图1 :图片页面显示

这里写图片描述

图2 :图片页面重点HTML标签显示

这里写图片描述

图3 :图片页面url地址

这里写图片描述

爬虫策略

对网站HTML标签代码进行分析。

在图片页面下每一张图分很多页,但是在第一页中就有这一女孩图的所有页面地址。

soup.find_all(class_="div-num")

获取所有div-num类下的信息,再

.get('data-src')

所有图片的地址,很简单的步策略,但是我分析了半天,尝试了集中方法,还从首页开始暴力检索链接判断图像,分析了半天才发现可以简化这么简单。

代码

# 时间:2017年7月13日17:39:57
# silei
# http://www.zjito.com/
# 爬取妹子图片 bs4 + re + gevent 多线程爬虫
# 存储文件地址为 '../photo'

import requests
from bs4 import BeautifulSoup
import urllib
import gevent
from gevent import Greenlet
import socket
import random

def cbk(a,b,c):  
    '''''回调函数 
    @a:已经下载的数据块 
    @b:数据块的大小 
    @c:远程文件的大小 
    '''  
    per=100.0*a*b/c  
    if per>100:  
        per=100  
    print('%.2f%%' % per)

def photo_download(photo_thread, index_number, photo_number, number):
    while number < 3564 :
        try:
            i = 0
            number = number + 1
            url = 'http://www.zjito.com/dqfl/'+dict[i]+'/'+str(index_number)+'.shtml?idx=1'
            # 爬虫目标网站地址
            headers = {'user-agent': 'my-app/0.0.1'}
            r = requests.get(url, headers=headers)
            # 获得目标页面返回信息
            print(r.status_code)
            print(url)
            while r.status_code == 404:
            # 判断响应状态码           
                i = i + 1
                url = 'http://www.zjito.com/dqfl/'+dict[i]+'/'+str(index_number)+'.shtml?idx=1'
                print(url)
            else :
                soup = BeautifulSoup(r.text, 'html.parser')
                # 返回的信息放入soup中
                # 获取页面全部标签信息
                # print(soup.prettify())
                # 测试显示的是否是页面的标签     
                for link in soup.find_all(class_="div-num"):
                    print(link.get('data-src'))
                    # 输出图片地址
                    socket.setdefaulttimeout(3.0)
                    # 设置超时
                    photo_number = photo_number + 1
                    urllib.request.urlretrieve(link.get('data-src'), file+'/'+str(photo_thread)+'_'+str(photo_number)+'.jpg', cbk)
                    # 下载图片并显示下载进度
                    gevent.sleep(random.randint(0,2)*0.001)
        except Exception as e:          
            index_number = index_number + 1
        index_number = index_number + 1

if __name__ == '__main__':
    dict = ['zgnd', 'tw', 'xg', 'rb', 'hg', 'mlxy', 'tg', 'om', 'hx',]
    # 照片分类
    photo_thread = [1, 2]
    # 线程计数器
    photo_number = -1
    # 下载图片计数器,最大50
    # index_number = 530273
    # 页面计数器,最小530273,最大544527
    file = '../photo/'
    # 图片的保存地址
    thread1 = Greenlet.spawn(photo_download, photo_thread[0], 530273, photo_number, 0)
    # 从命名中创建,并运行新的Greenlet的包装器
    # 函数photo_download,带有传递的参数
    thread2 = gevent.spawn(photo_download, photo_thread[1], 533836, photo_number, 0)
    # 两个thread运行,一个从530273页面开始爬取,另一个从537400页面开始爬取
    # 537400 - 530273 = 7127
    # 7127 / 2 = 3564
    # 3564 + 530273 = 533836
    threads = [thread1, thread2]
    # 阻止所有线程完成
    gevent.joinall(threads)

结果

结果是有3.45GB,49847张图。
这里写图片描述

这里写图片描述

感想

没有什么感想了,看书,跑步,写代码ing。。。

——————————————————————————————————-

有学习机器学习相关同学可以加群,交流,学习,不定期更新最新的机器学习pdf书籍等资源。

QQ群号: 657119450

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

[Mac]从Terminal 中用 Finder 打开当前路径的文件夹

在Terminal中输入命令:  open   .

Finder与终端间的快速切换

http://blog.cnrainbird.com/index.php/2012/03/17/307/#more-307 原文 在mac的使用过程中,你经常会有这样的需求:通过F...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

[Mac OS X] 从Finder快速进入当前目录的命令行

参考:http://www.howtogeek.com/210147/how-to-open-terminal-in-the-current-os-x-finder-location/ 方法一: ...

软件架构设计-五视图方法论

1.每个人都可以做成为架构设计师 不懂软件的和刚入行的人们一听到架构设计,都认为是非常的高大上课题,是一个遥不可及的领域,一般人是不能做的。听起来云里雾里的,第一印象除了来自微软,阿里这些NB...

(3)php爬虫---mysql大批数据导入数据库-4种方法比较

今天心情不错,继续来填我的爬虫项目的坑,在这里我已经拿到了优酷动漫上的数据了,大约有3000条左右。正是数据量有点多,不可能人工用手填入数据库的,不然还不累死,而且还会出错,这样子做不靠谱是最笨的方法...

Python3.X 爬虫实战(动态页面爬取解析)

有时候我们使用静态下载器与解析器对一些要爬取的页面进行解析时竟然没有任何数据,其实大多原因都是我们要爬取的元素是 JS 动态生成的,譬如我们爬取今日头条页面,你会发现今日头条随着我们手指上滑其页面会无...

Python爬虫系列(三)多线程爬取斗图网站(皮皮虾,我们上车)

斗图我不怕 最近看了Python多线程的相关内容,并且前几天观看了腾讯课堂潭州学院上面的关于斗图网爬取的公开课,课程内容大致是利用Python多线程爬取斗图(多页),并将图片保存到本地。自...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)