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

这里写图片描述

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

相关文章推荐

java反编译工具在线安装

最近做项目,需要查看一些jar包中的类,搜索了百度,80%都是手动下载jad.exe,还有一个相关的jar包,这个方法一般可以满足要求。但是很不幸,无论如何也装不成功,把jad.exe放入jdk后,M...

Nmap源码分析(操作系统扫描)

Nmap源码分析(操作系统扫描) 2012年9月1日     Nmap第四个核心功能是操作系统侦测,包括识别出操作系统类型、版本号、目标机硬件平台类型及附加信息(如TCP序号产生方式、IPID...

Python爬取京东评论(多线程+队列+bs4+pymysql)

1、 概述本博客纯属原创,如有转载,请注明作者 运行环境:python3.5所需模块:bs4 ,queue.thread,pymysql,requests,大家如果想运行此代码,只需要将我标粗并斜体...

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

上一篇博客中我介绍了如何将爬虫改造为多进程爬虫,但是这种方法对爬虫效率的提升不是非常明显,而且占用电脑cpu较高,不是非常适用于爬虫。这篇博客中,我将介绍在爬虫中广泛运用的多线程+协程的解决方案,亲测...

【Python】从爬虫开始吧——爬取妹子图整站

首先得解决环境和工具的问题 Python基础教程 Python3基础教程 大家也可以去慕课网看视频学习哦,关于选择Python2还是Python3的问题,上手的话还是直接选择3吧。关于爬虫爬虫就...

Python Scrapy爬虫,整站爬取妹子图

Python Scrapy爬虫,听说妹子图挺火,我整站爬取了,上周一共搞了大概8000多张图片。和大家分享一下。 项目地址:https://github.com/ZhangBohan/fun_cra...

python——图片爬虫:爬取爱女神网站(www.znzhi.net)上的妹子图 基础篇

python学习第一步——爬图,而爬图第一步——妹子图 这篇博客我将带领大家通过urllib2+BeautifulSoup来完成对网站:爱女神 上妹子图的爬取,大家坐稳,发车啦! 一、分析网站 爱...

python 爬虫及multiprocessing包——多线程爬取并解析百度贴吧某贴小trick

preface:看极客学院关于xpath的视频时,偶然看到可以用multiprocessing进行多线程爬取网页,只有小段代码,故先贴出来。mark下。 coding: #!/usr/bin/env...

Python 爬虫多线程爬取美女图片保存到本地

Wanning 我们不是生产者,我们只是搬运工 资源来至于qiubaichengren ,代码基于Python 3.5.2 友情提醒:血气方刚的骚年。请谨慎 阅图 !!! 谨慎 阅图 !!! ...
  • cch1024
  • cch1024
  • 2017年01月18日 15:24
  • 1799

Python 爬虫 多线程爬取百度贴吧内容,并将内容存到本地

功能: 1、爬取百度贴吧内容: 回帖时间 回帖内容 回帖人 2、通过xpath来提取属性,并将提取的属性写入到txt文件中 3、多线程实现 下面是代码:# -*-...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:爬取妹子图(python):爬虫(bs+rq)+ gevent多线程
举报原因:
原因补充:

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