hshcompass 发表于 2021-1-9 19:02

小白学python之爬取《妖神记》作业

本帖最后由 hshcompass 于 2021-1-9 19:04 编辑

目标:动漫之家《妖神记》爬虫,听课习作
目标网址:https://www.dmzj.com/info/yaoshenji.html
主要知识:
——自动判断、创建所需目录
——切片知识
——bs4解析库使用技巧
——网址拼接技巧
——初级防爬Referer
——爬取结果反向排序
——图片文件保存
——正则使用
——html.script
'''-*- coding: utf-8 -*-
@AuThor: hshcompass
@QQ      : 46215528
@Time    : 2021/1/9 14:38
@Software: PyCharm
@file    : 妖神记.py
'''
# 爬取动漫之家----Yaoshenji

# 导入库
import re, os, time, requests
from bs4 import BeautifulSoup

# 保存目录
save_dir = '妖神记'
if save_dir not in os.listdir('./'):
    os.mkdir(save_dir)

# 1 获取所有章节名称和章节链接

# 目标网址
url ='https://www.dmzj.com/info/yaoshenji.html'

# 发送请求,获取响应
response =requests.get(url)


# 提取数据,解析网页
soup = BeautifulSoup(response.text, 'lxml')

# 图片位于 ul 标签 下的 li 标签,具体链接是 a 标签
list_con_li = soup.find('ul', class_="list_con_li autoHeight")
cartoon_list = list_con_li.find_all('a')

# 章节名称、链接
charpter_names = []
charpter_urls= []

for cartoon in cartoon_list:
    href = cartoon.get('href')
    name = cartoon.text
    charpter_names.insert(0,name)    # 没有使用 append 是因为章节是倒序排列,所以用 insert
    charpter_urls.insert(0,href)


# 2 根据每个章节链接获取所有图片链接
for i, url in enumerate(charpter_urls):
    """
    返回章节目录列表的索引位置
    """
    name = charpter_names

    # 为每一章节创建目录
    # 避免创建文件夹报错 把 . 去掉
    while '.' in name:
      name = name.replace('.', '')

    # 创建章节目录
    charpter_save_dir = os.path.join(save_dir, name)
    if name not in os.listdir(save_dir):
      os.mkdir(charpter_save_dir)

      response = requests.get(url)
      html = BeautifulSoup(response.text, 'lxml')

      # 获取script 标签里的内容
      script_info = html.script

      # 找长度为 13 或 14 的数字,取出来并 转为 str 字符串
      pics = re.findall('\|(\d{13,14})\|', str(script_info))
      # print(pics)

      # 遍历取出来的数字
      for j, pic in enumerate(pics):

            # 有的是 13 有的是 14 ,对 13 位的数字末位补 0
            if len(pics) == 13:
                pics = pic + '0'

      # 图片排序
      pics = sorted(pics, key=lambda x:int(x))

      charpter_hou = re.findall('\|(\d{5})\|', str(script_info))
      charpter_qian = re.findall('\|(\d{4})\|', str(script_info))

      headers = {
            'Referer': url,# 初级反爬
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
      }
      # 拼接链接网址

      for idx, pic in enumerate(pics):
            # 如果最后一位数字是 0
            if pic[:-1] == '0':
                # 【:-1】 表示切片时不要最后一位,取到最后一位前面
                url = 'https://images.dmzj.com/img/chapterpic/' + charpter_qian + '/' + charpter_hou + '/' + pic[:-1] + '.jpg'
            else:
                url = 'https://images.dmzj.com/img/chapterpic/' + charpter_qian + '/' + charpter_hou + '/' + pic + '.jpg'
            print(url)

            # 保存图片名和图片保存图片路径
            pic_name ='%03d.jpg' %(idx +1)# 001-002-003.....199避免图片数量超过设置,扩大一些
            pic_save_path = os.path.join(charpter_save_dir, pic_name)

            # 发送请求,下载图片
            resp = requests.get(url, headers = headers)
            # 如果状态码 正常 200,保存图片文件
            if resp.status_code == 200:
                with open(pic_save_path, 'wb') as f:
                  f.write(resp.content)
            else:
                print('链接异常')




第一次发贴,发出来就算成功。
请前辈老师帮忙批改作业。










lpdswing 发表于 2021-1-9 19:24

能优化的地方很多啊
os.path.exists(save_dir) 替换掉那个遍历,

orange2478 发表于 2021-1-9 19:24

支持每行代码中文解释,学习一下

Cool_Breeze 发表于 2021-1-9 20:12

这个网站新手练习很不错!

sunhuiwang 发表于 2021-1-9 20:15

不错,不错,学习了。有没有爬链家的{:1_893:}

bandishui 发表于 2021-1-9 20:46

可以, 练练手

Deuez 发表于 2021-1-9 22:05

hshcompass 发表于 2021-2-22 23:26

Deuez 发表于 2021-1-9 22:05
请问楼楼学爬虫看的什么教程啊,我也正要学呐。

建议到B站看看免费的视频。非常多的,很多不错。

Deuez 发表于 2021-2-23 11:15

likeme 发表于 2021-2-23 17:59

这本有生之年作品,难道已经完本了?
页: [1]
查看完整版本: 小白学python之爬取《妖神记》作业