近几年,云计算、大数据和人工智能加上5G的到来,感觉还是要顺应时代的发展学习一下python来防防身。
兴趣是学习最好的老师,也是最大的动力,基于本人有时候会猎奇一下漫画,但是看到一半网络不给力的时候,看得特别不爽。
所以我就以这个为切入点去学习。
那么废话不多说
import urllib.request
import re
import requests
import os
#https://www.mkzhan.com/209893/
source_html = (input('输入https://www.mkzhan.com漫画目录网址:'))
source_html = source_html.replace(' ','')
#考虑到我看挺多漫画的,逐个在代码里改比较麻烦,所以后来用input代替
#这里的source_html也用来补全data-chapterid(530643)用到
print('source_html的数据:',source_html)
print('source_html数据类型:',type(source_html))
#Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。
print ('========================')#分割线
html = source_html
#把source_html的数据赋值给变量html
print ('html = source_html的数据:',html)
print('html数据类型:',type(html))
print ('========================')#分割线
html = urllib.request.urlopen(html)
#得到的数据是<http.client.HTTPResponse object at 0x000001908C95A3C8> ,http.客户端.http响应对象位于0x000001908C95A3C8?HTTPResposne类型的对象? 这个没搞懂
print ('html = urllib.request.urlopen(html)的数据:',html)
print('urllib.request.urlopen(html).read()后的数据类型:',type(html))
print ('========================')#分割线
html = html.read()
#response.read()就可以得到返回的网页内容
print ('html = html.read()的数据:',html)
print('html.read()后的数据类型:',type(html))
print ('========================')#分割线
html = html.decode('utf-8')
#前面得到的数据类型是bytes,需要在转为utf-8
#Bytes才是计算机里真正的数据类型,也是网络数据传输中唯一的数据格式
#Bytes的数据与字符串类型数据的转换就是编码与解码的转换,utf-8是编解码时指定的格式。
print('转格式后的html的数据类型:',type(html))
#<a class="j-chapter-link" data-hreflink="/209893/530643.html" data-chapterid="530643"> 一击男出张版 </a>
reg = r'data-chapterid="(.*?)">(.*?)</a>' #创建正则表达式,来匹配到章节名称与对应的data-chapterid(530643)
#简单来说章节 :一击男出张版 对应的连接是 https://www.mkzhan.com/209893/ + 530643
reg = re.compile(reg,re.S) #用compile函数生成一个正则表达式(Pattern)对象
#正则表达式学习查考链接:https://www.runoob.com/python3/python3-reg-expressions.html
urls = re.findall(reg,html) #使用findall()在字符串中找到正则表达式所匹配的所有子串
#这里是返回所有章节及对应的data-chapterid,然后生成一个列表
urls.reverse()#因为生成的列表是倒序的,所以这里要把列表反向排序
#下面开始加快速度
for url in urls:#用for循环,使得变量url 遍历列表urls
print (url)#打印元组url遍历到列表urls的数据
print (type(url))
href_url = url[0] #把元组中的值赋值给href_url
href_url = source_html + href_url #把source_html 与 href_url 拼接起来 得到完整的url
print (href_url)
print (type(href_url))
title_url = url[1]#把元组中的值赋值给title_url
title_url = title_url.replace('\n','')
title_url = title_url.replace(' ','')
title_url = title_url.replace('<iclass="j-update-iconicon-has-updatehide"data-chapterid="831946"></i>', '')
#把匹配到的不需要的数据进行删除
print (title_url)
print (type(title_url))
chapter_html = urllib.request.urlopen(href_url).read()
chapter_html = chapter_html.decode('utf-8')
chapter_reg = r'<img class="lazy-read" data-src="(.*?)" src='
chapter_reg = re.compile(chapter_reg)
pic_urls = re.findall(chapter_reg, chapter_html)#这里得到的是图片url的列表
for pic_url in pic_urls:
print (pic_url)
pic = requests.get(pic_url)
pic_num = pic_urls.index(pic_url)
file = title_url
if (os.path.exists(file)):
print('nothing')
else:
os.mkdir(file)
print('mkdir file')
#用章节名称创建文件夹,并检测文件夹是否存在,若不存在则创建
n1 = title_url + '/' + str(pic_num)
#创建图片存放路径
with open('{}.jpg'.format(n1), 'wb+') as f:
for chunk in pic.iter_content(1024):
f.write(chunk)
#这里是保存图片
# print(html)
# print(urls)
运行的时候,到达自己想要的效果的时候,自己好感动,突然想分享出来。
当自己想分享出来的时候,想到自己作为一个小白去查资料学习的过程曲折道路,就想尽可能写给一些初学者也能看的懂,回去查了一下各个代码的含义。结果发现自己仅仅只是初步会用而已,离理解还差得很有远,好惭愧啊。
作为小白的理解,可以会误导初学者,有大佬发现什么问题,请用力喷我即可。