Python 初级运用 request 和 selenium 爬取漫画

     林田球的《异兽魔都》 画风诡异,故事简单粗暴,在线看完甚是喜爱,奈何下载资源不全,自行想办法,爬取一个留念。

  1. 漫画在线资源 异兽魔都 ,首页如下图。获取章节列表内容,第 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]))

不足之处:网页刷新太慢或者打不开的情况下,会让选择切换路线,暂时还没解决。待研究中....

发布了16 篇原创文章 · 获赞 1 · 访问量 1565

猜你喜欢

转载自blog.csdn.net/weixin_41300650/article/details/104401038