#学习爬取漫画

  • [ 1]使用原代码成功下载漫画
  • [ 2] 解决难点

原代码

import urllib.parseimport requests
import re
import json
import execjs
from bs4 import BeautifulSoup
from pymongo import MongoClient
import osconn = MongoClient('localhost',27017)
db = conn['comics']def get_comic(comic_name):param = {'s':comic_name}url = 'https://sacg.dmzj.com/comicsum/search.php?' + urlencode(param)headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4315.5 Safari/537.36','Referer': 'https://manhua.dmzj.com/tags/search.shtml?s=%E5%9B%9B%E6%9C%88%E6%98%AF%E4%BD%A0%E7%9A%84%E8%B0%8E%E8%A8%80','Host': 'sacg.dmzj.com',}# 提取存有图片url信息的js代码response = requests.get(url ,headers=headers)str = re.search("\[(.*?)\];",response.text).group(1)str = re.search("({.*?})",str).group(1)comic_url = 'https:' + json.loads(str)['comic_url_raw']return comic_urldef get_chapter(comic_url):response = requests.get(comic_url)html = response.textsoup = BeautifulSoup(html, 'lxml')srcs = soup.find('div',class_="cartoon_online_border").find_all('a')chapters_url = []for a in srcs:chapters_url.append(a.get('href'))return chapters_url# 运行存有图片url的js代码
def get_chapter_imgs_url(chapter_url):response = requests.get(chapter_url)js_str = re.search('eval\((.*?)\)\n', response.text).group(1)js_str = js_str.replace('function(p,a,c,k,e,d)', 'function fun(p, a, c, k, e, d)')fun = """function run(){var result = %s;return result;}""" % js_strpages = execjs.compile(fun).call('run')data = pages.split('=')[2][1:-2]url_list = json.JSONDecoder().decode(data)for i in range(0, len(url_list)):url_list[i] = 'https://images.dmzj.com/' + url_list[i]# url_list = dict(zip(range(1,len(url_list)+1),url_list))return url_listdef save_to_mongo(comic_name,list):if(db[comic_name].insert(list)):print('存入Mongo成功')return Truereturn  Falsedef save_images(content, comic_name, chap, imgNum):root_path = 'D:\\comic\\' + comic_nameif not os.path.exists(root_path):os.mkdir(root_path)chapter_path = root_path + '\第' + str(chap) + '话\\'if not os.path.exists(chapter_path):os.mkdir(chapter_path)path = chapter_path + str(imgNum) + '.jpg'if not os.path.exists(path):with open(path, 'wb') as f:f.write(content)f.close()print(path + '下载完成')def download_images(comic_name):table = db[comic_name]# 破解图片防盗链(低级版),加referer即可headers = {'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36','Upgrade - Insecure - Requests': '1','Referer': 'https://www.baidu.com/link?url=g3QbzSNbZietJQ_Rf4wcjn8RDipbM5wWtRYwvndTU64RtUj0yIVYBz75dHfoLnu9&wd=&eqid=ca0acac40002851a000000065bb84b15'}for src in table.find({}, {"_id": 0}):i = 0for url in src['img']:i+=1try:response = requests.get(url, headers=headers)if response.status_code == 200:save_images(response.content, comic_name, src['chapter'], i)elif response.status_code == 403:print('403 Forbidden ')except Exception as e:print('请求图片出错', url)print('error ', e)def main():comic_name = '四月是你的谎言'# comic_url = get_comic(comic_name)# chapters_url = get_chapter(comic_url)list = {}# for i in range(0, len(chapters_url)):#     chapters_url[i] = 'https://manhua.dmzj.com' + chapters_url[i]#     list['_id'] = i + 1#     list['chapter'] = (i + 1)#     list['img'] = (get_chapter_imgs_url(chapters_url[i]))#     save_to_mongo(comic_name,list)download_images(comic_name)if __name__ == '__main__':main()def main():comic_name = '四月是你的谎言'comic_url = get_comic(comic_name)chapters_url = get_chapter(comic_url)list = {}for i in range(0, len(chapters_url)):chapters_url[i] = 'https://manhua.dmzj.com' + chapters_url[i]list['_id'] = i + 1list['chapter'] = (i + 1)list['img'] = (get_chapter_imgs_url(chapters_url[i]))save_to_mongo(comic_name,list)#download_imgs(list,comic_name)if __name__ == '__main__':main()

难点1-----pymongo

  • conn = MongoClient(‘localhost’,27017)----建立无用户名密码连接---------->即pyMongo的使用,尝试过学习pysql,但是存储图片的过程略复杂,似乎学习pymongo更直接高效一点

pymongo

涉及代码:

from pymongo import MongoClient
conn = MongoClient('localhost',27017)#连接数据库
db = conn['comics']##选择集合(mongo中collection和database都是lazy创建的,具体可以google下)
def save_to_mongo(comic_name,list):if(db[comic_name].insert(list)):print('存入Mongo成功')return Truereturn  False

意思大概理解,暂不深究

直接运行

报错: 由于目标计算机积极拒绝,无法连接

`暂时无法解决,搜寻无果,应该是服务器判断出爬虫云云,想短时间在这里学习更多的话深究此问题无用
尝试自行拆解代码分步运行

第一部分

def get_comic(comic_name):param = {'s':comic_name}url = 'https://sacg.dmzj.com/comicsum/search.php?' + urlencode(param)#这里的url指向存储图片连接的json文件是提前找好的,直接拿来用省的自己去network找headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4315.5 Safari/537.36','Referer': 'https://manhua.dmzj.com/tags/search.shtml?s=%E5%9B%9B%E6%9C%88%E6%98%AF%E4%BD%A0%E7%9A%84%E8%B0%8E%E8%A8%80','Host': 'sacg.dmzj.com',}#换了头也没用# 提取存有图片url信息的js代码response = requests.get(url ,headers=headers)str = re.search("\[(.*?)\];",response.text).group(1)#正则的分片str = re.search("({.*?})",str).group(1)comic_url = 'https:' + json.loads(str)['comic_url_raw']#这边错了,不是这个名字return comic_url

第二步

def get_chapter(comic_url):#接上一步的url,这个url即编译后可用的连接response = requests.get(comic_url)html = response.textsoup = Beauti斜体样式fulSoup(html, 'lxml')srcs = soup.find('div',class_="cartoon_online_border").find_all('a')chapters_url = []for a in srcs:chapters_url.append(a.get('href'))return chapters_url

这段代码没用,不能达到获取章节名的效果,comic_url的内容没有章节名

第三步

def get_chapter_imgs_url(chapter_url):response = requests.get(chapter_url)js_str = re.search('eval\((.*?)\)\n', response.text).group(1)js_str = js_str.replace('function(p,a,c,k,e,d)', 'function fun(p, a, c, k, e, d)')fun = """function run(){var result = %s;return result;}""" % js_str#这里替换了json中的内容pages = execjs.compile(fun).call('run')data = pages.split('=')[2][1:-2]url_list = json.JSONDecoder().decode(data)for i in range(0, len(url_list)):url_list[i] = 'https://images.dmzj.com/' + url_list[i]# url_list = dict(zip(range(1,len(url_list)+1),url_list))return url_list

余下部分
到此为止,所花时间和收获都小于预期,换一个实例进行学习,计划找一个使用selenium的

  • [ 1] 至少熟练掌握了根据某漫画图片url通过循环获取批量图片的技巧
  • [ 2]希望学会数据库存储图片,目前仅了解数据库mysql基础知识,仅知道创建db,表,往表中插入值都不熟练。距存储漫画目标有距离
  • [ 3]仅仅会批量爬取图片的简单操作是不够的,爬取时应该添加章节名、文件名、下载提示的细节(也就是多编写函数,多熟练提取内容),最终目标是用户输入漫画名称即可实现下载至指定文件!
  • [ 4]解析网页目前只熟练bs4,需要结合正则
  • [ 5]应当重视selenium的熟练使用

根据示例代码学习爬取漫画(一)相关推荐

  1. Java爬虫学习--爬取漫画

    我看大部分的爬虫入门教学都是爬取图片的,但是我测试了一下,那个网站现在加了一些反爬措施(如协议头部的 referer),并且很容易就会遇到429(太多请求)这个问题.可能是多线程速度太快,这也说明了控 ...

  2. python爬虫爬取漫画(仅供学习)

    项目名: crawl_chuanwu 爬取链接:https://www.manhuadui.com/manhua/chuanwu/ 声明:本项目无任何盈利目的,仅供学习使用,也不会对网站运行造成负担. ...

  3. 爬取漫画网站漫画(爬虫学习)

    共实现两个网站,漫画栈处于完成品状态,最近没空做了,写个博客记录一下. 第一步,导入库: import json import os from time import sleepimport requ ...

  4. 入门学习爬取贴吧图片(附完整代码),2021/1/27有效

    记录一下爬虫学习爬取贴吧图片,按照以下b站视频教学,2021/1/27亲测有效,不会被封ip. Python爬虫实战讲解:爬取百度贴吧全站图片 结果如下(手动打码): 源代码和笔记如下: #多页爬取' ...

  5. js function如何传入参数未字符串_Python爬虫 JS 案例讲解:爬取漫画

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫案例,作者麦自香 转载地址 https://blo ...

  6. python写一个爬虫、爬取网站漫画信息_python爬取漫画

    原博文 2017-05-31 00:56 − 抓取漫画的网址是:sf互动传媒 抓取漫画的由来也是看了知乎上有人说用爬取漫画,然后自己也玩玩 首页中每个漫画的url是类似这样存储的: 相关推荐 2019 ...

  7. Python爬虫实战,requests+tqdm模块,爬取漫画数据(附源码)

    前言 今天给大家介绍的是Python爬取漫画数据,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是这样的纯文本数据爬取 ...

  8. 8个零代码数据爬取工具,不会Python也能轻松爬数!(附教程)

    前天给大家整理了免费数据源网站合集,看大家的反馈很积极,有粉丝留言说,她还想要爬取一些网页的数据进行分析,不知道该如何下手 目前的用的比较多数据爬取方法是用python爬虫,这两年python很火,网 ...

  9. Python3网络爬虫:爬取漫画

    因为疫情在家里闲着没事做,学习python写了一个爬虫如下 代理ip列表文件:AgencyIP.txt 138.197.165.239:8080 142.93.126.22:8080 142.93.0 ...

最新文章

  1. 博客大事记之迁移博客到香港主机
  2. 网络营销外包——网络营销外包公司表示网站更新仅仅是原创还不够
  3. python元组和列表都支持的方法是_python_列表和元组
  4. Python基础教程:新式类与经典类
  5. Windows7安全体验
  6. VTK:可视化之Hanoi
  7. array关于map,reduce,filter的用法
  8. python变量和对象的关系_Python变量与对象引用的区别
  9. open cv+C++错误及经验总结(十)
  10. application octet stream java,java – 为什么上传到S3的文件具有内容类型application / octet-stream,除非我命名文件.html...
  11. fis3 前端项目构建,一步步来
  12. 荧光和明场图像融合 matlab,一种用于明场显微成像的多层图像融合算法
  13. shell脚本实现猜大小游戏
  14. USB 3.0规范中译本 第2章 术语及缩略语
  15. Asp.net 中将文字写入图片中
  16. 2018年最新python视频教程学习建议百度云分享
  17. centos 安装flash插件
  18. 计算机安装重装出现错误,电脑重装系统老是失败要怎么办?我教你几个方法,一定能装上去!...
  19. hdmi接口线_太厉害了!HDMI线还能这么用,以前不知道真是浪费了
  20. 计算机网络配置与应用教学设计,计算机网络与应用教学设计

热门文章

  1. 金蝶K3客户端无法创建K/3中间层组件(组件KdSvrMgr报错)
  2. 基于PaddleNLP完成 千言情感分析————0.8014分方案
  3. Matplotlib:在图像上用中文进行标记时,不能显示中文,显示为方框
  4. 年度互联网名场面!企鹅状告国民女神,是辣酱不香还是“逗鹅冤”?
  5. lol日服一直显示重新连接服务器,lol手游日服登录不了怎么办 日服进不去解决方法...
  6. Word小技巧-快速取消自动编号
  7. GTA5无法访问R星服务器问题
  8. Pytorch中.new()的作用
  9. 第74期CDA数据分析就业班即将在北京、成都、重庆 三校同步开课,欢迎咨询!...
  10. 符号-分节4(逻辑运算符,位运算及左右移位运算)