【Python爬虫】爬取腾讯漫画_网球王子
一,通过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)