以前買漫畫來看,現在去網站看,今天我用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 importparse _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被封了,另外,還可以做一個自動播放漫畫圖片的程式,這樣就可以減少一些麻煩了。