今天我們要爬去的網站是http://comic.sfacg.com/。漫畫網站一般都是通過JavaScript和AJAX來動態加載漫畫的,這也就意味着想通過原來爬取靜態網站的方式去下載漫畫是不可能的,這次我們就來用Selenium&PhantomJS來下載漫畫。
分析:我們通過Selenium模擬打開漫畫網站,找到每一章每一頁漫畫圖片地址,按章節目錄分類,下載圖片。
下面我們隨便打開一個漫畫如下
使用谷歌瀏覽器檢查一下發現每一個章節都在下面標簽里,這樣我們很容易獲取到每一章節地址了。
<div class="serialise_list Blue_link2">
下面進入代碼編寫過程:
首先創建目錄和圖片保存
1 def mkdir(path): 2 ''' 3 防止目錄存在 4 :param path: 5 :return: 6 ''' 7 if not os.path.exists(path): 8 os.mkdir(path) 9 10 11 def SavePic(filename,url): 12 ''' 13 圖片的保存 14 :param filename: 15 :param url: 16 :return: 17 ''' 18 content = requests.get(url).content 19 with open(filename,'wb') as f: 20 f.write(content)
獲取每一章節的鏈接保存到字典里
1 def get_TOF(index_url): 2 url_list = [] 3 browser = webdriver.PhantomJS() 4 browser.get(index_url) 5 browser.implicitly_wait(3) 6 7 title = browser.title.split(',')[0]#獲取漫畫標題 8 mkdir(title)#創建目錄 9 10 comics_lists = browser.find_elements_by_class_name('comic_Serial_list')#找到漫畫章節 11 for part in comics_lists:#找到每一章節所在的標簽信息 12 links = part.find_elements_by_tag_name('a') 13 for link in links: 14 url_list.append(link.get_attribute('href'))#獲取每個單獨章節鏈接 15 browser.quit() 16 Comics = {'name':title,'urls':url_list} 17 return Comics
下面是代碼的核心部分,通過selenium打開漫畫找到漫畫的地址,下載漫畫圖片,找到漫畫中下一頁按鈕,點擊並獲取下一頁圖片,循環這個過程。當循環到最后一頁到時候,仍然有下一頁到按鈕,因此需要計算一下漫畫有多少頁。
1 def get_pic(Comics): 2 comic_list = Comics['urls'] 3 basedir = Comics['name'] 4 5 browser = webdriver.PhantomJS() 6 for url in comic_list: 7 browser.get(url) 8 browser.implicitly_wait(3) 9 dirname = basedir+'/'+browser.title.split('-')[1] 10 mkdir(dirname) 11 #找到漫畫一共有多少頁 12 pageNum = len(browser.find_elements_by_tag_name('option')) 13 #找到下一頁按鈕 14 nextpage = browser.find_element_by_xpath('//*[@id="AD_j1"]/div/a[4]') 15 for i in range(pageNum): 16 pic_url = browser.find_element_by_id('curPic').get_attribute('src') 17 filename = dirname+'/'+str(i)+'.png' 18 SavePic(filename,pic_url) 19 nextpage.click() 20 print('當前章節\t{} 下載完畢'.format(browser.title)) 21 browser.quit() 22 print('所有章節下載完畢!')
下面是主函數到編寫
1 if __name__ == '__main__': 2 url = str(input('請輸入漫畫首頁地址:\n')) 3 Comics = get_TOF(url) 4 #print(Comics) 5 get_pic(Comics)
結果展示:
下面是1話里面到圖片
Selenium爬蟲雖然能模擬瀏覽器加載JS動態頁面,但是其速度就十分堪憂了和Scrapy庫、requests更完全不能比了。