近几年,云计算、大数据和人工智能加上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)

运行的时候,到达自己想要的效果的时候,自己好感动,突然想分享出来。

当自己想分享出来的时候,想到自己作为一个小白去查资料学习的过程曲折道路,就想尽可能写给一些初学者也能看的懂,回去查了一下各个代码的含义。结果发现自己仅仅只是初步会用而已,离理解还差得很有远,好惭愧啊。

作为小白的理解,可以会误导初学者,有大佬发现什么问题,请用力喷我即可。