1. 程式人生 > 實用技巧 >以前買漫畫來看,現在去網站看,今天我用Python爬蟲來看

以前買漫畫來看,現在去網站看,今天我用Python爬蟲來看

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯絡我們以作處理。

以下文章來源於CSDN ,作者Gordon,Alice

Python 爬蟲爬取國外動漫

https://www.bilibili.com/video/BV1Kz4y1Z7YG/

前言

以前,我都是買漫畫書看的,那個時候沒有電腦。今天,我到網上看了一下,發現網上提供漫畫看,但是時時需要網路啊!為什麼不將它下載下來呢!

1. 怎樣實現

這個專案需要的模組有:requests、urllib、threading、os、sys

其中requests模組也可以不用,只要urllib模組即可,但我覺得requests模組爬取資料程式碼量少。

os模組主要是為了建立資料夾,sys主要是為了結束程式(當然,這裡我只是判斷是否已經存在我即將建立的資料夾,如果存在,我就直接結束程式了,這個位於程式碼的開頭)。

1.1 爬取我們需要的資料(網頁連結、漫畫名稱、漫畫章節名稱)


我爬取漫畫的網址為:https://www.mkzhan.com/
我們到搜尋欄上輸入 一個漫畫名稱
我輸入的是:鬥破蒼穹,點選搜尋,可以看到這個介面:


對這個網址進行分析:https://www.mkzhan.com/search/?keyword={}

大括號代表的內容就是我們輸入的漫畫名稱,我們只要這樣組合,就可以得到這個網址:

from urllib import
parse _name=input('請輸入你想看的漫畫:') name_=parse.urlencode({'keyword':_name}) url='https://www.mkzhan.com/search/?{}'.format(name_)

之後,就是對這個網址下面的內容進行爬取了,這個過程很容易,我就不講了。

我們點選一下其中的一本漫畫,來到這個介面:


這個網址,需要我們從上一個網址中得到並進行拼接,我們需要得到這個網址下面的漫畫所有章節的連結和名稱。

我們按F12來到開發者工具:

可以發現這些章節的內容在這個標籤下面:

html1=requests.get(url=url1)
content1
=html1.text soup1=BeautifulSoup(content1,'lxml') str2=soup1.select('ul.chapter__list-box.clearfix.hide')[0] list2=str2.select('li>a') name1=[] href1=[] for str3 in list2: href1.append(str3['data-hreflink']) # 漫畫一章的連結 name1.append(str3.get_text().strip()) # 漫畫一章的題目,去空格

這樣我們就可以得到我們想要的內容了,我們點選其中的一章進入,發現裡面只不過是一些圖片罷了,我們只需把這些圖片下載下來就行了。


程式碼執行結果:


下載完成之後,會在同一個資料夾下面多出一個資料夾,資料夾的名稱為你輸入漫畫名稱,這個資料夾下面會有很多資料夾,這些資料夾的名稱是漫畫章節的名稱。

2. 完整程式碼

import requests
from urllib import parse
from bs4 import BeautifulSoup
import threading
import os
import sys


_name=input('請輸入你想看的漫畫:')


try:
    os.mkdir('./{}'.format(_name))
except:
    print('已經存在相同的檔案夾了,程式無法在繼續進行!')
    sys.exit()


name_=parse.urlencode({'keyword':_name})
url='https://www.mkzhan.com/search/?{}'.format(name_)
html=requests.get(url=url)
content=html.text
soup=BeautifulSoup(content,'lxml')
list1=soup.select('div.common-comic-item')
names=[]
hrefs=[]
keywords=[]
for str1 in list1:
    names.append(str1.select('p.comic__title>a')[0].get_text())   # 匹配到的漫畫名稱
    hrefs.append(str1.select('p.comic__title>a')[0]['href'])      # 漫畫的網址
    keywords.append(str1.select('p.comic-feature')[0].get_text())          # 漫畫的主題
print('匹配到的結果如下:')
for i in range(len(names)):
    print('【{}】-{}     {}'.format(i+1,names[i],keywords[i]))


i=int(input('請輸入你想看的漫畫序號:'))
print('你選擇的是{}'.format(names[i-1]))


url1='https://www.mkzhan.com'+hrefs[i-1]      # 漫畫的連結
html1=requests.get(url=url1)
content1=html1.text
soup1=BeautifulSoup(content1,'lxml')
str2=soup1.select('ul.chapter__list-box.clearfix.hide')[0]
list2=str2.select('li>a')
name1=[]
href1=[]
for str3 in list2:
    href1.append(str3['data-hreflink'])   # 漫畫一章的連結
    name1.append(str3.get_text().strip()) # 漫畫一章的題目,去空格


def Downlad(href1,path):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3756.400 QQBrowser/10.5.4039.400'}
    url2='https://www.mkzhan.com'+href1
    html2=requests.get(url=url2,headers=headers)
    content2=html2.text
    soup2=BeautifulSoup(content2,'lxml')
    list_1=soup2.select('div.rd-article__pic.hide>img.lazy-read')  # 漫畫一章中的所有內容列表
    urls=[]
    for str_1 in list_1:
        urls.append(str_1['src'])


    for i in range(len(urls)):
        url=urls[i]
        content3=requests.get(url=url,headers=headers)
        with open(file=path+'/{}.jpg'.format(i+1),mode='wb') as f:
            f.write(content3.content)
    return True

def Main_Downlad(href1:list,name1:list):
    while True:
        if len(href1)==0:
            break
        href=href1.pop()
        name=name1.pop()
        try:
            path='./{}/{}'.format(_name,name)
            os.mkdir(path=path)
            if Downlad(href, path):
                print('執行緒{}正在下載章節{}'.format(threading.current_thread().getName(),name))
        except:
            pass


threading_1=[]
for i in range(30):
    threading1=threading.Thread(target=Main_Downlad,args=(href1,name1,))
    threading1.start()
    threading_1.append(threading1)
for i in threading_1:
    i.join()
print('當前執行緒為{}'.format(threading.current_thread().getName()))

3. 總結

我覺得這個程式還有很大的改進空間,如做一個ip代理池,這樣再也不用擔心ip被封了,另外,還可以做一個自動播放漫畫圖片的程式,這樣就可以減少一些麻煩了。