过去,我买漫画看;现在,我用Python爬虫来看

共 4334字,需浏览 9分钟

 ·

2020-12-20 09:36

↑ 关注 + 星标 ,每天学Python新技能

后台回复【大礼包】送你Python自学大礼包



来源:http://suo.im/5xrev3



以前,我都是买漫画书看的,那个时候没有电脑。今天,我到网上看了一下,发现网上提供漫画看,但是时时需要网络啊!为什么不将它下载下来呢!

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.textsoup1=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 requestsfrom urllib import parsefrom bs4 import BeautifulSoupimport threadingimport osimport 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.textsoup=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.textsoup1=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被封了,另外,还可以做一个自动播放漫画图片的程序,这样就可以减少一些麻烦了。

注意:本程序代码仅供娱乐和学习,且莫用于商业活动,一经发现,概不负责!

如果大家觉得本文还可以的话,记得给我点一个小小的赞或者在看哈~


推荐阅读

  1. 刚刚美团开源了一款超级好用的抓包及 Mock 工具

  2. 微软最强 Python 自动化工具开源了!不用写一行代码!

  3. 这可能是你近2年进腾讯的最好机会!
  4. 你注册过哪些网站,一搜便知


扫码回复「大礼包」后获取大礼

新人福利

送大家一份Python学习大礼包,从Python基础,爬虫,数据分析Web开发等全套资料,吃透资料,
这些资料都是视频,新人学起来非常友好。



扫码加微信后备注「Python新手」方便我给你发送资料

浏览 57
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐