平时经常在网上在线看漫画,常去风之动漫。写了一个爬虫来下载漫画。漫画画面所在的内容并不是一开始就加载好的:前两个html里面没有漫画图片地址。图片地址由js文件得出。可以使用selenium来模拟浏览器工作。安装selenium并不难。但需要下一个配套的driver,我是firefox的浏览器,下了一个geckodriver。谷歌浏览器得注意浏览器版本啥的,具体可参见: https://blog.csdn.net/qq_42543250/article/details/81290876. 其实调firefox主要是为了方便调试,自己看着清楚,调试完成后可以换成PhantomJS(官网下载,要加环境变量),一个没有图形界面的浏览器,反正爬的过程也不会去看。。。
在这里插入图片描述使用的库:selenium, requests, BeautifulSoup, os

首先是下载图片,这个挺常用的。打开到一个图片的源地址:
在这里插入图片描述 这个网页。爬取方法就是:把这个页面以二进制文件形式存下来,然后改后缀即可。下载其它的文件也可以使用同种方法。见down_img函数。
接下来是找到这个图片的源地址的方法。回到漫画所在页面:这个地方需要用selenium模拟浏览器进行。为了方便看,先用有图形界面的浏览器。(要安装geckodriver,没安就算了)

browser = webdriver.Firefox()

这时候应该会弹出一个浏览器的界面。Selenium用法还是很人性化的,可以模拟各种操作:单击双击输入文本……推荐b站上的av63536266,跟着里面selenium那一节走一遍,应该就会了,也可参考官方文档:https://python-selenium-zh.readthedocs.io/zh_CN/latest/。
这里使用的是利用点击漫画位置翻页。各种找网页位置用的是css选择器,可参考:https://www.w3school.com.cn/cssref/css_selectors.asp。页面加载需要时间,这就需要等待。这里等待采用显示等待,隐式等待一般会比较慢,因为它会等页面完全加载完。具体用法可以参考官方文档的第5节显示等待的那个示例。然后写个循环一张图一张图地下载就好了。见函数down_chapter。
最后是转到要下载的漫画的目录页面爬取各话信息。打开如下界面:
在这里插入图片描述 发现信息都在html上,Requests+Beautifulsoup解决问题。

完整代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import requests
from bs4 import BeautifulSoup
import os
from multiprocessing import Pool
base_dir = './巨人/'
def down_img(url, save_dir):
    r = requests.get(url)
    with open(save_dir, 'wb') as f:
        f.write(r.content)
            
def down_chapter(url):
    lst = []
    browser = webdriver.PhantomJS()
    try:
        browser.get(url)
        element = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mhpic')))
        title = browser.find_element(By.CSS_SELECTOR, '#pjax-container h1').text
        print(title)
        lst.append(browser.find_element(By.CSS_SELECTOR, '#mhpic').get_attribute('src'))
        while browser.find_elements(By.CSS_SELECTOR, '#mhimg0 a'):
            botton = browser.find_element(By.CSS_SELECTOR, '#mhimg0 a')
            botton.click()
            element = WebDriverWait(browser,10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mhpic')))
            lst.append(browser.find_element(By.CSS_SELECTOR, '#mhpic').get_attribute('src'))
    finally:
        browser.close()
    if not os.path.exists(base_dir + title + '/'):
        os.mkdir(base_dir + title + '/')
    for i in range(len(lst)):
        down_img(lst[i], base_dir + title + '/' + str(i) + '.jpg')
    return lst

if __name__ == '__main__':
    if not os.path.exists(base_dir):
        os.mkdir(base_dir)
        
    base_url = 'https://manhua.fzdm.com/39/'
    r = requests.get(base_url)
    soup = BeautifulSoup(r.text, 'lxml')
    
    chapter_lst = [base_url + chapter['href'] for chapter in soup.select('.pure-u-1-2 a')]
    pool = Pool()
    pool.map(down_chapter, chapter_lst)

爬虫结果:
在这里插入图片描述

p.s.听说谏山创立了个flag,要今年完结巨人,有点小期待。

Logo

加入社区!打开量化的大门,首批课程上线啦!

更多推荐