python学习笔记(14)--爬虫下载漫画图片修改版
说明:
1. 2017.3.12,周六从中午吃完包子12点多折腾了一下午加一个晚上,试了4个网站的爬虫,发现都不能下载!甚至前几天测试能下载的都不能用了!
2. 到晚上发现煎蛋网的可以用了,立即试了下漫画网,尼玛居然也能用了!不过下载了几个之后又不能用了!真是法克了!
3. 过了一会,又是一会儿能用一会儿不能用。又过了一会儿,完全不能用了。真是草你麻痹了!能不能有个准了?
4. 从网上找的代理ip,各种不靠谱,反正只要代码里用了代理,就不能用,访问被拒绝。不过还是放上一个代理地址,万一以后用到http://www.ip181.com/
5. 后来,抱着试一试的心态,用手机开了个热点,尼玛漫画又能用了!而且重新连上无线也能用了!不过下载了几个之后又不能用了!真是无力吐槽。。
6. 对爬虫彻底失望,看到一篇文章说爬虫的最高境界是只要浏览器能看到的,就能爬下来!心累了,再说吧。。
7. 中间有个第8页本来网站就打不开这张图片,结果爬的时候404报错,这地方用了一下try catch,还挺好用,另外加个continue,可以直接下一次循环,所以页码也可以直接写pagenum+1了。
8. (2017.3.14)更改一个地方,第18行urlopen的参数改为req,原来是myurl,就相当于user-agent没用上。
import urllib.request
import re
import os
import time
import random
url = "http://www.yaoqmh.net/shaonvmanhua/list_4_1.html"
# headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0'}
# iplist = ['111.197.141.57:9797','116.228.236.219:8080','120.26.51.101:8118','113.222.80.216:3128','117.90.1.88:9000']
# proxy_support = urllib.request.ProxyHandler({'http':random.choice(iplist)})
# opener = urllib.request.build_opener(proxy_support)
# urllib.request.install_opener(opener)
# 封装获取html的三行代码
def getHtml(myurl):
req = urllib.request.Request(url=myurl,headers=headers)
response = urllib.request.urlopen(req)
html = response.read().decode("utf-8")
return html
# 获取漫画网首页html
def getMainHtml():
html = getHtml(url)
# 处理一下html,只保留中间的本子,侧边和顶部的本子不要
startNum = html.find("mainleft")
endNum = html.find("mainright")
html = html[startNum:endNum]
return html
# 从主页html获取本子编号,名字
def getNumsAndNames():
html = getMainHtml()
# <a href="/shaonvmanhua/8389.html" class="pic show" title="里番H少女漫画之發情關係" target="_blank"><span class="bt">里番H少女漫画之發情關係</span> <span class="bg"></span><img class="scrollLoading" src="http://pic.taov5.com/1/615/183-1.jpg" xsrc="http://pic.taov5.com/1/615/183-1.jpg" alt="里番H少女漫画之發情關係" style="background:url(/static/images/loading.gif) no-repeat center;" width="150" height="185"></a>
# <img class="scrollLoading" src="http://pic.taov5.com/1/615/183-1.jpg" xsrc="http://pic.taov5.com/1/615/183-1.jpg" alt="里番H少女漫画之發情關係" style="background:url(/static/images/loading.gif) no-repeat center;" width="150" height="185">
regBookNum = r'href="/shaonvmanhua/(\d+)\.html"'
bookNums = re.findall(regBookNum, html)
regName = r'title="(.+?)"'
bookNames = re.findall(regName, html)
return bookNums,bookNames
# 打开每页,下载保存到这个名字的文件夹里
def downloadPic(i):
bookNums = getNumsAndNames()[0]#获取本子编号
bookNames = getNumsAndNames()[1]#获取本子名称
urlBook = "http://www.yaoqmh.net/shaonvmanhua/"+bookNums[i]+".html"
htmlBook = getHtml(urlBook)#获取本子html代码
regPageNums = r"共(\d+)页"#获取总页数
# 格式为http://pic.taov5.com/1/615/183-1.jpg
# http://pic.taov5.com/1/618/160.jpg
regImgStart1 = r"http://pic\.taov5\.com/1/(\d+)/\d+?\.jpg"#获取第一目录编号
regImgStart2 = r"http://pic\.taov5\.com/1/\d+?/(\d+?)\.jpg"#获取第二目录编号
pageNums = re.findall(regPageNums,htmlBook)#总页数,获得一个二维数组,因为上下共有两个总页数标签
imgStart1 = re.findall(regImgStart1, htmlBook)#图片目录的第一个数字,findall返回一个数组
imgStart2 = re.findall(regImgStart2, htmlBook)#图片目录的第二个数字
# 开始页码和结束页码
rangeMin = int(imgStart2[0])
# rangeMax = int(imgStart2[0]) + int(pageNums[0])
pageNums = int(pageNums[0])
print("正在下载:"+ bookNums[i] + "_" + bookNames[i])#给个下载提示本子名
for pageNum in range(pageNums):
urlImg = "http://pic.taov5.com/1/"+imgStart1[0]+"/"+str(rangeMin+pageNum)+".jpg"
reqImg = urllib.request.Request(url=urlImg,headers=headers)
try:
responseImg = urllib.request.urlopen(reqImg)
with open(str(pageNum)+".jpg","wb") as f:
img = responseImg.read()
f.write(img)
except Exception as e:
print("缺少第%d页,"%(pageNum+1),e)
continue
print("已下载%d页,共%d页"%(pageNum+1,pageNums))#提示下载几页了,放在后面比较好
# os.system("pause")
def downloadBook():
bookNums = getNumsAndNames()[0]
bookNames = getNumsAndNames()[1]
# 打开每个本子网页,获取总页数,第一张图片的网址
# <img alt="里番H少女漫画之發情關係" src="http://pic.taov5.com/1/615/143.jpg">
for i in range(len(bookNums)):
# 每个本子新建文件夹,下载完一个本子要返回上一级目录!!不然会一直新建子文件夹!
# 断点续传,判断文件夹是否存在,如果不存在就创建,如果存在,判断里面的图片是否存在
currentDir = os.getcwd()
nameArray = []
# 遍历当前文件夹,把所有文件夹名存入nameArray数组
for i1,i2,i3 in os.walk(currentDir):
nameArray.append(i2)
nameArray = nameArray[0]
# 名字数组里加上序号
for eachname in nameArray:
eachname = bookNums[i] + "_" + eachname
# 如果文件夹已存在,输出这个文件夹名已存在
if os.path.exists(bookNums[i] + "_" + bookNames[i]):
print("已存在:"+bookNums[i] + "_" + bookNames[i])
# 如果文件夹不存在,就新建文件夹,下载图片
else:
os.mkdir(bookNums[i] + "_" + bookNames[i])#新建文件夹
os.chdir(bookNums[i] + "_" + bookNames[i])#跳转到指定目录#记得后面要返回上级目录!!
downloadPic(i)
os.chdir(os.path.dirname(os.getcwd()))#返回上级目录
if __name__ == "__main__":
downloadBook()
# 后期实现功能:esc停止运行,空格暂停,断点续传判断图片是否存在
python学习笔记(14)--爬虫下载漫画图片修改版的更多相关文章
- python学习笔记(11)--爬虫下载漫画图片
说明: 1. 某本子网站爬虫,现在只实现了扒取一页,已经凌晨两点了,又饿又困,先睡觉,明天再写总结吧! 2. 我是明天,我来写总结了! 3. 这个网站的结构是这样的: 主页: 主页-第1页-漫画1封面 ...
- python学习笔记(22)--漫画生成html最终版
说明(2017.3.14): 1. 在主文件夹生成一个main.html作为目录 2. 在每个子文件夹生成一个index.html作为看图网页 3. 通过python批量生成html网页,js配合进行 ...
- 吴裕雄--python学习笔记:爬虫基础
一.什么是爬虫 爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息. 二.Python爬虫架构 Python 爬虫架构主要由五个部分组成,分别是调度器.URL管理器.网页下载器.网 ...
- 吴裕雄--python学习笔记:爬虫
import chardet import urllib.request page = urllib.request.urlopen('http://photo.sina.com.cn/') #打开网 ...
- Python学习笔记22:Django下载并安装
Django它是一个开源Web应用程序框架.由Python书面. 通过MVC软件设计模式,这种模式M,视图V和控制器C. 它最初是一个数字新闻内容为主的网站已经发展到管理劳伦斯出版集团.那是,CMS( ...
- python学习笔记:"爬虫+有道词典"实现一个简单的英译汉程序
1.有道的翻译 网页:www.youdao.com Fig1 Fig2 Fig3 Fig4 再次点击"自动翻译"->选中'Network'->选中'第一项',如下: F ...
- Python学习笔记之爬虫
爬虫调度端:启动爬虫,停止爬虫,监视爬虫运行情况 URL管理器:对将要爬取的和已经爬取过的URL进行管理:可取出带爬取的URL,将其传送给“网页下载器”网页下载器:将URL指定的网页下载,存储成一个字 ...
- python学习笔记(matplotlib下载安装)
最近博主在找工作换新环境.昨天电话面试中问到python中threading模块进行接口性能测试的时候.如何生成性能测试报告 我现在还停留在打印在屏幕中.所以今天想着是否可以生成相应的性能测试报告 首 ...
- python学习笔记(mysqldb下载安装及简单操作)
python支持对mysql的操作 已经安装配置成功python.mysql 之后根据各自电脑配置选择对应系统的MySQL-python 文件是EXE格式.打开下一步即可 下载地址博主分享下: htt ...
随机推荐
- jquery 事件小事例
用户名变灰 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> & ...
- js firstChild 、nextSibling、lastChild、previousSibling、parentNode
nextSibling下一个兄弟节点 previousSibling上一个兄弟 parentNode父亲节点 <select><option value="zs" ...
- JAVA常见异常解析
1. java.lang.nullpointerexception 这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用了未经初始化的对象或者是不存在的对 ...
- HDUOJ--------(1198)Farm Irrigation
Farm Irrigation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 【LeetCode】144. Binary Tree Preorder Traversal (3 solutions)
Binary Tree Preorder Traversal Given a binary tree, return the preorder traversal of its nodes' valu ...
- Linux命令-安全复制命令:scp
scp是有Security的文件copy,基于ssh登录.操作起来比较方便,比如要把当前一个文件copy到远程另外一台主机上. 命令格式: scp [可选参数] 源文件 目标文件 scp 本地文件 远 ...
- R.string获取的是数字或者R.integer数字不对的问题
String msg = R.string.menu_title; 获取menu_title的String值,但发现这样写报错,原因R.string.menu_title是int类型的,可是通过以下方 ...
- Linux时间子系统(十四) tick broadcast framework
一.前言 在内核中,有cpuidle framework可以控制cpu的节电:当没有进程调度到该cpu上执行的时候,swapper进程粉墨登场,将该cpu会被推入到idle状态.当然CPU的idle状 ...
- mysql (已解决p)MYSQL5.7启动不了,本地计算机上的 MySQL57 服务启动后停止。
找到目录E:\AppServ\MySQL\data 备份data中的数据,然后删除掉data中所有的东西(如果删除不掉请在进程中找到mysqld.exe并且关闭) 打开CMD cd E:\AppSer ...
- Linux操作系统CentOS7.2发行版本的安装与配置(安装是选择服务器类型)
原文地址:http://1130739.blog.51cto.com/1120739/1738791 由于CentOS 7出来不久,对于这个版本的系统安装与配置的教程较少,今天就索性介绍一下CentO ...