搜图片搜到了兰亭集序,发现有单字版可以欣赏,怎能错过。恰好最近看到有人利用python爬虫下载sci论文,给出的有代码,然后就学以致用,看看能不能爬下来这些图。由于是第一次写爬虫,尽管这个网页很简单,信息很明了,依旧花了笔者不少时间。
先欣赏书法
兰亭集序放大版兰亭集序
2014070479241625.jpg 2014070479402841.jpg 2014070521982611.jpg
附上《兰亭集序》原文:
永和九年,岁在癸丑,暮春之初,会于会稽山阴之兰亭,修禊事也。群贤毕至,少长咸集。此地有崇山峻岭,茂林修竹;又有清流激湍,映带左右,引以为流觞曲水,列坐其次。虽无丝竹管弦之盛,一觞一咏,亦足以畅叙幽情。是日也,天朗气清,惠风和畅,仰观宇宙之大,俯察品类之盛,所以游目骋怀,足以极视听之娱,信可乐也。
夫人之相与,俯仰一世,或取诸怀抱,悟言一室之内;或因寄所托,放浪形骸之外。虽趣舍万殊,静躁不同,当其欣于所遇,暂得于己,快然自足,不知老之将至。及其所之既倦,情随事迁,感慨系之矣。向之所欣,俯仰之间,已为陈迹,犹不能不以之兴怀。况修短随化,终期于尽。古人云:“死生亦大矣。”岂不痛哉!
每览昔人兴感之由,若合一契,未尝不临文嗟悼,不能喻之于怀。固知一死生为虚诞,齐彭殇为妄作。后之视今,亦犹今之视昔。悲夫!故列叙时人,录其所述,虽世殊事异,所以兴怀,其致一也。后之览者,亦将有感于斯文。
中学肯定背过,现在又看一遍,可以背吗?默写呢?
下面开始一点点分析如何爬下来上面那些图片。
- 在浏览器中打开http://www.yac8.com/news/10725.html,(本人使用的是chrome浏览器),按快捷键F12或者ctrl+shift+I打开开发者工具。选择Network,img,然后刷新页面,就可以看到想要的图片的链接。就是下面图片画红线的部分“http:*.jpg”,链接是直接给出的,下面就是怎么从页面html中获得这些链接。
image.png
此时我们选择Elements,可以找到图片链接,也是直接给出的,如图。
image.png
我们发现了 img和 src,此时我们就可以解析页面了。 - 利用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
- 根据链接下载图片
此时如果是在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/
网友评论