我的编程空间,编程开发者的网络收藏夹
学习永远不晚

爬虫:输入网页之后爬取当前页面的图片和背

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

爬虫:输入网页之后爬取当前页面的图片和背

环境:py3.6

核心库:selenium(考虑到通用性,js加载的网页)、pyinstaller

颜色显示:colors.py

colors.py

 用于在命令行输出文字时,带有颜色,可有可无。

# -*- coding:utf-8 -*-#

# filename: prt_cmd_color.py

import ctypes, sys

STD_INPUT_HANDLE = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE = -12

# 字体颜色定义 text colors
FOREGROUND_BLUE = 0x09  # blue.
FOREGROUND_GREEN = 0x0a  # green.
FOREGROUND_RED = 0x0c  # red.
FOREGROUND_YELLOW = 0x0e  # yellow.

# 背景颜色定义 background colors
BACKGROUND_YELLOW = 0xe0  # yellow.

# get handle
std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)


def set_cmd_text_color(color, handle=std_out_handle):
    Bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
    return Bool


# reset white
def resetColor():
    set_cmd_text_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)


# green
def printGreen(mess):
    set_cmd_text_color(FOREGROUND_GREEN)
    sys.stdout.write(mess)
    resetColor()


# red
def printRed(mess):
    set_cmd_text_color(FOREGROUND_RED)
    sys.stdout.write(mess)
    resetColor()


# yellow
def printYellow(mess):
    set_cmd_text_color(FOREGROUND_YELLOW)
    sys.stdout.write(mess + '\n')
    resetColor()


# white bkground and black text
def printYellowRed(mess):
    set_cmd_text_color(BACKGROUND_YELLOW | FOREGROUND_RED)
    sys.stdout.write(mess + '\n')
    resetColor()

if __name__ == '__main__':
    printGreen('printGreen:Gree Color Text')
    printRed('printRed:Red Color Text')
    printYellow('printYellow:Yellow Color Text')

 

spider.py

主要在于通用性的处理

# -*- coding: utf-8 -*-
## import some modules
import os
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
from os import  path
import requests
import re
from urllib.parse import urlparse, urljoin
from colors import  *
d = path.dirname(__file__)
bar_length = 20
def output(List, percent, msg ,url):
    hashes = '#' * int(percent / len(List) * bar_length)
    spaces = ' ' * (bar_length - len(hashes))
    loadingStr = str(int(100 * percent / len(List)))+ u'%'
    length = len('100%')
    if len(loadingStr) < length:
        loadingStr += ' '*(length-len(loadingStr))
    sys.stdout.write("\rPercent: [%s %s]" % (hashes + spaces, loadingStr ))
    printYellow("         [%s] %s " % ( msg, url))
    sys.stdout.flush()
    time.sleep(2)

class Spider():
    '''spider class'''
    def __init__(self):
        self.url = 'https://www.cnblogs.com/cate/csharp/#p5'
        self.checkMsg = ''
        self.fileName = path.join(d, 'image/')
        self.fileDirName = ''
        self.chrome_options = Options()
        self.chrome_options.add_argument('--headless')
        self.chrome_options.add_argument('--disable-gpu')
        self.driver = webdriver.Chrome(chrome_options=self.chrome_options)
        self.topHostPostfix = (
        '.com', '.la', '.io', '.co', '.info', '.net', '.org', '.me', '.mobi',
        '.us', '.biz', '.xxx', '.ca', '.co.jp', '.com.cn', '.net.cn',
        '.org.cn', '.mx', '.tv', '.ws', '.ag', '.com.ag', '.net.ag',
        '.org.ag', '.am', '.asia', '.at', '.be', '.com.br', '.net.br',
        '.bz', '.com.bz', '.net.bz', '.cc', '.com.co', '.net.co',
        '.nom.co', '.de', '.es', '.com.es', '.nom.es', '.org.es',
        '.eu', '.fm', '.fr', '.gs', '.in', '.co.in', '.firm.in', '.gen.in',
        '.ind.in', '.net.in', '.org.in', '.it', '.jobs', '.jp', '.ms',
        '.com.mx', '.nl', '.nu', '.co.nz', '.net.nz', '.org.nz',
        '.se', '.tc', '.tk', '.tw', '.com.tw', '.idv.tw', '.org.tw',
        '.hk', '.co.uk', '.me.uk', '.org.uk', '.vg', ".com.hk")

    def inputUrl(self):
        '''input url'''
        self.url = input('please input your target: ')
        print('[*] url: %s' % self.url)

    def check(self):
        '''check url'''
        self.checkMsg = input('Are your sure to grab this site? [Y/N/Exit] :')
        if self.checkMsg == 'Y':
            self.middle = self.url.replace('http://', '')
            self.middle = self.middle.replace('https://', '')
            self.fileDirName = path.join(d, 'image/%s' % self.middle)
            self.makeFile()
            self.parse()
        elif self.checkMsg == 'N':
            self.inputUrl()
            self.check()
        elif self.checkMsg == 'Exit':
            sys.exit()
        else:
            print('please input one of [Y/N/Exit]!!')
            self.check()

    def makeFile(self):
        '''创建文件夹函数'''
        if os.path.exists(self.fileName):
            pass
        else:
            os.makedirs(self.fileName)

        if os.path.exists(self.fileDirName):
            pass
        else:
            os.makedirs(self.fileDirName)

    def getCssImage(self,url):
        '''获取css中的image'''
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
        try:
            response = requests.get(url, headers = headers, timeout=500).text
            bgCssList = re.findall("url\((.*?\))", response)
            bgCssclass="lazy" data-src = []
            if len(bgCssList) > 0:
                for v in bgCssList:
                    v = v.replace('url(', '')
                    v = v.replace('\\', "")
                    v = v.replace(')', "")
                    print(v)
                    print('-----------------------------------')
                    bgCssclass="lazy" data-src.append(v)
            return bgCssclass="lazy" data-src
        except:
            print('connection timeout!!!')

    def getHostName(self, url):
        '''获取url主域名'''
        regx = r'[^\.]+(' + '|'.join([h.replace('.', r'\.') for h in self.topHostPostfix]) + ')$'
        pattern = re.compile(regx, re.IGNORECASE)
        parts = urlparse(self.url)
        host = parts.netloc
        m = pattern.search(host)
        urlm = 'http://www.' + m.group() if m else host
        return urlm

    def joinUrl(self, url):
        '''图片url处理'''
        # if url[:2] == '//':
        #     url = url.replace('//', '')
        #     url = 'http://' + url
        # elif url.startswith('/'):
        #     ## 需要处理
        #     regx = r'[^\.]+(' + '|'.join([h.replace('.', r'\.') for h in self.topHostPostfix]) + ')$'
        #     pattern = re.compile(regx, re.IGNORECASE)
        #     parts = urlparse(self.url)
        #     host = parts.netloc
        #     m = pattern.search(host)
        #     urlm = 'http://www.' + m.group() if m else host
        #     url = urlm + url
        # try:
        #     ## 处理字符串   获取 www   http   https
        #     if url[:2] == '//':
        #         url = url.replace('//', '')
        #         url = 'http://' + url
        #     elif url.startswith('/'):
        #         ## 需要处理
        #         regx = r'[^\.]+(' + '|'.join([h.replace('.', r'\.') for h in self.topHostPostfix]) + ')$'
        #         pattern = re.compile(regx, re.IGNORECASE)
        #         parts = urlparse(self.url)
        #         host = parts.netloc
        #         m = pattern.search(host)
        #         urlm = 'http://www/' + m.group() if m else host
        #         url = urlm + url
        #     else:
        #         try:
        #             url = url.split('www', 1)[1]
        #             url = u'http://www' + url
        #         except:
        #             try:
        #                 url = url.split('http', 1)[1]
        #                 url = u'http' + url
        #             except:
        #                 pass
        # except:
        #     pass
        ## ex1    '//example.png'
        ## ex2    'http://'
        if url.startswith('http'):
            return url
        else:
            return urljoin(self.url, url)

    def download(self, key, url):
        if key == 0:
            pass
        else:
            print('')
        url = self.joinUrl(url)
        try:
            imgType = os.path.split(url)[1]
            imgType = imgType.split('.',1)[1]
            imgType = imgType.split('?',1)[0]
        except:
            msg = u' Error '
            return msg
        fileName = int(time.time())
        path = self.fileDirName+ u'/'+str(fileName) + u'.' + imgType
        try:
            headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'}
            try:
                response = requests.get(url, headers=headers, timeout=500).content
            except:
                msg = u' Error '
                return msg
            f = open(path, 'wb+')
            try:
                f.write(response.encode('utf-8'))
            except:
                f.write(response)
            f.close()
        except Exception as e:
            msg = u' Error '
            return msg
        return u'Success'

    def parse(self):
        '''parse html'''
        self.driver.get(self.url)
        time.sleep(3)
        html_content = self.driver.page_source
        bs = BeautifulSoup(html_content, "html.parser")
        ## 先获取所有的图片
        imgList = bs.find_all('img')
        class="lazy" data-srcList = []
        if len(imgList) > 0:
            for v in imgList:
                class="lazy" data-srcList.append(v['class="lazy" data-src'])
                print(v['class="lazy" data-src'])
                print('-----------------------------------')
            class="lazy" data-srcList = list(set(class="lazy" data-srcList))
        print('[*] Find %s image in page',len(class="lazy" data-srcList))
        ## 获取当前页面style里面的背景图
        bgStyleList = re.findall("url\((.*?\))", html_content)
        bgclass="lazy" data-src = []
        if len(bgStyleList) > 0:
            for v in bgStyleList:
                v = v.replace('url(', '')
                v = v.replace('\\',"")
                v = v.replace(')', "")
                print(v)
                print('-----------------------------------')
                bgclass="lazy" data-src.append(v)
        bgclass="lazy" data-src = list(set(bgclass="lazy" data-src))
        print('[*] Find %s image in Page style', len(bgclass="lazy" data-src))
        ## 获取所有的背景图
        ## 获取所有的css文件
        cssList = re.findall('<link rel="stylesheet" href="(.*?)"',html_content)
        cssImageUrls = []
        if len(cssList) > 0:
            cssImageUrl = []
            for url in cssList:
                cssImageUrl += self.getCssImage(url)
            cssImageUrls = cssImageUrl
            cssImageUrls = list(set(cssImageUrls))
        print('[*] Find %s image in Page css', len(cssImageUrls))

        ## 开始获取图片https://www.cnblogs.com/shuangzikun/
        ## 开始下载标签的图片
        print('---------------------------------------------')


        if len(class="lazy" data-srcList) > 0:
            print('Start Load Image -- %s' % len(class="lazy" data-srcList))
            for percent,url in enumerate(class="lazy" data-srcList):
                percent += 1
                msg = self.download(percent, url)
                output(class="lazy" data-srcList, percent, msg ,url)


        if len(bgclass="lazy" data-src) >0:
            print('\nStart Load Image In Style -- %s' % len(bgclass="lazy" data-src))
            for percent, url in enumerate(bgclass="lazy" data-src):
                percent += 1
                msg = self.download(percent, url)
                output(class="lazy" data-srcList, percent, msg, url)


        if len(cssImageUrls) > 0:
            print('\nStart Load Image In Css -- %s' % len(cssImageUrls))
            for percent, url in enumerate(cssImageUrls):
                percent += 1
                msg = self.download(percent, url)
                output(class="lazy" data-srcList, percent, msg, url)

        print('\nEnd----------------------------------Exit')



if __name__ == '__main__':
    print('''          ____  __  __  __      __       _______  _______
         /__  \\ \\_\\/_/ / /     / /____  / ___  / / ___  /
        / /_/ /  \\__/ / /___  / /__  / / /  / / / /  / /
       / ____/   / / / /___/ / /  / / / /__/ / / /  / /
      /_/       /_/ /_/___/ /_/  /_/  \\_____/ /_/  /_/ version 3.6''')
    descriptionL = ['T', 'h', 'i', 's', ' ', 'i', 's' , ' ', 'a', ' ', 's', 'p', 'i', 'd', 'e', 'r', ' ','p', 'r', 'o', 'c', 'e', 'd', 'u', 'r', 'e', ' ', '-', '-', '-',' IMGSPIDER', '\n']

    for j in range(len(descriptionL)):
        sys.stdout.write(descriptionL[j])
        sys.stdout.flush()
        time.sleep(0.1)
    urlL = ['[First Step]', ' input ', 'a', ' url ' , 'as ', 'your ', 'target ~ \n']

    for j in range(len(urlL)):
        sys.stdout.write(urlL[j])
        sys.stdout.flush()
        time.sleep(0.2)
    pathL = ['[Second Step]', ' check ', 'this ', 'url ~\n']

    for j in range(len(pathL)):
        sys.stdout.write(pathL[j])
        sys.stdout.flush()
        time.sleep(0.2)
    ## new spider
    MySpider = Spider()
    ## input url path
    MySpider.inputUrl()
    # ## checkMsg
    MySpider.check()

运行效果

 

 打包

使用到其它扩展

pyinstaller -f spider.py   打包成单一文件。

由于要在其它电脑上使用,需要修改下谷歌驱动的位置,把谷歌驱动放在spider.exe的同目录下。

        try:
            self.chrome_options.add_argument(r"user-data-dir = %s" % path.join('Chrome\Application'))
            self.driver = webdriver.Chrome(path.join(d,'chromedriver.exe'),chrome_options=self.chrome_options)
        except Exception as e:
            print(e)

点击spider.exe,初始化没有报错即ok了。

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

爬虫:输入网页之后爬取当前页面的图片和背

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

爬虫:输入网页之后爬取当前页面的图片和背

环境:py3.6核心库:selenium(考虑到通用性,js加载的网页)、pyinstaller颜色显示:colors.pycolors.py 用于在命令行输出文字时,带有颜色,可有可无。# -*- coding:utf-8 -*-## f
2023-01-30

python爬虫入门实战之爬取网页图片

本篇文章给大家带来了关于Python的相关知识,其中主要整理了爬取网页图片的相关问题,要想高效的获取数据,爬虫是非常好用的,而用python做爬虫也十分简单方便,下面通过一个简单的小爬虫程序来看一看写爬虫的基本过程,下面一起来看一下,希望对大家有帮助。【相关推荐:Python3视频教程 】在现在这个信息爆炸的时代,要想高效的获取数据,爬虫是非常好用的。而用python做爬虫也十分简单方便,下面通过一
2022-07-11

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录