【爬虫】使用Selenium爬取腾讯漫画

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/okm6666/article/details/79552690

目标:以自动下载指定漫画的最新一话为例,或下载某部指定漫画。
思路:因为在漫画页内漫画图片地址是动态加载出来的,因此选用Selenium进行浏览器的模拟操作,处罚js行为进行地址的加载。再获取到图片地址后进行下载。

每部漫画的地址都是有一个固定的id,可以直接请求指定漫画的详情页。

ROOT_URL = "http://ac.qq.com"
TargetUrls = [
    ROOT_URL + "/Comic/comicInfo/id/505430",  # 海贼王
]

F12分析路径,在这个页面里,全部的章节元素都是已经加载的,和最近20话分开单独存放在列表里。通过BeautifulSoup或Lxml进行解析后选择需要的就行,以最新一话为例,在获取数组后选择最后一个元素。
这里写图片描述
通过BeautifulSoup获取最后一个元素的标题与漫画内容。

def getUrls(target_url):
    result = dict()
    req = request.Request(target_url, headers=headers)
    response = request.urlopen(req)
    soup = bs(response.read(), "lxml")
    # 返回最近漫画中的最新20话
    page = soup.find(attrs={"class": "chapter-page-new works-chapter-list"}).find_all(
        "a")  # 全部漫画 chapter-page-new works-chapter-list
    title = page[-1]['title']
    result[title] = ROOT_URL + page[-1]['href']
    return result

获取地址后如果直接进行解析会发现后面的地址都是以.gif格式的默认图片。
这里写图片描述
这时候就可以通过Selenium进行模拟浏览器的拖动行为,让地址动态的加载出来。再将全部的图片地址返回。

def getImageUrls(comic_url):
    '''
    通过Selenium和Phantomjs获取动态生成的数据
    '''
    urls = []

    dcap = dict(DesiredCapabilities.PHANTOMJS)
    dcap["phantomjs.page.settings.userAgent"] = ("Mozilla/4.0 (compatible; MSIE 5.5; windows NT)")
    browser = webdriver.PhantomJS(executable_path=r"C:\Program Files\phantomjs-2.1.1-windows\bin\phantomjs",
                                  desired_capabilities=dcap)
    browser.get(comic_url)

    imgs = browser.find_elements_by_xpath("//div[@id='mainView']/ul[@id='comicContain']//img")
    for i in range(0, len(imgs) - 1):
        if i == 1:  # 略过广告图片
            continue
        urls.append(imgs[i].get_attribute("src"))
        js = 'window.scrollTo( 800 ,' + str((i + 1) * 1280) + ')'
        browser.execute_script(js)
        time.sleep(randint(2, 4))

    browser.quit()
    return urls

得到图片的地址后,直接按照此前取得的title名进行文件夹的创建,并下载图片即可。也可以每次下载之后用MongoDB将图片地址存储起来,便于去重。

def downloadComics(dir_path, urls):
    for url in urls:
        request.urlretrieve(url, dir_path + url[-9:])

这样子每次漫画更新时,直接可以通过运行爬虫自动爬取想看的最后一话漫画叻。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/okm6666/article/details/79552690