今天就先挑戰另外個動態載入的漫畫網站,dmzj
漫畫太多了,我們先挑選幾個漫畫下載試一試。
按F12後可以發現,這裡存在所有的IMG地址
而且我們透過request在程式碼中是不能獲得這倆元素的,說明這倆元素是動態生成的。這就是動態載入了。
我們把這一章節的所有img的url羅列下來,做個分析,畢竟是一個章節的,按道理img的url是有規律的啊,我們看到url是主要有三個數字組成,比如: https://images.dmzj.com/img/chapterpic/1247/25304/14492330112801.jpg
這三個數字來自哪裡?我們可以在所有的js檔案和script裡面搜尋下,看看數字在哪裡有存在即可,終於在一個script裡面發現了貓膩啊。
這個是script是可以透過request獲得的,對應關係如下: 我們把該script塊和頁卡選擇框的元素放在一起去對照對照,如下取了第30章節和第29章節的內容:
因此我門需要的所有的url資訊都是在這script的字串裡面可以去得到的呢。 我不想去追究這個逆天的字串的順序問題了,做個簡單的吧(具體看code)。
完整程式碼如下:
# coding: utf-8from concurrent.futures import ThreadPoolExecutorimport timeimport osimport requestsfrom bs4 import BeautifulSouprootrurl = 'https://www.dmzj.com'save_dir = 'D:/estimages/'headers = { "Referer": rootrurl, 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", 'Accept-Language': 'en-US,en;q=0.8', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive'} ###設定請求的頭部,偽裝成瀏覽器def saveOneImg(dir, p1, p2, p3): url = 'https://images.dmzj.com/img/chapterpic/{}/{}/{}.jpg'.format(p1, p2, p3) new_headers = { "Referer": url, 'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", 'Accept-Language': 'en-US,en;q=0.8', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive' } ###設定請求的頭部,偽裝成瀏覽器,實時換成新的 header 是為了防止403 http code問題,防止反盜鏈, try: img = requests.get(img_url, headers=new_headers) # 請求圖片的實際URL if (str(img).find('200') > 1): with open( '{}/{}.jpg'.format(dir, img.url.split("/")[-1].split('.')[0].ljust(14, '0')), 'wb') as jpg: # 請求圖片並寫進去到本地檔案 jpg.write(img.content) print(img_url) jpg.close() return True else: return False except Exception as e: print('exception occurs: ' + url) print(e) raise edef getIms(p): strlist = str(p).split('|') dirlist = [] imgslist = [] for item in strlist: if item.isdigit(): dirlist.append(item) if len(item) > 10: imgslist.append(item) dirlist = dirlist[:2] return dirlist, imgslistdef saveOneCap(dir, href): print(href) html = BeautifulSoup(requests.get(href, headers=headers).text, features="html.parser") dirlist, imgslist = getIms(html.find('script')) print(dirlist) print(imgslist) for jpg in imgslist: while 1: try: if saveOneImg(dir, dirlist[0], dirlist[1], jpg): # first try break saveOneImg(dir, dirlist[1], dirlist[0], jpg) # try again if failed break except Exception as e: continue # try again if occurs errordef saveOnePageFunc(dir, capters): for cap in capters: # 按照tag和圖片組的內容來建立目錄 new_dir = '{}{}/{}'.format(save_dir, dir, cap.get_text()) if not os.path.exists(new_dir): os.makedirs(new_dir) saveOneCap(new_dir, cap.get('href')) time.sleep(2) passdef tagSpider(tag, url): # 解析當前頁面 html = BeautifulSoup(requests.get(url, headers=headers).text, features="html.parser") # 提交一個儲存頁面的任務 saveOnePageFunc(tag, html.find('ul', {'class': 'list_con_li autoHeight'}).find_all('a')) print("thread work over. ")if __name__ == '__main__': # 獲得所有標籤 taglist = {'川靈物語': 'https://www.dmzj.com/info/chuanlingwuyu.html', '魔王與勇者與聖劍神殿': 'https://www.dmzj.com/info/mwyyzysjsd.html', '真勵之徒弟': 'https://www.dmzj.com/info/zhenlizhitu.html', '妖神記': 'https://www.dmzj.com/info/yaoshenji.html'} # 給每個標籤配備一個執行緒 with ThreadPoolExecutor(max_workers=10) as t: # 建立一個最大容納數量為20的執行緒池 for tag, url in taglist.items(): t.submit(tagSpider, tag, url) # 單個連線測試下下 # tagSpider('川靈物語', 'https://www.dmzj.com/info/chuanlingwuyu.html') # 等待所有執行緒都完成。 while 1: print('-------------------') time.sleep(1)
效果如下: