(学习笔记)Python3网络爬虫(三):漫画下载,动态加载、反爬虫这都不叫事!

该博客详细介绍了如何使用Python爬虫从动漫之家网站抓取《妖神记》漫画的图片,包括解析HTML,提取章节链接,下载图片等内容。涉及的技术包括requests, BeautifulSoup, 正则表达式等。
摘要由CSDN通过智能技术生成

昨天看到了这篇文章,大有收获,通过查阅资料等方式,自己给代码添加了更多的注释,解释了其中一些函数的使用。

原文链接: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('链接异常')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值