首頁>技術>

今天就先挑戰另外個動態載入的漫畫網站,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)

效果如下:

18
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 十行 Python 程式碼就提取了韋小寶的身份證資訊