本帖最后由 hshcompass 于 2021-1-9 19:04 编辑
目标:动漫之家《妖神记》爬虫,听课习作
目标网址:https://www.dmzj.com/info/yaoshenji.html
主要知识:
——自动判断、创建所需目录
——切片知识
——bs4解析库使用技巧
——网址拼接技巧
——初级防爬Referer
——爬取结果反向排序
——图片文件保存
——正则使用
——html.script
[Python] 纯文本查看 复制代码 '''-*- coding: utf-8 -*-
[url=home.php?mod=space&uid=686208]@AuThor[/url] : hshcompass
@QQ : 46215528
[url=home.php?mod=space&uid=238618]@Time[/url] : 2021/1/9 14:38
@Software: PyCharm
[url=home.php?mod=space&uid=267492]@file[/url] : 妖神记.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[i]
# 为每一章节创建目录
# 避免创建文件夹报错 把 . 去掉
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[j] = pic + '0'
# 图片排序
pics = sorted(pics, key=lambda x:int(x))
charpter_hou = re.findall('\|(\d{5})\|', str(script_info))[0]
charpter_qian = re.findall('\|(\d{4})\|', str(script_info))[0]
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('链接异常')
第一次发贴,发出来就算成功。
请前辈老师帮忙批改作业。
|