80行Python代码实现自动爬取色情网站图片

用Python爬取色情网站的图片,技术宅的小玩具。在这里我将会向你详细介绍用Python下载一个色情网站图片的全部步骤,你会从中看到Python的简洁以及技术宅的无聊。

首先你应该应该有一个色情网站的网址,当然我不会给你的,自己找!!!我会告诉你其中的规律:

http://www.*****.com/htm/piclist【1】/【2】.htm

一个色情网站的图片区中,URL不同的只有【1】【2】两处,通过观察你可以发现,【1】处表示图片种类(丝袜美腿、清纯唯美、****、and so on),【2】处表示当前分类的第N页目录,所以。首先我们可以构建一个表示图片列表目录URL地址:

baseurl = 'http://www.*****.com/htm/piclist%s/%s.htm'
urls = [baseurl % (x,y) for x in xrange(1,10) for y in xrange(1,10)]

这即是当前网站所有图片分类的所有前9页内容。

然后来分析每页目录的结构:

可以看出,每一条目录对应着一个<a>标签并被包含在一个<li>中,故以此可以构建一个分析HTML页面的解析器:

class ImgIdxPageParser(sgmllib.SGMLParser):
    ''' parse a image index page '''
    def __init__(self):
        sgmllib.SGMLParser.__init__(self)
        self.imgurlList = []
        self.tagList = []
        self.ontitle = False
    def unknown_starttag(self, tag, attrs):
        if tag == 'li':
            self.tagList.append('li')
        elif tag == 'a' and len(self.tagList):
            self.imgurlList.append(WEBSITE + attrs[0][1])
        elif tag == 'title':
            self.ontitle = True
    def unknown_endtag(self,tag):
        if tag == 'li':
            self.tagList.pop()
        elif tag == 'title':
            self.ontitle = False
    def handle_data(self, data):
        if self.ontitle:
            title = data.decode('utf-8').encode('gb2312').strip()
            self.title = title[:title.find('_')]
                        

由于使用到sgmllib.SGMLParser,我们应该先import sgmlib。在ImgIdxPageParser中,我们通过title保存当前页面所处的分类,用imgurlList保存每一条目录地址。关于sgmllib.SGMLParser的介绍,请点击这里

对此,我们构建一个函数,返回指定目录下的分类名称以及目录列表:

def getPageUrlList(page):
    ''' get title and all the pages list of a picIndex page '''
    parser = ImgIdxPageParser()
    parser.feed(urllib2.urlopen(page).read())
    return parser.imgurlList, parser.title

这个函数返回page页面里的所有目录条目以及所处的分区(丝袜美腿、清纯唯美、****、and so on)。

接着我们打开其中一个图片页分析如下:

理所当然,图片链接被放置在<img>的‘src’中,对此,我们构建第二个解析器——用于解析图片页面的每个图片的地址:

class ImagePageParser(sgmllib.SGMLParser):
    ''' parse a image page's image urls '''
    def __init__(self):
        sgmllib.SGMLParser.__init__(self)
        self.imgurlList = []
    def unknown_starttag(self, tag, attrs):
        if tag == 'meta' and attrs[0][1] == 'description':
            self.title = attrs[1][1].decode('utf-8').encode('gb2312').strip()
        elif tag == 'img':
            for key, value in attrs:
                self.imgurlList.append(value) if key == 'src' else None 

在ImagePageParser中,我们通过title保存当前页面的标题,用imgurlList保存每一个图片的地址。同样我们需要构建一个函数来使用ImagePageParser,并返回所有的图片地址以及这些图片的标题:

def getImageUrlList(pageUrl):
    ''' get all image urls from a page '''
    parser = ImagePageParser()
    parser.feed(urllib2.urlopen(pageUrl).read())
    return parser.imgurlList, parser.title

getImageUrlList函数返回pageUrl页面里所有图片的地址以及这个页面的标题。

由于我们的得到的所有地址都是以列表形式展现出来,所以我们需要一个函数,一次性把一个列表中所有的图片下载下来:

def downloadImage(imgList, save=''):
    ''' download images of a list '''
    if not (os.path.exists('save') and os.path.isdir(save)):
        try:
            os.makedirs(save)
        except Exception,e:pass
    for x in imgList:
        try:
            filename = save + '\\' + x[x.rfind('/') + 1:]
            print filename
            urllib.urlretrieve(x, filename)
        except Exception, e:
            print 'exception catched:', e

在downloadImage函数中,我们接收一个图片地址列表和一个保存路径(非必须,如果没有则在当前目录下保存),函数开始时if是为了保证在传入的save路径不存在时,先创建一个文件夹。然后是遍历图片地址的列表,通过urllib.urlretrieve()函数来下载每一个图片。关于urllib的详细介绍,请点击这里。我们在for里面使用try-except的目的是,当下载一张图片发生错误时(网络断线、文件IO出错或者任何未知错误时),不会让整个程序崩溃掉。

当准备工作完成以后,我们就可以开始下载图片了,剩下的任务就是对刚才所有的积木进行拼装整合了:

if __name__ == '__main__':
    basepath = 'G:\\__temp\\'
    baseurl = 'http://www.*****.com/htm/piclist%s/%s.htm'
    urls = [baseurl % (x,y) for x in xrange(1,10) for y in xrange(1,10)]
    for url in urls:
        try:
            pagelist, outtitle = getPageUrlList(url)
            print outtitle, pagelist
            for page in pagelist:
                imglist, intitle = getImageUrlList(page)
                downloadImage(imglist, save= basepath + outtitle + '\\' + intitle)
        except Exception, e:
            print 'excepiton catched:' , e

这就完成了对程序的组合,到此就可以实现自动下载色情网站的图片了,而且由于对标题的处理,我们得到的将会是按照网站上保存结构同样的目录层级。

当然程序到这里还有很多需要处理的,比如为了提高效率我们需要多线程的加入,对图片下载可能的错误做完整的处理等等,对此,请记住一句话:自力更生,丰衣足食!

时间: 2024-12-13 07:00:55

80行Python代码实现自动爬取色情网站图片的相关文章

20 行python代码抓取网页中所有JPG图片

#!/usr/bin/python import re import urllib def getHtml(url): page = urllib.urlopen(url) html = page.read() return html def getImg(html): reg = r'src="(.*?\.jpg)" width' imgre = re.compile(reg) imglist = re.findall(imgre, html) num = 0 for imgurl

20行Python代码爬取王者荣耀全英雄皮肤

引言 王者荣耀大家都玩过吧,没玩过的也应该听说过,作为时下最火的手机MOBA游戏,咳咳,好像跑题了.我们今天的重点是爬取王者荣耀所有英雄的所有皮肤,而且仅仅使用20行Python代码即可完成. 准备工作 爬取皮肤本身并不难,难点在于分析,我们首先得得到皮肤图片的url地址,话不多说,我们马上来到王者荣耀的官网: 我们点击英雄资料,然后随意地选择一位英雄,接着F12打开调试台,找到英雄原皮肤的图片地址: 接着,我们切换一下英雄的皮肤,会发现图片地址没有明显的变化,只是最后的数字序号改变了,我们将两

10 行 Python 代码实现模糊查询/智能提示

10 行 Python 代码实现模糊查询/智能提示 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列表供用户选择. 样例如下: Vim (Ctrl-P) Sublime Text (Cmd-P) '模糊匹配'这是一个极为有用的特性,同时也非常易于实现. 2.问题分析: 我们有一堆字符串(文件名)集合,我们根据用户的输入不断进行过滤,用户的输入可能是字符串的一部分.我们就以下面的

200行Python代码实现2048

200行Python代码实现2048 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环境,实验中会用到桌面上的程序: LX终端(LXTerminal): Linux命令行终端,打开后会进入Bash环境,可以使用Linux命令 GVim:非常好用的编辑器,最简单的用法可以参考课程Vim编辑器 3. 环境使用 使用GVim编辑器输入实验所需的代码及文件,使用LX终端(LXTerminal)运行所需命令进行操

几行python代码解决相关词联想

日常生活中经常会遇到相关词联想的问题,也就是说输入一个词汇,把相关的词汇查询出来,听起来这个做法也不是太难,但如何去积累那么多的词汇,再用好的算法将相关内容联系起来,本身还是不简单的.笔者认为最简单的办法还是调用相关接口,省去不少麻烦,几行python代码就能搞定了. # -*- coding: utf-8 -*- # flake8: noqa __author__ = 'wukong' import urllib from urllib import urlencode #配置您申请的appK

基于Tkinter用50行Python代码实现简易计算器

Tkinter一般是python自带的,所以代码不需要其他组件,本程序是在python2.7版本实现的. 主要涉及了tkinter的使用,函数定义和调用,匿名函数的使用,类成员函数定义等python基础知识,适合新手学习. 代码如下: from Tkinter import * #创建横条型框架 def frame(root, side): w = Frame(root) w.pack(side = side, expand = YES, fill = BOTH) return w #创建按钮

一起来写2048(160行python代码)

前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到2048,两周后决赛再次遇到2048,后来五月份的广东省赛,又出现了2048.在这三次比赛过程中,我一次2048都没玩过..全靠队友的解释,直到昨天,我突然想起写个2048吧,于是下了个2048玩了几盘,之后就開始用python来写了,心想就不写界面了,为了简洁. 我对python并不熟悉,可是我在之前

10行python代码实现约瑟夫问题

什么是约瑟夫问题? 约瑟夫问题是一个有趣的数学游戏,游戏规则如下: 1.N个人围成一个圈,编号从1开始,依次到N. 2.编号为M的游戏参与者开始报数,报数从1开始,后面的人报数接龙,直到K为止,报数为K的人将出局. 3.出局者的下一个玩家接着从1开始报数,如此循环,直到剩下一个玩家时游戏结束,这个玩家就是游戏获胜者. 那么问题来了,哪个编号是游戏获胜者呢? 下面通过简单的几行python代码来解决这个问题: #!/usr/bin/env python # Joseph Problem def j

vim中注释多行python代码

在vim中注释多行python代码比较麻烦,主要由以下几种方法: (1)将需要注释的代码以文档字符串的形式呈现 (2)将需要注释的代码以函数的形式呈现 (3)使用vim自身快捷键 我们主要使用第三种方式,下面是注释和取消注释的方法. 1.多行注释: 1. 首先按esc进入命令行模式下,按下Ctrl + v,进入列(也叫区块)模式; 2. 在行首使用上下键选择需要注释的多行; 3. 按下键盘(大写)"I"键,进入插入模式: 4. 然后输入注释符("//"."