文章目录
- 0 背景
- 1 实现代码
0 背景
因为项目需要,需要进行数据科学方面的建模分析,而数模论文就是很好的范本,于是就是想着下几篇数模论文自己学习一下,于是就来到了全国大学生数据建模的网站,但是发现论文竟然是一张张的图,游览起来费劲,于是就产生了使用爬虫爬去图片的想法。

有了需求,当然就要实践了,于是经过一番摸索和搜索资料终于实现了论文图片的爬取。原理其实很简单,就是通过请求获得网页源代码,然后在其中找到下载链接,进行中逐一下载,并过滤自己不需要的图片,仅保存自己需要的结果到指定路径。本文就是记录这个过程,并让更多人从中受益。

1 实现代码
下文需要的根据自己的实际情况进行修改,修改的地方如下:
- 1,下载的路径(fileDir);
- 2,下载的路径下的文件夹(localPath),如果没有回自动创建;
- 3,下载的图片的网址(url);
- 4,如果是不同年份,则需修改if imgUrl_src != '' and imgUrl_src.find('2019') != -1: 条件中的2019这个字符串,不同年份对应不同字符串,目的是为了过滤不是论文的图片。
# 使用版本
# 使用requests、bs4库下载?主页上的所有图片
import os
import requests
from bs4 import BeautifulSoup
import shutil
from pathlib import Path  # 关于文件路径操作的库,这里主要为了得到图片后缀名
import time
# 该方法传入url,返回url的html的源代码
def getHtmlCode(url):
    # 伪装请求的头部来隐藏自己
    headers = {
        'User-Agent': 'MMozilla/5.0(Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0'
    }
    # 获取网页
    r = requests.get(url, headers=headers)
    # 指定网页解析的编码格式
    r.encoding = 'UTF-8'
    # 获取url页面的源代码字符串文本
    page = r.text
    return page
# 该方法传入html的源代码,通过截取其中的img标签,将图片保存到本机
def getImg(page, localPath):
    # 判断文件夹是否存在,存在则删除,最后都要重新新的文件夹
    if os.path.exists(localPath):
        shutil.rmtree(localPath)
    os.mkdir(localPath)
    # 按照Html格式解析页面
    soup = BeautifulSoup(page, 'html.parser')
    # 返回的是一个包含所有img标签的列表
    imgList = soup.find_all('img')
    x = 0
    remove_file_set = set()
    # 循环url列表
    for imgUrl in imgList:
        try:
            # 得到img标签中的src具体内容
            imgUrl_src = imgUrl.get('src')
            # 排除 src='' 的情况 + AND自己的特判定
            if imgUrl_src != '' and imgUrl_src.find('2019') != -1:
                print('正在下载第 %d : %s 张图片' % (x+1, imgUrl_src))
                # 判断图片是否是从绝对路径https开始,具体为什么这样操作可以看下图所示
                if "https://" not in imgUrl_src:
                    m = 'http://dxs.moe.gov.cn/' + imgUrl_src
                    print('正在下载: %s' % m)
                    # 获取图片
                    ir = requests.get(m)
                else:
                    ir = requests.get(imgUrl_src)
                # 设置Path变量,为了使用Pahtlib库中的方法提取后缀名
                p = Path(imgUrl_src)
                # print(type(str(p)))
                # 防止下载重复的图片
                file_id = str(p).split('?')[0]
                print('file_id:'+file_id)
                print('file_id:' + file_id)
                if file_id not in remove_file_set:
                    remove_file_set.add(file_id)
                else:
                    break
                # 得到后缀,返回的是如 '.jpg'
                p_suffix = p.suffix
                print('p_suffix1:' + p_suffix)
                if '?' in p_suffix:
                    temp_p_suffix = p_suffix.split('?')
                    p_suffix = temp_p_suffix[0]
                print('p_suffix2:' + p_suffix)
                # 用write()方法写入本地文件中,存储的后缀名用原始的后缀名称
                open(localPath + str(x) + p_suffix, 'wb').write(ir.content)
                x = x + 1
                # 暂停时间
                # time.sleep(0.5)
        except:
            continue
if __name__ == '__main__':
    # 文件路径
    fileDir = '/Users/mac/Downloads/数据科学/格式参考论文/19年/'
    # 指定爬取图片链接
    url = 'http://dxs.moe.gov.cn/zx/a/qkt_sxjm_lw_2019qgdxssxjmjslwzs/191029/1529313.shtml'
    # 指定存储图片路径
    localPath = fileDir + '1/'
    # 得到网页源代码
    page = getHtmlCode(url)
    # 保存图片
    getImg(page, localPath)









