一个瓜皮的腾讯动漫爬虫

零基础,一直十分想要下载腾讯动漫上的漫画,之前找了好几个爬虫总是运转的不太好,有一个爬虫能用,但是好像最近腾讯又改动了页面导致匹配出现了点问题。
于是一边查一边复制粘贴一边自己摸索一天半搞了这个弟弟爬虫,基本等于按键精灵,不能保障完全下完,速度慢,一个页面一直走。
但是毕竟是自己写的第一个爬虫,达到了目的,所以还是很开心!
一个瓜皮的腾讯动漫爬虫_第1张图片
另外,我下载漫画只是为了后续可能视频剪辑会用,请尊重版权,喜欢的漫画请购买正版~
用户登陆
如果是爬取非vip漫画不需要登陆,如果爬取vip漫画需要一个购买完要爬的漫画的账号来进行登陆
腾讯系列的网站都差不多,所以抄了网上别人的QQ空间模拟登陆:https://blog.csdn.net/crjmail/article/details/81666284

    #第一次通过send_keys向输入框发送用户名密码登录
    driver1.switch_to.frame('iframeAll')  # 切换到登陆界面
    driver1.find_element_by_id('switcher_plogin').click()   # 选择帐号密码登陆
    time.sleep(0.5)
    driver1.find_element_by_name('u').clear()
    time.sleep(0.5)
    driver1.find_element_by_name('u').send_keys('账号')  # 此处输入你的QQ号
    time.sleep(0.5)
    driver1.find_element_by_name('p').clear()
    time.sleep(0.5)
    driver1.find_element_by_name('p').send_keys('密码')  # 此处输入你的QQ密码
    time.sleep(1)
    driver1.find_element_by_id('login_button').click() # 点击登陆按键

滚屏漫画加载
腾讯动漫是采用滚屏满满加载的方式,所以这边模拟了下滑操作,并且这个操作没有任何保证,就是慢慢下滑
如果想要稳妥就是每次下滑的少一点,下滑次数多一点这样子慢慢来
这一部分还有待改进的空间,我有尝试过网上一位大佬的方法,大概是不断前后滚屏,判断元素是否load,不过失败了。所以就还是这个弟弟做法。这个方法对于更新页数稳定的漫画还是可以的。

        for i in range(0,30):
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            time.sleep(2)

提取标题设置存储路径

        #提取标题
        title  = soup.title.string
        print(title)
        titlelist = title.split('-')
        title = titlelist[0]
        titlelist = title.split('》')
        title = titlelist[1]
        x = 0
        path = "comic/yiren/"+title+"/"  # 存储每章节漫画路径
        if (os.path.exists(path)):#判断文件夹是否存在,存在则删除再创建
            shutil.rmtree(path)
            time.sleep(5)
            os.mkdir(path)
        else:
            os.mkdir(path)

下载漫画
没有很认真的匹配正则式所以里面有点横条小图

        imglist = soup.find_all("img", {"src": re.compile('.*?\.jpg/0')})  # 查找图片
        for img in imglist:#下载图片
            print(img['src'])
            r = requests.get(img['src'], stream=True)
            image_name = x
            with open(path+'%s.jpg' % image_name, 'wb') as f:
                for chunk in r.iter_content(chunk_size=128):
                    f.write(chunk)
            print('Saved %s' % str(image_name))
            x += 1

点击下一页
因为理想状态下是滚屏到了页面底部,所以可以直接点击下一页
比较傻的办法,但是好处就是不用cookie,第一部登陆后一键到底,但是坏处就是出现超页的时候会找不到元素而中断。

driver1.find_element_by_xpath("//*[@id='mainControlNext']").click()

完整代码

import time #用来延时
import re,os
import requests
from selenium import webdriver
import selenium.webdriver.common.keys as keys
from bs4 import BeautifulSoup
import shutil

def downloadimg():

    option=webdriver.ChromeOptions()
    option.add_argument('headless') # 设置option隐藏
    print("启动")
    driver1 = webdriver.Chrome(chrome_options=option)
    driver1.get("https://ac.qq.com/ComicView/index/id/531490/cid/453")#下载漫画的连接入口
    driver1.maximize_window()
    time.sleep(3)
    ****需要VIP的漫画需要登陆并购买好完整漫画***********
    #第一次通过send_keys向输入框发送用户名密码登录
    driver1.switch_to.frame('iframeAll')  # 切换到登陆界面
    driver1.find_element_by_id('switcher_plogin').click()   # 选择帐号密码登陆
    time.sleep(0.5)
    driver1.find_element_by_name('u').clear()
    time.sleep(0.5)
    driver1.find_element_by_name('u').send_keys(' ')  # 此处输入你的QQ号
    time.sleep(0.5)
    driver1.find_element_by_name('p').clear()
    time.sleep(0.5)
    driver1.find_element_by_name('p').send_keys(' ')  # 此处输入你的QQ密码
    time.sleep(1)
    driver1.find_element_by_id('login_button').click() # 点击登陆按键
     ****支持正版漫画**********
    for j in range(0,100):
        
        time.sleep(2)
        
        for i in range(0,30):
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            driver1.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
            time.sleep(2)
 
        soup = BeautifulSoup(driver1.page_source, "html.parser")
        #提取标题
        title  = soup.title.string
        print(title)
        titlelist = title.split('-')
        title = titlelist[0]
        titlelist = title.split('》')
        title = titlelist[1]
        #print(soup)
        imglist = soup.find_all("img", {"src": re.compile('.*?\.jpg/0')})  # 查找图片
        #print(imglist)
        x = 0
        path = "comic/yiren/"+title+"/"  # 存储每章节漫画路径
        if (os.path.exists(path)):#判断文件夹是否存在,存在则删除再创建
            shutil.rmtree(path)
            time.sleep(5)
            os.mkdir(path)
        else:
            os.mkdir(path)
            
        for img in imglist:#下载图片
            print(img['src'])
            r = requests.get(img['src'], stream=True)
            image_name = x
            with open(path+'%s.jpg' % image_name, 'wb') as f:
                for chunk in r.iter_content(chunk_size=128):
                    f.write(chunk)
            print('Saved %s' % str(image_name))
            x += 1
            
        driver1.find_element_by_xpath("//*[@id='mainControlNext']").click()
        
if __name__ == '__main__':
    downloadimg()

一些尝试过却没有用上的方法
1.滚屏

 js = "var q=document.body.scrollTop=10000" #chrome浏览器,滚到底部失败,无反应
 driver1.execute_script(js)

2.判断元素是否load来判断是否加载完毕,配合滚屏操作

time_start=datetime.datetime.now()
        while (datetime.datetime.now()-time_start).total_seconds()<500:
            items = self.driver.find_elements_by_xpath("/html/body/div[@id = 'mainView']/ul/li/img")
            try:
                for index, item in enumerate(items):
                    if item.get_attribute("class") != 'loaded':
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_UP)
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_UP)
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
                        self.driver.find_element_by_xpath("/html/body").send_keys(keys.Keys.PAGE_DOWN)
                        print('pic index: {}/{} not loaded, this is the {}th time'.format(index, len(items), index))
                        time.sleep(0.5)
                        break
                else:
                    break
            except Exception as e:
                print(e)
                break
        items = self.driver.find_elements_by_xpath("/html/body/div[@id = 'mainView']/ul/li/img")
       

3.使用cookie
第一种方法成功过一段时间,之后失效,尝试第二种方法,失败
https://www.cnblogs.com/cnhkzyy/p/9260373.html

你可能感兴趣的:(爬虫)