美文网首页
一起欣赏书法呀

一起欣赏书法呀

作者: 灵木er | 来源:发表于2020-05-24 11:26 被阅读0次

    搜图片搜到了兰亭集序,发现有单字版可以欣赏,怎能错过。恰好最近看到有人利用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/

    相关文章

      网友评论

          本文标题:一起欣赏书法呀

          本文链接:https://www.haomeiwen.com/subject/fbalahtx.html