昨天看到了这篇文章,大有收获,通过查阅资料等方式,自己给代码添加了更多的注释,解释了其中一些函数的使用。
原文链接:https://jackcui.blog.csdn.net/article/details/105946174
import requests
import os
import re
from bs4 import BeautifulSoup
from contextlib import closing
from tqdm import tqdm
import time
save_dir = '妖神记'
if save_dir not in os.listdir('./'):
#在当前目录下创建'妖神记’目录
#os.listdir(path):获取指定文件夹中的所有文件和子文件夹名称组成的列表;('/'):在当前目录下
os.mkdir(save_dir)
target_url = "https://www.dmzj.com/info/yaoshenji.html"
r = requests.get(target_url)
bs = BeautifulSoup(r.text, 'lxml')
list_con_li = bs.find('ul', class_="list_con_li")#得到list_con_li标签
cartoon_list = list_con_li.find_all('a')#以列表形式返回所有的a标签
chapter_names = []
chapter_urls = []
for cartoon in cartoon_list:#遍历每一个a标签
href = cartoon.get('href')
name = cartoon.text
chapter_names.insert(0, name)#insert(0,name):在指定位置向列表中插入元素
chapter_urls.insert(0, href)
for i, url in enumerate(tqdm(chapter_urls)):#遍历每一个章节链接 enumerate():遍历一个集合对象,同时得到当前元素的索引位置 tqdm():显示进度
download_header = {
'Referer': url
}
name = chapter_names[i]#获得章节名称
while '.' in name:
name = name.replace('.', '')#去掉章节名称中的'.'保证文件名合法
chapter_save_dir = os.path.join(save_dir, name)#os.path.join():路径拼接函数,即生成路径'save_dir/name'
if name not in os.listdir(save_dir):#创建章节目录
os.mkdir(chapter_save_dir)
r = requests.get(url)
html = BeautifulSoup(r.text, 'lxml')
script_info = html.script#得到html页面中的script标签
pics = re.findall('\d{13,14}', str(script_info))#将script标签转为字符串类型,用正则表达式取出其中长度为13或14的数字,以列表形式返回
for j, pic in enumerate(pics):#如果数字13位就末尾补0
if len(pic) == 13:
pics[j] = pic + '0'
pics = sorted(pics, key=lambda x:int(x))#按照大小从小到大排序,使用lambda表达式,将参数x转为整型
chapterpic_hou = re.findall('\|(\d{5})\|', str(script_info))[0]#从script标签内找到所有位数为5的数字,以列表形式返回,并取列表首位(因为只有一个)
chapterpic_qian = re.findall('\|(\d{4})\|', str(script_info))[0]
for idx, pic in enumerate(pics):
if pic[-1] == '0':#如果数字最后一位是0 pic[-1]:取字符串最后一位
url = 'https://images.dmzj.com/img/chapterpic/' + chapterpic_qian + '/' + chapterpic_hou + '/' + pic[:-1] + '.jpg'
#pic[:-1]:取从第一位到最后一位之前的所有内容。 pic='python' pic[:-1]='pytho' (去掉补的0)
else:
url = 'https://images.dmzj.com/img/chapterpic/' + chapterpic_qian + '/' + chapterpic_hou + '/' + pic + '.jpg'
pic_name = '%03d.jpg' % (idx + 1)
#%3d--可以指定宽度,不足的左边补空格 %-3d--左对齐 %03d---左边补0的等宽格式,比如数字12,%03d出来就是:012
pic_save_path = os.path.join(chapter_save_dir, pic_name)#生成路径'save_dir/name/001.jpg'
response=requests.get(url, headers = download_header, stream = True) #修改headers,返回Referer
if response.status_code == 200:#如果状态正常
with open(pic_save_path, "wb") as file: #以二进制形式打开文件
for data in response.iter_content(): #以二进制形式打开的文件需要使用iter_content()函数迭代写入
file.write(data)
else:
print('链接异常')