文章目录
- 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)