文档章节

python抓图脚本

周贰
 周贰
发布于 2014/08/24 17:55
字数 1087
阅读 26
收藏 0
'''
Created on 2013-2-1
@author: 蒲文辉
@mailto: pwh0996@gmail.com
运行环境:Python 3
'''
#coding:utf-8
import re
import urllib.request
from html.parser import HTMLParser
from html.parser import HTMLParseError
import os
import threading
import time

class MyHtmlParser(HTMLParser):
    url = []
    img = []
    title = 0
    charset = ''
    def __init__(self):
        HTMLParser.__init__(self)
        self.url = []
        self.img = []
        self.title = []
        self.charset = ''
    def handle_starttag(self, tag, attrs):
        if tag == "a":
            for i in attrs:
                if i[0] == "href":
                    self.url.append(i[1])
        elif tag == "meta":
            for i in attrs:
                if (i[0] == 'content' and i[1].find('charset'))\
                   or i[0] == 'charset':
                    if re.match('.*(GB2312|gb2312).*',str(i[1])):
                        self.charset = 'gb2312'
                    elif re.match('.*(utf-8|UTF-8).*',str(i[1])):
                        self.charset = 'utf-8'
                    elif re.match('.*(gbk|GBK).*',str(i[1])):
                        self.charset = 'gbk'
        elif tag == "title":
            self.title = 1
        for i in attrs:
            if re.match('http://.+\.(jpg|jepg|png)',str(i[1])):
                self.img.append(i[1])

    def handle_data(self, data):
        if self.title == 1:
            self.title = data
        findimg = re.findall('http://.+?\.jpg',data)
        for i in range(0,len(findimg)):
                    findimg[i] = findimg[i]
        self.img += findimg

    def handle_startendtag(self, tag, attrs):
        if tag == "a":
            for i in attrs:
                if i[1] == "href":
                    self.url.append(i[1])
        elif tag == "meta":
            for i in attrs:
                if (i[0] == 'content' and i[1].find('charset'))\
                   or i[0] == 'charset':
                    if re.match('.*(GB2312|gb2312).*',str(i[1])):
                        self.charset = 'gb2312'
                    elif re.match('.*(utf-8|UTF-8).*',str(i[1])):
                        self.charset = 'utf-8'
                    elif re.match('.*(gbk|GBK).*',str(i[1])):
                        self.charset = 'gbk'
        for i in attrs:
            if re.match('http://.+\.(jpg|jepg|png)',str(i[1])):
                self.img.append(i[1])

class ScratchFactory(threading.Thread):
    url = ''
    tempUrls = []
    tempImgs = []
    title = ''
    pwd = ''
    def __init__(self,url):
        threading.Thread.__init__(self)
        self.url = url
        self.tempImgs = []
        self.tempUrls = []
        self.title = []
        global seed
        match = re.search(seed + '.*/',url)
        if match:
            self.pwd = match.group()

    def addHeader(self,data):
        global seed
        for i in range(0,len(data)):
            if re.match("http.+", data[i]) == None:
                if re.match("/.*",data[i]):
                    data[i] = seed + data[i]
                elif re.match('./.*',data[i]):
                    data[i] = self.pwd + data[i][2:]
                else:
                    data[i] = self.pwd + data[i]
        return data
    def run(self):
        try:
            conect = urllib.request.urlopen(self.url)    #下载网页数据
            data = conect.read()
            conect.close()
            htmlx = MyHtmlParser()
            htmlx.feed(data[:500].decode('utf-8','ignore'))
            t = htmlx.charset                            #获得html编码
            if t == '':
                t = 'gb2312'
            htmlx.reset()
            htmlx.feed(data.decode(t,'ignore'))
            self.title = htmlx.title
            self.tempUrls = self.addHeader(htmlx.url)    #给相对路径链接加上头
            self.tempImgs = self.addHeader(htmlx.img)
            htmlx.close()
            self.clearData()                             #过滤无用链接
            threading.Thread(target = self.saveImages,args = () ).start()  #下载图片
        except HTMLParseError as e:
            print("####Error : 1 ######:",e , '--->',  self.url)
        except Exception as e:
            print("####Error : 2 ######:",e , '--->' , self.url)

        global UrlSrc,UrlDiged,mLock
        mLock.acquire()
        t = []
        for temp in self.tempUrls:
            if not UrlDiged.__contains__(temp):
                t.append(temp)
        l = []
        for temp in t:
            if not UrlSrc.__contains__(temp):
                l.append(temp)
        UrlSrc += l
        mLock.release()

    def clearData(self):
        #去除重复链接
        self.tempUrls = set(self.tempUrls)
        self.tempImgs = set(self.tempImgs)
        global seed
        t = []
        for temp in self.tempUrls:                    #<-链接过滤,正则表达式
            if re.match(seed + "/.*", temp):
                t.append(temp)
        self.tempUrls = t

        t = []
        #global ImgDiged
        #global iLock
        #iLock.acquire()
        for temp in self.tempImgs:                    #<-图片过滤,正则表达式
            if re.match(".+.(gif|jpg|png)",temp):
                t.append(temp)
        #iLock.release()
        self.tempImgs = t
        self.title = self.title.split('-')[0]         #<-页面标题分隔,截取title中关键字
        #去除title中非法字符
        self.title = self.title.replace(' ','')
        self.title = self.title.replace('/','')
        self.title = self.title.replace('\\','')
        self.title = self.title.replace(':','')
        self.title = self.title.replace('|','')
        self.title = self.title.replace('?','')
        self.title = self.title.replace('*','')
        self.title = self.title.replace('<','')
        self.title = self.title.replace('>','')
        self.title = self.title.replace('\r','')
        self.title = self.title.replace('\n','')
        self.title = self.title.replace('\t','')

    def save(self,path,url):
        global MinSize
        try:
            req = urllib.request.Request(url)
            req.add_header("User-Agent", "Mozilla/5.0 (Windows NT 6.1) \
            AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11")
            req.add_header("Referer",self.url)         #有些网站防盗链,所以自己加上头
            conect = urllib.request.urlopen(req)
            t = conect.read()
            conect.close()
            if t.__len__() < MinSize:
                return
            if not os.path.exists(path):
                os.mkdir(path)
            f = open(path + "\\" + self.title + time.strftime("%H%M%S",\
                     time.localtime()) + ".jpg","wb")
            f.write(t)
            f.close()
        except HTMLParseError as e:
            print("####Error : 3 ######:",e , '--->',  url)
        except Exception as e:
            print("####Error : 4 ######:",e , '--->',  url)

    def saveImages(self):
        global IMG_TIME
        global SAVE_PATH
        if len(self.tempImgs) == 0:
            return
        path = SAVE_PATH + '\\' + self.title
        print("Downdow------->",self.title)
        while len(self.tempImgs) != 0:
            t = threading.Thread(target=self.save,args=\
                                 (path,self.tempImgs.pop(0)))
            if len(self.tempImgs) != 0:
                t.start()
                time.sleep(IMG_TIME)
            else:
                t.start()
                t.join()
                if os.path.exists(path) and len(os.listdir(path)) == 0:
                    os.rmdir(path)


def save():
    global mLock
    global UrlSrc
    #global ImgDiged
    #global iLock
    global SAVE_PATH
    mLock.acquire()
    #iLock.acquire()
    try:
        f = open(SAVE_PATH + r"\UrlDiged.txt",'w')
        for i in UrlDiged:
            f.write(i + '\n')
        f.close()

        f = open(SAVE_PATH +r"\UrlSrc.txt",'w')
        for i in UrlSrc:
            f.write(i + '\n')
        f.close()

        print("********************* Saved **********************")
    except Exception as e:
        print (e)
    finally:
        mLock.release()
        #iLock.release()


def readBackup():
    global UrlDiged
    #global ImgDiged
    global UrlSrc
    try:
        f = open(SAVE_PATH + r"\UrlDiged.txt",'r')
        while True:
            t = f.readline()
            if t == '':
                break
            t = t.replace('\n','')
            UrlDiged.append(t)
        f.close()
        f = open(SAVE_PATH + r"\UrlSrc.txt",'r')
        while True:
            t = f.readline()
            if t == '':
                break
            t = t.replace('\n','')
            UrlSrc.append(t)
        f.close()
    except Exception as e:
        print(e)


#*****************************start********************************


if __name__ == '__main__':

    #timeout = 20
    #socket.setdefaulttimeout(timeout)
    seed = "http://www.xxx.com/"    #<-站点的根页面
    SAVE_PATH = r"d:\scratch"       #<-存储目录
    THREAD_NUM = 35                 #<-限制线程数,以控制下载速度,防止出现类DDos攻击
    SLEEP_TIME = 2.5                #<-每次请求链接的时间间隔(秒),太快不一定好哟!
    MinSize = 32000                 #<-过滤小图片,初始32k
    IMG_TIME = 1.5                  #<-下载图片速度,初始1.5秒一张
    UrlSrc = [seed]                 #存储获得的未遍历过的链接
    UrlDiged = []                   #存储遍历过的链接
    mLock = threading.Lock()        #UrlSrc和UrlDiged的同步锁
    savetime = time.time()

    if not os.path.exists(SAVE_PATH):
        os.mkdir(SAVE_PATH)
    if seed[-1:] == '/':
        seed = seed[:-1]

    #读取上一次运行的现场
    if not os.path.exists(SAVE_PATH + r'\UrlDiged.txt'):
        try:
            f = open(SAVE_PATH + r'\UrlDiged.txt','w')
            f.close()
            f = open(SAVE_PATH + r'\UrlSrc.txt','w')
            f.close()
        except Exception as e:
            print(e)
    else:
        readBackup()


    while True:
        if len(threading.enumerate()) > THREAD_NUM:
            continue
        mLock.acquire()
        if UrlSrc.__len__():
            temp = UrlSrc.pop(0)
            t = ScratchFactory(temp)
            UrlDiged.append(temp)
            t.start()
        mLock.release()
        #打印当前连接数、线程数、urlsrc+urldiged表长
        print("Conections:",UrlSrc.__len__(),"*****threads:",\
              len(threading.enumerate()),"****TableLength:",\
              (len(UrlSrc)+len(UrlDiged))/1000)
        if time.localtime().tm_min%2 == 0 \
        and time.time() - savetime > 60 :
            save()                 #保存现场
            savetime = time.time()
        time.sleep(SLEEP_TIME)


本文转载自:http://blog.csdn.net/pwh0996/article/details/8574095

周贰
粉丝 1
博文 6
码字总数 952
作品 0
石景山
程序员
私信 提问
邮箱扒头像来告诉你怎么写简单的脚本扒图

用邮箱扒头像来告诉你怎么写简单的脚本扒图 手上有几十万邮箱,本来用户系统没有做头像的东西,现在想根据这些邮箱能拿一部分用户的头像,可以直接使用gravatar的服务,不过这玩意儿不时会被...

duoduo3_69
2014/12/02
0
1
带你入门Python爬虫,8个常用爬虫技巧盘点

python作为一门高级编程语言,它的定位是优雅、明确和简单。 我学用python差不多一年时间了, 用得最多的还是各类爬虫脚本, 写过抓代理本机验证的脚本、写过论坛中自动登录自动发贴的脚本 ...

糖宝lsh
2018/08/08
0
0
不要再写抓妹子图的代码了!!!!!!!!!!!!!!!!!!

没事就看到抓妹子代码排在热门代码里,一点技术含量没有。 Java抓完php抓,php抓完C#抓,C#抓完AAuto抓,AAuto抓完Python抓。 oschina已经囊括了各种语言、各种版本、各种层次的抓妹子代码。 你妹...

废柴大叔
2014/11/06
1K
15
如何使用Python操作摄像头

用过USB摄像头的都知道,你需要使用鼠标来操作它,比如截个图,录个像什么的,要点N次鼠标,对于我们那些不喜欢多次点击鼠标的人来说,这是一件很boring的事情,所以,本文将教你如何使用Pyt...

彭博
2012/02/13
0
1
[SQL Server玩转Python] 二.T-SQL查询表格值及Python实现数据分析

版权声明:本文为博主原创文章,转载请注明CSDN博客源地址!共同学习,一起进步~ https://blog.csdn.net/Eastmount/article/details/84029450 在开发项目过程中,更多的是通过Python访问SQL...

Eastmount
2018/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql已存在的表增加自增字段

需求: 已有的mysql数据表,希望增加一个自增的字段,并设置新数据的初始值。 实际上不复杂,只是做个备忘。 测试表 CREATE TABLE `t_abc` ( `name` varchar(20) DEFAULT NULL) ENGINE=In...

polly
19分钟前
1
0
去掉截屏功能

/home/rk3288_600_f703/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 有一个截屏的线程,注释掉...

安卓工程师王恒
27分钟前
0
0
解决vim打开之后乱码的问题

在Windows中的文档,传输到Linux系统中(使用rz命令),出现乱码 root@localhost ~]# rpm -qf `which iconv` glibc-common-2.17-105.el7.x86_64 [root@localhost ~]# rpm -ihv /mnt/Packages......

寰宇01
44分钟前
2
0
aldi 2017年1月记录

../../tools/CBLAS/lib/cblas_LINUX.a ../../tools/lapack-3.4.2/liblapacke.a \../../tools/lapack-3.4.2/librefblas.a -lgfortran \../../tools/lapack-3.4.2/liblapack.a \../../......

MtrS
45分钟前
3
0
Choerodon如何进行日志收集与告警

作者:董文启 应用程序日志是由软件应用程序记录的事件文件, 它一般包含错误,信息事件和警告。一个良好的日志系统有助于快速发现问题,定位问题,同时也为业务分析起到一定的作用。 传统E...

Choerodon
57分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部