关闭

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

标签: 爬虫多线程美女图片
4163人阅读 评论(4) 收藏 举报
分类:

爬取妹子图(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

这里写图片描述

2
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Gevent中爬虫与多线程详解

gevent实现爬虫并与普通多线程比较 1.爬虫目的与思路简介; 2.gevent实现爬虫; 3.多线程实现爬虫; 4.对比。 爬虫目的与设计 1.从一个主页爬取相关链接; 2.比如麦子学院主站; 3.http://www.maiziedu.com; 4.从此网站爬取内容,分析过滤...
  • lidiya007
  • lidiya007
  • 2017-01-05 18:04
  • 741

python爬虫——多线程+协程(threading+gevent)

上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫。这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测可提高效率至少十倍以上。 本文既然提到了线程和协程,我觉得有必要在此对进程、线程、协程做一个简...
  • qq_23926575
  • qq_23926575
  • 2017-07-30 13:37
  • 934

python网络爬虫(五):并发抓取

在进行单个爬虫抓取的时候,我们不可能按照一次抓取一个url的方式进行网页抓取,这样效率低,也浪费了cpu的资源。目前python上面进行并发抓取的实现方式主要有以下几种:进程,线程,协程。进程不在的讨论范围之内,一般来说,进程是用来开启多个spider,比如我们开启了4进程,同时派发4个spider...
  • hjhmpl123
  • hjhmpl123
  • 2016-11-28 15:11
  • 3400

gcrawler:一个基于gevent的简单爬虫框架

模仿Scrapy的工作方式用gevent实现了一个简单的爬虫小框架:gcrawler
  • Raptor
  • Raptor
  • 2011-03-06 16:54
  • 15497

Gevent中爬虫与多线程详解

gevent实现爬虫并与普通多线程比较 1.爬虫目的与思路简介; 2.gevent实现爬虫; 3.多线程实现爬虫; 4.对比。 爬虫目的与设计 1.从一个主页爬取相关链接; 2.比如麦子学院主站; 3.http://www.maiziedu.com; 4.从此网站爬取内容,分析过滤...
  • lidiya007
  • lidiya007
  • 2017-01-05 18:04
  • 741

python爬虫——多线程+协程(threading+gevent)

上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫。这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测可提高效率至少十倍以上。 本文既然提到了线程和协程,我觉得有必要在此对进程、线程、协程做一个简...
  • qq_23926575
  • qq_23926575
  • 2017-07-30 13:37
  • 934

python网络爬虫(五):并发抓取

在进行单个爬虫抓取的时候,我们不可能按照一次抓取一个url的方式进行网页抓取,这样效率低,也浪费了cpu的资源。目前python上面进行并发抓取的实现方式主要有以下几种:进程,线程,协程。进程不在的讨论范围之内,一般来说,进程是用来开启多个spider,比如我们开启了4进程,同时派发4个spider...
  • hjhmpl123
  • hjhmpl123
  • 2016-11-28 15:11
  • 3400

python 并发编程(多进程、多线程、gevent)

本人原创,转载请注明出处,合法转载 1.python 多进程+gevent实现并发 #!/bin/env python #-*- coding: UTF-8 -*- from __future__ import print_function from multiprocessing import ...
  • yanshu2012
  • yanshu2012
  • 2015-12-30 15:42
  • 2355

python gevent多线程练习

最近上课时老师说,你们现在写的程序全是垃圾,你们现在必须建立起来一个多线程的概念,只有在多线程或者多进程下你们的程序才能看起来像样子.这两天偶然看到gevent可以来实现多线程,于是做一些小的练习!       首先下载gevent模块: pip...
  • wangyu190810
  • wangyu190810
  • 2013-10-06 10:27
  • 7002

python模块介绍-gevent介绍:基于协程的网络库

本文转自:http://my.oschina.net/u/1433482/blog/192562?p=1 原 python模块介绍-gevent介绍:基于协程的网络库 赞3 摘要 gevent是基于协程的Python网络库。特点: 基于libev的快速事件...
  • bluehawksky
  • bluehawksky
  • 2015-07-21 11:12
  • 986
    个人资料
    • 访问:125940次
    • 积分:2200
    • 等级:
    • 排名:第19838名
    • 原创:90篇
    • 转载:0篇
    • 译文:4篇
    • 评论:133条
    联系方式
    QQ联系方式
    作者日本硕士
    知识长期输入中
    技术长期磨练中
    如有问题或交流
    请QQ联系 649508982
    来者请说明CSDN
    或者加入机器学习交流群
    不定期发送pdf等学习资源
    QQ群号:657119450
    机器学习 QQ群加入
    博客专栏