一起欣赏书法呀

2020-05-24  本文已影响0人  灵木er

搜图片搜到了兰亭集序,发现有单字版可以欣赏,怎能错过。恰好最近看到有人利用python爬虫下载sci论文,给出的有代码,然后就学以致用,看看能不能爬下来这些图。由于是第一次写爬虫,尽管这个网页很简单,信息很明了,依旧花了笔者不少时间。

先欣赏书法

兰亭集序
放大版兰亭集序
2014070479241625.jpg 2014070479402841.jpg 2014070521982611.jpg

附上《兰亭集序》原文:
永和九年,岁在癸丑,暮春之初,会于会稽山阴之兰亭,修禊事也。群贤毕至,少长咸集。此地有崇山峻岭,茂林修竹;又有清流激湍,映带左右,引以为流觞曲水,列坐其次。虽无丝竹管弦之盛,一觞一咏,亦足以畅叙幽情。是日也,天朗气清,惠风和畅,仰观宇宙之大,俯察品类之盛,所以游目骋怀,足以极视听之娱,信可乐也。

夫人之相与,俯仰一世,或取诸怀抱,悟言一室之内;或因寄所托,放浪形骸之外。虽趣舍万殊,静躁不同,当其欣于所遇,暂得于己,快然自足,不知老之将至。及其所之既倦,情随事迁,感慨系之矣。向之所欣,俯仰之间,已为陈迹,犹不能不以之兴怀。况修短随化,终期于尽。古人云:“死生亦大矣。”岂不痛哉!

每览昔人兴感之由,若合一契,未尝不临文嗟悼,不能喻之于怀。固知一死生为虚诞,齐彭殇为妄作。后之视今,亦犹今之视昔。悲夫!故列叙时人,录其所述,虽世殊事异,所以兴怀,其致一也。后之览者,亦将有感于斯文。

中学肯定背过,现在又看一遍,可以背吗?默写呢?

下面开始一点点分析如何爬下来上面那些图片。

  1. 在浏览器中打开http://www.yac8.com/news/10725.html,(本人使用的是chrome浏览器),按快捷键F12或者ctrl+shift+I打开开发者工具。选择Network,img,然后刷新页面,就可以看到想要的图片的链接。就是下面图片画红线的部分“http:*.jpg”,链接是直接给出的,下面就是怎么从页面html中获得这些链接。
    image.png
    此时我们选择Elements,可以找到图片链接,也是直接给出的,如图。
    image.png
    我们发现了 imgsrc,此时我们就可以解析页面了。
  2. 利用beautifulsoup包解析html页面。
# 打开url包
from urllib import request
# 正则表达式包
import re
from bs4 import BeautifulSoup
# 没有安装相应包的安装即可,安装没有什么问题
url = 'http://www.yac8.com/news/10725.html'
html = request.urlopen(url).read() # 读取url 
soup = BeautifulSoup(html,"html.parser") # 解析页面
img_ = soup.find_all(name='img') # 找到所有img标签
for each in img_:
    imgUrl = each.get('src') # 得到图片链接
    if "http" in imgUrl: 
        # 用http筛选是因为包含http的链接刚好是我们需要的,png等图片不带http,也不是我们需要的
        print(imgUrl)
python网页解析器比较

运行上面代码,我们成功得到下面链接,如图:


image.png
  1. 根据链接下载图片
    此时如果是在Linux下,就可以直接调用wget等下载工具下载了,不过我们依旧使用python解析网页的方式下载。
# 一种方式示例:
html361 = request.urlopen('http://www.yac8.com/upFiles/yac801/2014070478698361.jpg').read()
with open('xxx.jpg', 'wb') as p:
    p.write(html361)
    p.close()
# 构建一个下载函数即可,可以提取图片名按照文件名保存(另一种方式有)
# 另一种方式
def get_one_page_jpg(url):
    try:
        # 添加浏览器请求头,伪装成浏览器
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
        response = requests.get(url, headers=headers)
        print(response.status_code)
        if response.status_code == 200:
            return response
        return None
    except:
        print("访问出错")
        return None
def download_img(url):       
    r = get_one_page_jpg(url)
    # re模块,正则表达式提取图片名,\d表示数字
    name = re.findall(r'\d*.jpg', url)[0]
    print('======保存{name}中====='.format(name = name))
    with open(name, 'wb') as p:
        p.write(r.content) # content为页面内容 
        p.close()
# 以上是下载一页的代码

通过观察,我们发现不同页很有规律,首页:http://www.yac8.com/news/10725.html,第二页:http://www.yac8.com/news/10725_2.html,其他类似,那就好办了,一个for循环就可以遍历所有页面了。这一部分就不展开了,参考完整代码。

以下代码是完整代码。担心出现空格对不齐,引起报错,附上完整脚本链接:https://gitee.com/ai_yang_e/WGHshare/raw/master/script/bslt.py

# 完整代码
from urllib import request
import requests
import re
from bs4 import BeautifulSoup

def get_one_page_jpg(url):
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
        response = requests.get(url, headers=headers)
        print(response.status_code)
        if response.status_code == 200:
            return response
        return None
    except:
        print("访问出错")
        return None

def download_img(url):       
    r = get_one_page_jpg(url)
    name = re.findall(r'\d*.jpg', url)[0]
    print('======保存{name}中====='.format(name = name))
    with open(name, 'wb') as p:
        p.write(r.content)
        print('======we=====')
        p.close()

# 页面有65页
for n in range(1,66):
    if n == 1:
        url = 'http://www.yac8.com/news/10725.html'
    else :
        url = 'http://www.yac8.com/news/10725_{num}.html'.format(num = n)
    html = request.urlopen(url).read()
    soup = BeautifulSoup(html,"html.parser")
 
    img_ = soup.find_all(name='img')
    for each in img_:
        imgUrl = each.get('src')
        if "http" in imgUrl:
            print(imgUrl)
            download_img(imgUrl)
print('end')

下面是该网站另一个页面的图片下载,和上面一个非常像,唯一不同的是从页面获取的url返回值有些差异。上一个返回值直接是一个完整的url,这一个返回值没有http*.com这一部分,而是类似这样的“../upFiles/infoImg/201803/20180329204135200.jpg”,成了“../”,这里多了一步字符串替换和拼接。如图:


image.png

以下代码和上面很像,就不详细展开了,比上面一份要好点。

脚本链接:https://gitee.com/ai_yang_e/WGHshare/raw/master/script/ys.py

# 完整代码
from bs4 import BeautifulSoup
# from urllib import request
import re
import lxml
import requests
import time
import datetime

# 获取页面内容
def get_page(url):
    try:
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'}
        response = requests.get(url, headers=headers)
        print(response.status_code)
        if response.status_code == 200:
            return response
        return None
    except:
        print("访问出错")
        return None

# 单张图片下载
def download_one_img(url):
    d = get_page(url)
    if d.status_code == 200:
        name = re.findall(r'\d*.jpg', url)[0]
        print('======保存{name}中====='.format(name = name))
        # ./表示当前目录
        with open('./'+ name, 'wb') as p:
            p.write(d.content)
            p.close()
        
# 页面内图片下载
def get_img_url_and_download(url):
    urlHeader = re.findall(r'http.*.com', url)[0]
    html = get_page(url).text # text方法获取页面html
    soup = BeautifulSoup(html,"lxml")# html.parser
    imgi = soup.find_all(name = 'img')
    for i in imgi:
        imgUrl = i.get('src')
        if 'jpg' in imgUrl:
            # 通过jpg可以获得我们需要的图片,拼接图片链接
            imgTUrl = urlHeader + re.sub(r'\.\.', '',imgUrl)
            # print(imgTUrl)
            download_one_img(imgTUrl) # 调用单张图片下载函数
# 主函数
def main():
    # 循环遍历所有页面,共15页
    for i in range(1,16):
        if i == 1:
            url = 'http://www.yac8.com/news/14703.html'
        else :
            url = 'http://www.yac8.com/news/14703_{num}.html'.format(num = i)
        try:
            # 计时对于下载慢的加上好,这个很快可以不用
            starttime = datetime.datetime.now()
            get_img_url_and_download(url) # 实际有用的就这一行
            endtime = datetime.datetime.now()
            duringtime = endtime - starttime
            print('第%d页完成' %(i))
            print(duringtime.seconds)
        except:
            print("出错")
            print("第%d页出错" % (i))
            continue
if __name__ == "__main__":
    main()        
        

兰亭集序那个可以考虑根据原文对单字图片进行重命名,或者高级一点进行OCR文字识别进行重命名。可以试试爬取其他网站,从一些简单的网站开始。


2014070479373577.jpg

逃了。逃了。

参考链接
http://www.yac8.com/
https://blog.csdn.net/A_Cx97/article/details/50762324
https://mp.weixin.qq.com/s/5eoYyj-tp8tT__jwy-oqmA
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

上一篇下一篇

猜你喜欢

热点阅读