林田球的《异兽魔都》 画风诡异,故事简单粗暴,在线看完甚是喜爱,奈何下载资源不全,自行想办法,爬取一个留念。
- 漫画在线资源 异兽魔都 ,首页如下图。获取章节列表内容,第 n 卷/话 和 url 。
使用requests.get() 和 BeautifulSoup(),获取和解析网页内容,并将 卷/话的url 和名称 分别存储于 roll_url = [], roll_title = [] 中。
import requests
from bs4 import BeautifulSoup
def get_roll_urls(home_url):
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}
response = requests.get(home_url, headers=headers) # 定义获取url
print(response.status_code, '正常')
if response.status_code == 200: # 判断是否正常访问
try:
# 获取每卷的地址
soup = BeautifulSoup(response.text, 'html.parser')
roll_url = []
roll_title = []
items = soup.find('ul', 'ar_rlos_bor ar_list_col').find_all('a')
items = [x.attrs for x in items]
print('获取每卷 url 和 title...')
for i in range(len(items)): #
roll_url.append(items[i]['href']) # 每卷的 url
roll_title.append(items[i]['title']) # 每卷的 名称
print('获取完成')
return roll_url, roll_title
except TimeoutError:
# 重新加载
return get_roll_urls(home_url)
2. 创建文件夹存放漫画。文件夹以每卷/话名来命名,如果存在直接进入该文件夹下载图片,文件夹不存在则新建文件夹再下载图片。
import os
home_url = 'https://www.177mh.net/colist_146491.html' # 首页
# 获取每卷/话 url 和 title
roll_urls, roll_titles = get_roll_urls(home_url)
for i in range(len(roll_titles)): # 创建文件夹
if os.path.exists(str(roll_titles[i])):
os.chdir(str(roll_titles[i])) # 进入文件夹
else:
os.mkdir(str(roll_titles[i])) # 创建文件夹
os.chdir(str(roll_titles[i])) # 进入文件夹
print('进入{}文件夹'.format(roll_titles[i]))
3. 获取每卷/话的页数,用于下一步下载图片的循环的阈值。因requests获取的源代码获取不到页数及图片url,此处爬取使用selenium无浏览器界面模式。
import requests
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_num_max(roll_url):
print('启动浏览器')
chrome_options = Options()
# 设置chrome浏览器无界面模式
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
# 等待,判断是否网页是否存在
start_url = 'https://www.177mh.net/'
page_code = requests.get((start_url + roll_url), verify=False).status_code
if page_code is 200:
browser.get((start_url + roll_url))
# 获取图片地址
number = browser.find_element_by_xpath('//*[@id="main"]/p[1]/span[2]/b[2]')
num_max = int(number.text)
browser.close()
return num_max
4. 获取每页图片url,用于下一步下载图片。同样爬取使用selenium无浏览器界面模式。
每页网址各式: https://www.177mh.net/201411/293656.html#@page=2
网址中带有 ‘#‘ 直接在同一个browser中无法直接跳转到下一页,显示的还是当前页,所以只能每一页重新调用一次browser。
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def get_img_url(roll_url, j):
print('启动浏览器')
chrome_options = Options()
# 设置chrome浏览器无界面模式
chrome_options.add_argument('--headless')
browser = webdriver.Chrome(chrome_options=chrome_options)
wait = WebDriverWait(browser, 5)
# 等待,判断是否网页是否存在
start_url = 'https://www.177mh.net/'
page_num = '#@page=' + str(j)
print('第{}页 url:'.format(j), start_url + roll_url + page_num)
page_code = requests.get((start_url + roll_url + page_num), verify=False).status_code
if page_code is 200:
browser.get((start_url + roll_url + page_num))
# 获取图片地址
img = wait.until(EC.presence_of_element_located((By.ID, "dracga")))
img_url = img.get_attribute('src')
print('第{}页图片 url:'.format(j), img_url)
browser.close()
return img_url
5. 图片下载存到本地文件夹中。
def write_to_file(j, img):
nub = name_jpg(j)
with open(nub, 'wb') as f:
f.write(img)
f.close()
def name_jpg(j):
if j < 10:
nub = '00' + str(j) + '.jpg'
elif j < 100:
nub = '0' + str(j) + '.jpg'
else:
nub = str(j) + '.jpg'
return nub
img_url = get_img_url(roll_urls[i], j)
img_url = img_url .replace('.webp', '') # 去除某些以 ‘.webp’结尾的 url
if img_url is not None: # 二进制图片
img = requests.get(img_url).content
write_to_file(j, img)
else:
pass
6. 主程序
def main():
home_url = 'https://www.177mh.net/colist_146491.html' # 首页
# 获取每卷/话 url 和 title
roll_urls, roll_titles = get_roll_urls(home_url)
for i in range(len(roll_titles)): # 创建文件夹
if os.path.exists(str(roll_titles[i])):
os.chdir(str(roll_titles[i])) # 进入文件夹
else:
os.mkdir(str(roll_titles[i])) # 创建文件夹
os.chdir(str(roll_titles[i])) # 进入文件夹
print('进入{}文件夹'.format(roll_titles[i]))
num_max = get_num_max(roll_urls[i])
print('共{}页'.format(num_max))
for j in range(1, num_max+1):
if os.path.exists(name_jpg(j)):
continue
else:
img_url = get_img_url(roll_urls[i], j)
img_url = img_url .replace('.webp', '') # 去除某些以 ‘.webp’结尾的 url
if img_url is not None: # 二进制图片
img = requests.get(img_url).content
write_to_file(j, img)
else:
pass
os.chdir(os.path.dirname(os.getcwd()))
print('{}下载完成'.format(roll_titles[i]))
不足之处:网页刷新太慢或者打不开的情况下,会让选择切换路线,暂时还没解决。待研究中....