python_腾讯动漫爬取

本章教学爬取腾讯动漫,实现腾讯动漫爬取

爬取腾讯动漫和普通图片大不一样,腾讯的反爬虫机制比较多,主要克服问题:
1.Javascript动态加载
2.图片异步加载

实现代码的基本思路
    1找出所要下载腾讯动漫章节的url
    2生成需要爬取N个章节的url
    3打开每一章节url,获取里面的数据,找出里面的所有的动漫图片地址(这里解决Javascript动态加载、图片异步加载问题)
    4下载所有动漫图片
下面是具体的代码实现
from selenium import webdriver  #解决图片异步加载的包
import time
import re
import os
import urllib.request

#找到动漫名称,根据动漫名创建存储的文件夹
def find_title(url):
    # 这里解决JavaScript动态加载
    driver = webdriver.PhantomJS()  
    driver.get(url)
    data = driver.page_source  # 获取网页文本
    p = r'<title>《(.*?)》'
    title = re.findall(p,data)
    title = title[0]
    if os.path.exists(title):
        print('文件已存在')
    else:
        os.mkdir(title)
        print('创建文件夹成功')
    time.sleep(5)
    return title

#1.1找到目的章节url最后一个数字,为的是获取接下来所有章节的url
def find_firstnmber(url): #还可以切割
    data = url
    p = r'/([0-9]+)$'
    firstnmber = re.findall(p,data)
    firstnmber = int(firstnmber[0])
    return firstnmber
#1.2获取接下来所有章节的url
def find_front_url(url,firstnmber):
    array = []
    for i in url:
        array.append(i)
    array1 = array[:]  # 正确复制
    for d in range(len(firstnmber)):
        del array1[len(array) - 1 - d]
    str1 = ','.join(array1)
    front_url = str1.replace(',', '')
    return front_url
#第2点在主函数内完成
#3.1打开每一章节url,获取里面的数据
def Download_chapter_url(url,title,chapter,driver):
    driver.get(url)
    html_route = "./"+title+"/第"+str(chapter)+"章.html"
    if os.path.exists(html_route):
        print('html文件已存在,跳过爬取网页步骤')
    else:
        n = 15
        for i in range(1, n + 1):
            time.sleep(0.5)#我采用的睡眠0.5s向下滚动一次,可自行调节
            #这里解决Javascript动态加载
            js = 'var q=document.getElementById("mainView").scrollTop=' + str(i * 1000)
            driver.execute_script(js)
        data = driver.page_source  # 获取网页文本
        fh = open(html_route, "w", encoding="utf-8")
        fh.write(data)
        fh.close()

#3.2找出所章节里的图片地址
def find_chapter_pictures(title,chapter):
    # 打开目的文件
    filename = "./"+title+"/第"+str(chapter)+"章.html"
    with open(filename, 'rb') as f:
        html = f.read().decode('utf-8')
        # 正则出章节标题、url
        p1 = r'<title>《.*》(.*)-在线漫画'
        chapter_title = re.findall(p1, html)
        # print(chapter_title)
        chapter_title = chapter_title[0]
        p2 = r'(https://manhua.qpic.cn/manhua.*?\.jpg/0)'
        imglist = re.findall(p2, html)
        del imglist[0]
        print('爬取到' + str(len(imglist)) + '张图片,预计耗时' + str(1 * len(imglist)) + 's')
        chapter_route = './'+title+'/'+'第'+str(chapter)+'章'+chapter_title
        if os.path.exists(chapter_route):
            print('章节文件夹已存在,跳过图片下载')
        else:
            os.mkdir(chapter_route)
            h = 0
            for k in imglist: #k单张链接
                h = h + 1 #h代表第几张图
                # print(j)
                download_jpg(k, h, chapter_route)#3s
            print('本章下载完成')

#4下载所有动漫图片
def download_jpg(jpg_url,page,chapter_route):
    req = urllib.request.Request(jpg_url)
    req.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
    response = urllib.request.urlopen(req)
    jpg_html = response.read()
    jpg = open(chapter_route+'/'+str(page)+'.jpg', 'wb')
    jpg.write(jpg_html)
    jpg.close()
    print('图片'+str(page)+'下载完成')
    time.sleep(1)

#主函数
if __name__ == '__main__':
    url = input("请输入你想爬取的腾讯动漫网址:")
    driver = webdriver.PhantomJS()  # 加载模拟浏览器
    sum_page = int(input("请输入你想下载的章节数:"))
    # 先加载一次网页,获取动漫名,创建文件夹
    title = find_title(url)#5s
    firstnmber = find_firstnmber(url)
    front_url = find_front_url(url,str(firstnmber))
    # sum_page = 1
    # 打开每章节    ,正则出章节名字,创建文件夹,
    #2通过for循环生成需要爬取N个章节的url
    for i in range(sum_page):
        now_page = firstnmber + i
        now_url = front_url + str(now_page)
        chapter = i + 1
        print("开始模拟浏览器,爬取本章页面代码,预计耗时8s")#这里是JavaScript代码运行时间,可自行调节
        Download_chapter_url(now_url, title, chapter,driver)#将文件放入 ./title/第n章.html
        print("开始下载本章图片")
        find_chapter_pictures(title,chapter)#60s
    driver.quit()
运行效果
12.JPG

15.JPG

13.JPG

14.JPG
注意!1.由于我的存储路径是绝对路径,在E:\python\untitled\,大家可以新建这个路径,并在此路径下运行py文件(新手建议),或者自行修改代码。2.需要相关的包齐全才能运行。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351