学习了一天的python,终于可以爬爬了-_-
恒久恒久以前在语言大陆就听过一种叫,人生苦短,我用python的至理名言.陆陆续续在课下和业余生活中学习的一点python,知道基本的语法和规则,不过py的库实在是太多了,而且许多概念也没有深入的学习,不过这并不影响使用py,基本上面的知识就可以应对了,工具服务生活,那我就用py来干有意思的事情了.
环境:
python3.3.6
首先添加依赖包,这里用到xpath,json,urllib3,有些库需要自己下载安装,这网上教程一大堆,就不再赘述了.
from lxml import etree
import urllib3, urllib
import json
import random as rd
import os
import time
设置请求头
'''
漫画爬取-请求头
'''
header = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
"Cookie": "",
"Host": "",
"Pragma": "no-cache",
"Referer": "",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36"
}
'''
请求参数
'''
request = { }
'''
漫画主站
'''
comicHost = "" '''
漫画访问路径
'''
imgTemp = "/action/play/read"
具体网站就不公开了,毕竟是免费的.其他网站的爬取也是大同小异.
'''
构造请求参数
t=0.01
id:漫画id
jid:漫画当前级数
tid:当前图片数
rand:随机数
'''
imgData = {"id": "", "jid": "", "tid": "", "rand": ""}
'''
本地存储路径
'''
localImgs = "F:\\comic\\"
http = urllib3.PoolManager();
'''
分类解析(主站和漫画首页)
'''
urllib3.disable_warnings()
def isContain(strUrl):
return ".html" in strUrl
'''
漫画首页html信息
'''
bodyContent = ""
'''
返回解析数据
'''
def requestRemote(url, pattern):
res = http.request("GET", url, header)
# 保存页面信息
urlArray = etree.HTML(res.data.decode("utf-8")).xpath(pattern)
return urlArray
# 获取首页的漫画链接
arrayHtml = requestRemote(comicHost, "//div/ul/li/a/@href")
# 去掉下载完成的连接 级数
endArray = []
# 正在操作的漫画连接
nowOperate = ""
endSeries = 0
for url in arrayHtml:
if isContain(url):
pass
else:
flag = True
for endUrl in endArray:
if url == endUrl:
flag = False
break
if flag:
descArray = requestRemote(comicHost + url, "//div[@class='chapters']/ul/li/a/@href")
for imgUrl in descArray:
# 获取漫画id
comicId = requestRemote(comicHost + imgUrl, "//div[@class='info clearfix']/form/input[@id='dataid']/@value")
# 拼接漫画图片路径
imgRealUrl = comicHost + imgTemp
# 获取漫画级数
sid = imgUrl.split("/")[2].split(".")[0]
if url == nowOperate and int(sid) > endSeries:
print("略过已经下载的级数..." + sid + "级")
continue
iid = 1
# 存储图片数组
imgArray = []
# 循环获取图片
while True:
if len(comicId) != 0:
imgData = {"did": comicId[0], "id": sid, "jid": id, "rand": rd.random()}
print("请求的路径: " + imgRealUrl + "?" + urllib.parse.urlencode(imgData))
# 得到漫画的json数据
resJson = http.request("GET", imgRealUrl + "?" + urllib.parse.urlencode(imgData), header)
# 判断漫画时候为空 JSON解析: JSON字符串中的内容应该用双引号,而非单引号。
result = json.loads(resJson.data.decode("utf-8"), encoding="utf-8")
if result["Code"] == "":
break
else:
imgArray.append(result["Code"])
iid += 1
# 遍历漫画
for imgSrc in imgArray:
print("图片开始下载")
# 构造图片本地存储路径
title = requestRemote(comicHost + url, "//div[@class='info d-item-content']/h1")
createPath = localImgs + title[0].text.strip() + "\\" + sid + "\\"
# 存储本级漫画
if os.path.exists(createPath):
pass
else:
os.makedirs(createPath)
img = http.request("GET", imgSrc)
file = open(createPath + imgSrc.split("/")[6], "wb+")
file.write(img.data)
print("图片下载成功! " + time.strftime('%Y-%m-%d %H%M%S',time.localtime(time.time())))
print("成功保存第" + sid + "级...")
else:
print("无法获取漫画id忽略下载...")
break
print("结束爬取...")
结果:
这里面需要注意几个就可以通用了:
- 所要爬去的具体地址,注意有的地址在网页上是无法发现的,需要第三方的抓包工具找到具体的请求地址
- 我这里使用的xpath对网页进行解析的,这个也比较简单,安装看下文档就可以直接使用了
- 我这里对照的每个下载的漫画做了一个过滤免下载,如果中间爬去错误的时候,则下载重新进行的时候,忽略其已经下载好的漫画
# 去掉下载完成的连接 级数
endArray = []
# 正在操作的漫画连接
nowOperate = ""
endSeries = 0
只需要知道点py的语法,urllib3知识,地方放的文档解析的插件,人人都可爬虫
学习了一天的python,终于可以爬爬了-_-的更多相关文章
- [Python学习笔记][第七章Python文件操作]
2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...
- [Python学习笔记][第五章Python函数设计与使用]
2016/1/29学习内容 第四章 Python函数设计与使用 之前的几页忘记保存了 很伤心 变量作用域 -一个变量已在函数外定义,如果在函数内需要修改这个变量的值,并将这个赋值结果反映到函数之外,可 ...
- [Python学习笔记][第四章Python字符串]
2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...
- Python学习入门基础教程(learning Python)--5.6 Python读文件操作高级
前文5.2节和5.4节分别就Python下读文件操作做了基础性讲述和提升性介绍,但是仍有些问题,比如在5.4节里涉及到一个多次读文件的问题,实际上我们还没有完全阐述完毕,下面这个图片的问题在哪呢? 问 ...
- 从零开始学习PYTHON3讲义(一)认识Python
课程名称 从零开始PYTHON3 课程长度 15讲 适用年龄 15-20岁(初三-大一) 本讲名称 认识Python 时长 90分钟 教学内容分析 Python是时下最流行的计算机编程语言之一.本课程 ...
- python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码
python3.4学习笔记(二十六) Python 输出json到文件,让json.dumps输出中文 实例代码 python的json.dumps方法默认会输出成这种格式"\u535a\u ...
- python3.4学习笔记(二十五) Python 调用mysql redis实例代码
python3.4学习笔记(二十五) Python 调用mysql redis实例代码 #coding: utf-8 __author__ = 'zdz8207' #python2.7 import ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字
python3.4学习笔记(二十二) python 在字符串里面插入指定分割符,将list中的字符转为数字在字符串里面插入指定分割符的方法,先把字符串变成list然后用join方法变成字符串str=' ...
随机推荐
- Enterprise Craftsmanship
转自:http://enterprisecraftsmanship.com/2015/04/13/dto-vs-value-object-vs-poco/ DTO vs Value Object vs ...
- js中 函数声明/函数表达式/匿名函数/箭头函数/立即执行函数
函数声明: function add(a, b) { // ... } 1.顾名思义,声明一个函数, 用关键字 “function” 来告诉,这是一个函数. 2.任何地方,想用就可以拿过来使用 函数表 ...
- 使用Bitsadmin 命令下载文件
如果你碰到一个 Sa权限的注入点,你可以执行dos命令,但是你发现站库分离,数据库和web不在一个服务器上,而且悲剧的是数据库服务器又是个内网,这个时候你该怎么办? 这里就需要用到Bitsadmin来 ...
- 【Swing程序设计/常用面板】
面板也是一个Swing容器,可以作为容器容纳其他组件,但是它必须要被添加到其他容器中.Swing常见的面板是JPanel面板和JScrollPanel面板. JPanel面板可以聚集一些组件来布局. ...
- return & finally 执行顺序 这是我读到的最合理的解释
新词:return [expression] 栈顶元素 局部变量的快照 java方法是在栈幀中执行,栈幀是线程私有栈的单位,执行方法的线程会为每一个方法分配一小块栈空间来作为该方法执行时的内存空间, ...
- jquery easyui教程[申明:来源于网络]
jquery easyui教程[申明:来源于网络] 地址:http://wenku.baidu.com/view/570e4d4533687e21af45a941.html
- 个人小爱好:Operating System: three easy pieces第6章第5节——总结
总结 我们讨论了实现CPU虚拟化的部分底层机制,及我们统称为直接执行(direct execution)的一组技术.基本的思想十分简单明了:直接在CPU上运行你想运行的代码,但是你先得确保将硬件设置好 ...
- Windows 10 家庭版/专业版 彻底关闭windows update自动更新
转载: https://blog.csdn.net/u014162133/article/details/84973426# https://blog.csdn.net/qq_40820862/art ...
- EXT的bug 布局border 和 grid的cellediting
首先 我要的布局是上下两块,并且高度和按自己的喜欢可调节,所以我采用的是border的布局, 上下两块,都放grid列表,上面一块不可编辑,下面这块可编辑,如图 在编辑第二块的时候会出现这个现象 图一 ...
- Hash算法和一致性Hash算法
Hash算法 我们对同一个图片名称做相同的哈希计算时,得出的结果应该是不变的,如果我们有3台服务器,使用哈希后的结果对3求余,那么余数一定是0.1或者2,正好与我们之前的服务器编号相同,如果求余的结果 ...