欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python爬虫,爬取腾讯漫画实战

程序员文章站 2022-10-04 10:53:06
先上个爬取的结果图 最后的结果为每部漫画按章节保存 运行环境 IDE VS2019 Python3.7 Chrome、ChromeDriver Chrome和ChromeDriver的版本需要相互对应 先上代码,代码非常简短,包含空行也才50行,多亏了python强大的库 简单解释 输入一个漫画的u ......

先上个爬取的结果图

最后的结果为每部漫画按章节保存

Python爬虫,爬取腾讯漫画实战

Python爬虫,爬取腾讯漫画实战

 

 运行环境

ide vs2019

python3.7

chrome、chromedriver

chrome和chromedriver的版本需要相互对应

先上代码,代码非常简短,包含空行也才50行,多亏了python强大的库

import os
import time
import requests
from selenium import webdriver
from lxml import etree

def getchapterurl(url):
    headers = {
            "user-agent": "mozilla/5.0 (macintosh; intel mac os x 10_13_4) applewebkit/537.36 (khtml, like gecko) chrome/66.0.3359.139 safari/537.36"
        }
    part_url = "http://ac.qq.com"
    res = requests.get(url, headers=headers)
    html=res.content.decode()
    el = etree.html(html)
    li_list = el.xpath('//*[@id="chapter"]/div[2]/ol[1]/li')
    for li in li_list:
            for p in li.xpath("./p"):
                for span in p.xpath("./span[@class='works-chapter-item']"):
                    item = {}
                    list_title = span.xpath("./a/@title")[0].replace(' ', '').split(':')
                    if list_title[1].startswith(('第', '序')):
                        getchapterfile(part_url + span.xpath("./a/@href")[0], list_title[0],list_title[1])

def getchapterfile(url,path1,path2):
    #path = os.path.join(path)
    #漫画名称目录
    path=os.path.join(path1)
    if not os.path.exists(path):
        os.mkdir(path)
    #章节目录
    path=path+'\\'+path2
    if not os.path.exists(path):
        os.mkdir(path)
    chrome=webdriver.chrome()
    #"http://ac.qq.com/comicview/index/id/505435/cid/2"
    chrome.get(url)
    time.sleep(4)
    imgs = chrome.find_elements_by_xpath("//div[@id='mainview']/ul[@id='comiccontain']//img")
    for i in range(0, len(imgs)):
            js="document.getelementbyid('mainview').scrolltop="+str((i) * 1280)
            chrome.execute_script(js)
            time.sleep(3)
            print(imgs[i].get_attribute("src"))
            with open(path+'\\'+str(i)+'.png', 'wb') as f:
                f.write(requests.get(imgs[i].get_attribute("src")).content)
    chrome.close() 
    print('下载完成') 

if __name__ == '__main__':
    getchapterurl('http://ac.qq.com/comic/comicinfo/id/505435')

简单解释

输入一个漫画的url即可爬取该漫画所有的章节,由于是模拟用户爬取的,所以速度方面有点慢,我试了下爬取银魂前70章,用了1个半小时,代码中的sleep可以适当简短点已加快爬取的速度

付费的漫画是没有办法爬取的

 

谈一下过程中遇到的坑

腾讯的漫画网站打开章节时没有把所有图片的url都加载出来,所以我在这里用的方式是使用selenium来模拟用户操作,每次打开页面以后使用js操作滚动条下拉

 

最后再贴下代码库,其实贴出的代码已经是所有的代码了

https://dev.azure.com/shenjuncaci/pythontecentmanhua