Python爬取暴走漫画动态图

Stella981 等级 154 0 0
标签: numpython

最近再之乎上看到比较好的Python爬虫教程,看过之后对爬虫有了大概的了解,随后自己写了个爬取暴走漫画动图的爬虫练练手,另外附上Python爬虫教程的原始链接,完整看一遍教程之后还是会有很多收获的 ##源码 话不多说,直接上代码

# -*- coding: UTF-8 -*-

import requests
import bs4
import sys
import os
import re
from multiprocessing.dummy import Pool as ThreadPool
import urllib3
from tqdm import tqdm
import shutil

baseUrl = 'http://baozoumanhua.com/catalogs/gif'

curDir = os.getcwd()

htmlDir = os.path.join(curDir, 'htmls')

gifDir = os.path.join(curDir, 'gifs')

gifMap = {}

noneCnt = 0

# win文件命名不允许使用的字符
pat = re.compile(r'[\/|\?|\*|:|\||\\|<|>|\s|"]')

total_pages = 1000

get_gifs_bar = ''


def get_html_text(url):
    try:
        r = requests.get(url, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "Something Wrong!"


def get_pages(num):
    global get_pages_bar
    get_pages_bar = tqdm(total=total_pages, ascii=True)
    tqdm.write('.')
    tqdm.write('.')
    tqdm.write('.')
    tqdm.write('Downloading web pages...')
    num += 1
    pool = ThreadPool(8)
    pool.map(download_page, range(1, num))
    pool.close()
    pool.join()
    get_pages_bar.close()


def get_gif_name(num, item):
    global noneCnt
    author = item.find('a', 'text-overflow').string + ':'
    a_s = item.find_all('a')
    for a in a_s:
        if a.has_attr('data-full-url'):
            gif_name = author + a.string
            return gif_name
    gif_name = author + 'NA' + str(noneCnt)
    noneCnt += 1
    return gif_name


def get_gif_links(item):
    imgs = item.find_all('img', 'lazy lazy-img none')
    links = []
    for img in imgs:
        if img.has_attr('data-original'):
            links.append(img['data-original'])
    return links


def add_gifMap(name, links):
    global gifMap
    if len(links) < 1:
        return
    if len(links) == 1:
        gif_name = name + '.gif'
        gifMap[gif_name] = links[0]
        return
    for i in range(1, len(links) + 1):
        gif_name = name + str(i) + '.gif'
        gifMap[gif_name] = links[i - 1]


def get_gifs(num):
    tqdm.write('.')
    tqdm.write('.')
    tqdm.write('.')
    tqdm.write('Parsing pages...')
    num += 1
    get_links_bar = tqdm(total=total_pages, ascii=True)
    for n in range(1, num):
        file_name = os.path.join(htmlDir, 'page' + str(n) + '.html')
        soup = bs4.BeautifulSoup(open(file_name, 'rb'), 'lxml')
        article = soup.find_all('div', 'article')
        for item in article:
            gif_name = get_gif_name(n, item)
            gif_links = get_gif_links(item)
            add_gifMap(gif_name, gif_links)
        get_links_bar.update(1)
    get_links_bar.close()


def download_gif(name):
    global gifMap
    global pat
    global get_gifs_bar
    file_name = re.sub(pat, '_', name)
    try:
        if os.path.exists(os.path.join(htmlDir, 'gifs', file_name)):
            return
        r = requests.get(gifMap[name], timeout=30, verify=False)
        r.raise_for_status()
        with open(os.path.join(gifDir, file_name), 'wb') as fo:
            fo.write(r.content)
    except:
        tqdm.write('Download ' + name + ' fail...')
    finally:
        get_gifs_bar.update(1)


def downloader():
    total_gifs = len(gifMap.keys())
    tqdm.write('.')
    tqdm.write('.')
    tqdm.write('.')
    tqdm.write('Downloading gifs...')
    global get_gifs_bar
    get_gifs_bar = tqdm(total=total_gifs, ascii=True)
    pool = ThreadPool(8)
    pool.map(download_gif, gifMap.keys())
    pool.close()
    pool.join()
    get_gifs_bar.close()


def download_page(num):
    url = baseUrl + '?page=' + str(num)
    file_name = os.path.join(htmlDir, 'page' + str(num) + '.html')
    with open(file_name, 'wb') as fo:
        fo.write(get_html_text(url))
    get_pages_bar.update(1)


def set_env():
    global total_pages
    if os.path.exists(gifDir) and sum([len(x) for _, _, x in os.walk(gifDir)]) > 5000:
        total_pages = 10
        tqdm.write('Find many gifs in dir, just update gifs...')
    if not os.path.exists(gifDir):
        os.mkdir(gifDir)
    if os.path.exists(htmlDir):
        shutil.rmtree(htmlDir)
    os.mkdir(htmlDir)


def main():
    set_env()
    get_pages(total_pages)
    get_gifs(total_pages)
    downloader()
    shutil.rmtree(htmlDir)
    tqdm.write('Congratulatins!!!')
    tqdm.write('All pictures in folder : gifs...')
    tqdm.write('Just open the folder and enjoy yourself!!!')
    os.system('pause')
    return 0


if __name__ == "__main__":
    urllib3.disable_warnings()
    reload(sys)
    sys.setdefaultencoding('utf-8')
    sys.exit(main())

程序运行示例 Python爬取暴走漫画动态图 首次执行会下载1000页的动图,请耐心等待,根据网络状况不同,可能需要30分钟的时间,并且确保磁盘有13G的空间 完整执行过一次该软件后,再次执行只会更新最新10页动图 执行完毕后,所有动图保存在当前文件夹下的gifs文件夹中

收藏
评论区

相关推荐

商业数据分析从入门到入职(9)Python网络数据获取
@toc 前言本文主要讲Python最常见的应用之一——网络数据获取,即爬虫:先介绍了网页和网络的基础知识,为从网页中获取数据打好基础;接下来以两个案例介绍从网络中获取数据和处理数据的不同方式,以进一步认识Python爬虫和数据处理。 一、网络和网页基础知识 1.数据来源数据源有很多,可以从数据库中获取,可以从文件中获取,也可以从
Python网络爬虫与信息提取
title: Python网络爬虫与信息提取date: 20201210 01:00:23tags: Pythoncategories: 学习笔记 写在前面 不知道写啥其实说实话[TOC] 网络爬虫之规则 安装requests库cmd 命令行打开输入pip3 install requests,等待即可简单测试,爬一下bkjwpythonimport requ
《Python3网络爬虫开发实战》
提取码:1028内容简介 · · · · · ·本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib、requests、正则表达式、Beautiful Soup、XPath、pyquery、数据存储、Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,后介绍了pyspider框架、S
爬取软件工程师相关信息
爬取有关软件工作的信息 import reimport requestsfrom pymysql import connectfrom bs4 import BeautifulSoup 定义数据库的连接函数conn connect(user"root", password"root", host"localhost", database"python",
lxml简明教程
from:https://www.cnblogs.com/ospider/p/5911339.html 最近要做下微信爬虫,之前写个小东西都是直接用正则提取数据就算了,如果需要更稳定的提取数据,还是使用 xpath 定位元素比较可靠。周末没事,从爬虫的角度研究了一下 python xml 相关的库。 Python 标准库中自带了 xml 模块,但是性能不
50 行代码教你爬取猫眼电影 TOP100 榜所有信息
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫架构中的HTML下载器、HTML解析器、数据存储器三大模块: HTML下载器:利用requests模块下载HTML网页; HTML解析器:利用re正则表达
Python Scrapy 实战
Python Scrapy ============= 什么是爬虫? ------ 网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。其目的一般为编纂网络索引。 Python 爬虫 --------- 在爬虫领域,Python几乎是霸主地位,将网络一切数据作为资源,通过自动化程序进行有针对性
Python 使用selenium抓取网页文本和下载音频
Python 使用selenium抓取网页文本和下载音频 #!\usr\bin\env python # -*- coding: utf-8 -*- '一个自动从https://podcast.duolingo.com/spanish中下载音频并且爬取文本的程序' '需要配置下载以下所需库,并且配置好webdriv
Python 爬虫:把廖雪峰的教程转换成 PDF 电子书
写爬虫似乎没有比用 Python 更合适了,Python 社区提供的爬虫工具多得让你眼花缭乱,各种拿来就可以直接用的 library 分分钟就可以写出一个爬虫出来,今天就琢磨着写一个爬虫,将廖雪峰的 Python 教程 爬下来做成 PDF 电子书方便大家离线阅读。 开始写爬虫前,我们先来分析一下该网站[1](https://www.oschina.net/
Python3 网络爬虫:下载小说的正确姿势
点击上方“ **Python爬虫与数据挖掘** ”,进行关注 回复“**书籍**”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 少年心事当拂云。 ![](https://oscimg.oschina.net/oscnet/09902b71501b9e8c3cb656b5dfbbb0552e0.jpg) 1 **
Python实现王者荣耀小助手(一)
简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手: 前期准备,环境搭建: Python2.7 sys模块提供了许多函数和变量来处理 Python 运行时环境的不同部分; urllib模块提供了一系列用于操作URL的功能,爬虫所需要的功能,基本上在urll
Python爬取暴走漫画动态图
最近再之乎上看到比较好的Python爬虫教程,看过之后对爬虫有了大概的了解,随后自己写了个爬取[暴走漫画](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fbaozoumanhua.com%2Fcatalogs%2Fgif)动图的爬虫练练手,另外附上[Python爬虫教程](https://w
Python爬取网易云歌单
#### 基本配置: * Python版本:3.7 #### 相关模块: from urllib import parsefrom lxml import etreefrom urllib3 import disable_warningsimport requests #### 案例关键点: 使用单线程爬取,未登录,爬取网易云
Python爬虫
Python爬虫-xpath ============== * Python爬虫-xpath * 说明 * 再说明 * 插件推荐 * 语法讲述 * 举栗子 * 代码里使用 * 实战句子迷 * 需要的总结: 说明 -- 关于Python爬虫请求数据方面的知
Scrapy框架
\[TOC\] 1\. Scrapy介绍 ============ 1.1. Scrapy框架 ------------- Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。 ![](http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/