记一次图片爬虫经历

最近由于需要帮朋友找人教版初中地理教材pdf资料,人教出版社官方提供了七年级下册和八年级下册的pdf资源,上册需要自己想办法啦!经过一番信息检索,发现搜狐上居然有提供我想要的版本教材扫描版,果断下载呀!可是在下载过程中遇到了许多问题,下面讲述一下本次资源获取艰辛之路

网页打印pdf

​ 搜狐提供教材图片版,第一想法当然是将网页打印成pdf,可是网页上还有许多杂七杂八的东西是我不需要的,不过这可难不倒我,在浏览器审查元素的支持下,我将不需要的内容全部删除啦,并且,简单加几条css规则,这样就可以打印成pdf了呗,事实证明这是可行的,但是有一点小小的瑕疵,新的pdf一页内容和原来的教材一页内容对不上,意味着原来的一页可能在这里就被分成上下两截。作为强迫症患者的我当然不能忍受这个,于是开始了进阶尝试。

保存网页

​ 想法很简单,将整个网页保存下来,这样不就所有的图片都下载好了吗!说干就干,直接一个Ctrl+S,我看到了一个放满了图片的文件夹,每一张图片就是一页教材,真是太完美了。No!一点儿也不美丽,每一张图片都是一串乱七八糟的字符命名,根本没有顺序可言,那我怎么将这堆图片合并成一个pdf呢,难道要我每张图片根据页面重命名一下?不不不,这种活儿我可不会干!

python爬虫

​ 既然半自动保存图片失败了,那就上全自动保存图片。对于一个坚决不做机械式重复劳动的不折腾会死星人,让我每张图片重命名一次,和直接在网页上一张一张图片下载有什么区别呢?可别忘了自己还有技能树呢!对于这种任务,直接上python,两个包requests+lxml是我的最爱,打开我的vscode,两下半就完成一个爬虫,运行一下,所有的教材图片有序躺在我的文件夹中,完全不用自己重命名排个序什么的。

合成pdf

​ 最后说一下如何将这堆图片打包成一个pdf,有同学可能想到了新建一个空白word,然后插入所有图片,最后导出pdf。不得不承认,这是可行的方法,但不是最优的方法。条条大路通罗马,当然要选择一条平坦的捷径咯,打开福昕高级版PDF编辑器,创建,合并文件,然后选择图片的整个文件夹,点击合并即可!

附录

import time
import logging
from pathlib import Path
from lxml import etree
import requests

def create_logger(loggername:str='logger', levelname:str='DEBUG', console_levelname='INFO'):
    levels = {
        'DEBUG': logging.DEBUG,
        'INFO': logging.INFO,
        'WARNING': logging.WARNING,
        'ERROR': logging.ERROR,
        'CRITICAL': logging.CRITICAL
    }

    logger = logging.getLogger(loggername)
    logger.setLevel(levels[levelname])

    logger_format = logging.Formatter("[%(asctime)s][%(levelname)s][%(filename)s][%(funcName)s][%(lineno)03s]: %(message)s")
    console_format = logging.Formatter("[%(levelname)s] %(message)s")

    handler_console = logging.StreamHandler()
    handler_console.setFormatter(console_format)
    handler_console.setLevel(levels[console_levelname])

    # path = Path(__file__).parent/'logs' # 日志目录
    path = Path('./logs')
    path.mkdir(parents=True, exist_ok=True)
    today = time.strftime("%Y-%m-%d")     # 日志文件名
    common_filename = path / f'{today}.log'
    handler_common = logging.FileHandler(common_filename , mode='a+', encoding='utf-8')
    handler_common.setLevel(levels[levelname])
    handler_common.setFormatter(logger_format)

    logger.addHandler(handler_console)
    logger.addHandler(handler_common)

    return logger

logger = create_logger('Crawler')

class Crawler:
    def __init__(self, url, path):
        self.url = url
        self.path = Path(path)
        self.path.mkdir(parents=True, exist_ok=True) # 安全创建目录
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
        }


    def _download(self, url, filename):
        try:
            resp = requests.get(url)
        except:
            logger.debug(f'请求异常')

        if 200 != resp.status_code:
            logger.debug(f'请求失败')

        with filename.open('wb') as fp:
            fp.write(resp.content)

        logger.info(f'完成下载{filename} {url}')

    def cycle(self):
        try:
            resp = requests.get(self.url, headers=self.headers)
        except:
            logger.debug(f'请求异常')
        if 200 != resp.status_code:
            logger.debug(f'请求失败')
        try:
            html = etree.HTML(resp.text)
        except:
            logger.debug(f'转换异常')
        imgs = html.xpath('//article[@id="mp-editor"]/p/img/@src')
        for (idx, img) in enumerate(imgs):            
            filename = self.path/f'{idx:03}.jpg'
            logger.info(f'准备下载{filename} {img}')
            self._download(img, filename)

if __name__ == "__main__":
    # url = "https://www.sohu.com/a/240462346_796524" # 人教版地理教材八年级上册
    # url = "https://www.sohu.com/a/240462516_796524" # 人教版地理教材七年级上册
    # path = './images'
    logger.info(f'欢迎使用搜狐图片下载器')
    logger.info(f'如:人教版地理教材八年级上册 "https://www.sohu.com/a/240462346_796524"')
    url = input(f'请输入目标网址: ')
    path = input(f'请输入保存路径: ')
    crawler = Crawler(url, path)

    crawler.cycle()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容