1、流程框架
1.1、抓取漫画每一话的链接
利用selenium驱动浏览器通过css selector搜索得到漫画每一话的链接
1.2、抓取某一话漫画的名称以及每个图片的链接
利用selenium驱动浏览器通过关键字获取某一话的名称以及其每个图片的链接
1.3、下载每个图片并保存到电脑本地
通过requests获取的图片的内容保存到本地电脑上
2、代码如下
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support.select import Select
import os
import time
import requests
import random
def down_pic(dir_name,one_comic_name,url_list):
dir_path = dir_name +'\\'+ one_comic_name
if os.path.exists(dir_path):#如果文件夹存在则,直接下载
pass
else:#否则就创建文件夹
os.makedirs(dir_path)
i = 0
for download_link in url_list:
pic_name = dir_path +'\\'+str(i)+'.jpg'
if os.path.exists(pic_name):
print ('File '+pic_name+' is already exists,SKIP......')
else:
r=requests.get(download_link)
with open (pic_name,"wb") as file_id:
file_id.write(r.content)
print(pic_name + ' Download Compelte')
time.sleep(random.randint(1, 10))
i = i + 1
def one_comic(url):
url_list = []
browser = webdriver.Chrome()
browser.get(url)
browser.implicitly_wait(20)
comic_pic_num =len(browser.find_elements_by_css_selector('#selectpage1 > select > option'))
comic_name = browser.find_elements_by_css_selector('body > h1')[0].text
for i in range (comic_pic_num):
comic_url = browser.find_elements_by_css_selector('#viewimg')[0].get_attribute('src')
url_list.append(comic_url)
selectPage = browser.find_elements_by_css_selector('#selectpage1 > select')[0]
Select(selectPage).select_by_index(i)
time.sleep(6)
browser.close()
name_list = comic_name.split()
if len(url_list):
down_pic('f:\\'+name_list[0],name_list[1],url_list)
else:
print('no jpg url!')
if __name__ == '__main__':
browser = webdriver.Chrome()
browser.get('http://www.katui.net/manhua/1/')
browser.implicitly_wait(20)
comic_urls_element_list = browser.find_elements_by_css_selector('#play_0 > ul > li > a')
for comic_url_element in comic_urls_element_list:
comic_url = comic_url_element.get_attribute('href')
one_comic(comic_url)
time.sleep(6)
browser.close()
3、代码分析
3.1、程序入口
browser.implicitly_wait(20)隐式等待,当用此隐式等待执行测试时,如果webdriver没有在DOM中找到元素,则将继续等待,超出设定时间后则抛出找不到元素的异常,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间在查找DOM,默认时间为0。
comic_urls_element_list = browser.find_elements_by_css_selector(‘#play_0 > ul > li > a’)获取狐妖小红娘这个漫画更新的所有话的elements的列表,然后通过遍历此列表,访问element的get_attribute函数获取每一话的链接。
3.2、one_comic函数
one_comic函数是得到某一话漫画所有图片的链接列表,并通过调用dowm_pic函数将此图片下载到本地。
3.3、dowm_pic函数
下载图片到本地电脑上。os.path.exists(dir_path)函数查看dir_path是否在电脑本地上存在,若不存在则用os.makedirs函数新建此文件夹。requests.get(download_link) 函数获取图片链接的response,通过open函数以及write函数将图片的内容保存到电脑本地, time.sleep(random.randint(1, 10))是随机加个1到10秒的延时,防止频繁访问造成服务器封掉我们的IP。
4、优化
后续使用非驱动浏览器的方式进行抓取漫画以及改进算法和debug。