爬取腾讯漫画_网球王子

发布时间 2023-04-10 14:49:03作者: 秋天中的一片叶

一,通过Selenium模块完成自动化获取图片

import time  # time时间模块用于延时等待
import os  # os模块调用系统模块创建目录
import requests  # 发送请求模块
from selenium import webdriver  # 导入selenium包
from selenium.webdriver.chrome.service import Service  # 导入Service(webdriver需要添加的参数)
from selenium.webdriver.chrome.options import Options  # 导入Options(webdriver需要添加的参数)
from selenium.webdriver.common.by import By  # 导入By,这个模块可以后期用于xpath的使用
from selenium.webdriver.common.action_chains import ActionChains  # 实现自动化动作链使用的模块

项目初始化

1. chrome浏览的chromedriver.exe可以通过下列的链接进行获取。注意:要先查看你自身的chrome浏览器的版本。找一个版本类似的就行,不用完全精准。如果大版本不同是使用不了的会报错。

https://chromedriver.storage.googleapis.com/index.html

 2. 通过如下的代码完成webdriver的初始化工作。opt.add_argument在代码注释中已经标注了解释。headers需要结合你自身的网页查看请求头来填写。

service = Service(
    executable_path='D:\Python_系列\python爬虫\python_爬虫进阶项目\chromedriver.exe')  # executable_path引入驱动。这里引入的是chrome浏览器的欠驱动。如果是其他浏览器的驱动需要对应浏览器版本下载。
opt = Options()
opt.add_argument('--disable-blink-features=AutomationControlled')  # 隐藏selenium使用痕迹
# opt.add_argument("disable-infobars");

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}

 

二,下载图片

这里将下载封装成了一个Download函数了。然后在main函数中调用即可。

 

def download(url, path):
    browser = webdriver.Chrome(service=service, options=opt) # 初始化browser浏览器
    browser.maximize_window() # 将浏览器窗口最大化
    browser.get(url)

    filename = browser.find_element(By.XPATH, '//*[@id="comicTitle"]/span[@class="title-comicHeading"]').text #获取标题
    pic_list = browser.find_elements(By.XPATH, '//*[@id="comicContain"]/li/img') #获取所有的图片链接

   # 通过for循环遍历一个章节下的所有图片链接
for num, pic in enumerate(pic_list): time.sleep(1) # 如果滚动太快同样也拿不到数据,因此结合网络设置停顿时间 # 页面特点必须滚动到指定页面后才加载新的jpg。因此需要通过ActionChains动作链来模拟滚动操作。 ActionChains(browser).scroll_to_element(pic).perform() link = pic.get_attribute('src') # 通过get_attribute方法获取属性值 # print(link, filename) content = requests.get(link, headers=headers).content #获取图片链接中的图片,因为是图片所以要转化成content二进制码流

     # 通过Os模块创建目录,判断目录不存在则创建该目录。木留存在则保存图片
if not os.path.exists(f'{path}/{filename}'): os.makedirs(f'{path}/{filename}') with open(f'{path}/{filename}/{num}.jpg', 'wb') as f: f.write(content) print(f'已下载...{filename}...第{num}的图片')   # 获取当前页面最下方的点击下一页的xpath并跳转到下一个章节 next_page = browser.find_element(By.XPATH, '//*[@id="mainControlNext"]').get_attribute('href') browser.close() #关闭浏览器 return next_page #将数据返回

三,入口出传入url和path存储路径

 

if __name__ == '__main__':
    url = 'https://ac.qq.com/ComicView/index/id/530987/cid/4'   #这里把漫画的序幕或者第一回的链接填写进来
    path = 'D:\Python_系列\python爬虫\python_爬虫进阶项目\腾讯动漫' #设定一个本地目录用于保存下载后的图片

#当我们点击了下一页后url会变,因此这里设置一个死循环让它反复将url和路径传给download函数。直到所有章节下载完毕后遇到brower.close()语句后则退出整个浏览器。 while url: url = download(url, path)

 

四,整个代码

import time  # time时间模块用于延时等待
import os  # os模块调用系统模块创建目录
import requests  # 发送请求模块
from selenium import webdriver  # 导入selenium包
from selenium.webdriver.chrome.service import Service  # 导入Service(webdriver需要添加的参数)
from selenium.webdriver.chrome.options import Options  # 导入Options(webdriver需要添加的参数)
from selenium.webdriver.common.by import By  # 导入By,这个模块可以后期用于xpath的使用
from selenium.webdriver.common.action_chains import ActionChains  # 实现自动化动作链使用的模块

service = Service(
    executable_path='D:\Python_系列\python爬虫\python_爬虫进阶项目\chromedriver.exe')  # executable_path引入驱动。这里引入的是chrome浏览器的欠驱动。如果是其他浏览器的驱动需要对应浏览器版本下载。
opt = Options()
opt.add_argument('--disable-blink-features=AutomationControlled')  # 隐藏selenium使用痕迹
# opt.add_argument("disable-infobars");

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36'
}


def download(url, path):
    browser = webdriver.Chrome(service=service, options=opt)
    browser.maximize_window()
    browser.get(url)

    filename = browser.find_element(By.XPATH, '//*[@id="comicTitle"]/span[@class="title-comicHeading"]').text
    pic_list = browser.find_elements(By.XPATH, '//*[@id="comicContain"]/li/img')

    for num, pic in enumerate(pic_list):
        time.sleep(1)  # 如果滚动太快同样也拿不到数据,因此结合网络设置停顿时间
        # 页面特点必须滚动到指定页面后才加载新的jpg。因此需要通过ActionChains动作链来模拟滚动操作。
        ActionChains(browser).scroll_to_element(pic).perform()
        link = pic.get_attribute('src')  # 通过get_attribute方法获取属性值
        # print(link, filename)
        content = requests.get(link, headers=headers).content
        if not os.path.exists(f'{path}/{filename}'):
            os.makedirs(f'{path}/{filename}')
        with open(f'{path}/{filename}/{num}.jpg', 'wb') as f:
            f.write(content)
            print(f'已下载...{filename}...第{num}的图片')

    next_page = browser.find_element(By.XPATH, '//*[@id="mainControlNext"]').get_attribute('href')
    browser.close()
    return next_page


if __name__ == '__main__':
    url = 'https://ac.qq.com/ComicView/index/id/530987/cid/4'
    path = 'D:\Python_系列\python爬虫\python_爬虫进阶项目\腾讯动漫'

    while url:
        url = download(url, path)
完整代码