python为在线漫画站点自制非官方API(未完待续)
接下来将记录我一步一步写一个非官方API的过程,由于一些条件的约束,最后的成品可能非常粗暴简陋
如今介绍要准备的全部工具:
系统:ubuntu 14.04
语言:python 2.7
须要自行安装的库:flask,BeautifulSoup4。requests,selenium,pinyin,phantomjs-1.9.8
server:Sina App Engine
由于成本原因我选择了Sina App Engine,由于免费,可是免费也带来了一定的麻烦就是功能不全,尽管Sina App Engine同意安装python的第三方库,可是对于javascript解释器我非常无奈,假设能够我非常希望Sina App Engine有nodejs的执行环境。这样就会方便非常多。
当然我写的仅仅是简单实现,并没有考虑到效率和优化
以下是几个重要的文档:
以下是搜索漫画API開始:
分析:
我选择的站点是:http://cnc.dm5.com(对于站点我仅仅想说很抱歉)
为什么选择这个站点,由于是我最常逛的在线漫画站点,仅此而已
接下来我们看一下它的搜索页面,当你在首页输入书名,点击搜索以后,URL会跳转
举个样例:
搜索“一拳超人”
结果页面例如以下:
http://www.dm5.com/search?title=一拳超人&language=1
这样我们就知道搜索结果页面。你能够手动将 一拳超人 改成你喜欢的漫画名,看到会不会跳转到那本漫画的搜索结果页上
可是结果页上内容太多了,并不仅仅有我要的那本漫画,于是我又做了一件事,将中文改成pinyin
http://www.dm5.com/search?title=yiquanchaoren&language=1
结果页面上仅仅有我须要的漫画,如今发现了拼音搜索会更精确
当我们知道这样就能够进入搜索页。那我们就能够分析这个页面,找到我们须要的信息
那么我们须要什么呢?
不论什么浏览器的F12都是强大的,在这个页面上按下F12,就是新世界的大门。哈哈哈......
定位元素,发现须要的信息是在 class="ssnrk" 中(友情提示。F12下的源代码是解析JS以后的,想知道现实情况最后先输出在一个文件上看看)
#coding:utf-8
import requests wfile = open('url.html','w')
r = requests.get('http://cnc.dm5.com/search?title=yiquanchaoren').content wfile.write(r)
这是最简单的測试方法,将源代码写进一个文件里,然后去文件里找有没有 class="ssnrk" ,假设存在以后就以文件的元素结构分析(以后的每个页面最好都做一下这步)
如今发现文件里也有这个元素,OK,我们须要什么呢?漫画名和它的地址,当然你要图片也能够
我们发现class="ssnrk"元素下<div class="ssnr_yt"><dl><a href="/manhua-yiquanchaoren/" title="一拳超人"><img height="127" width="95" src="http://mhfm5.tel.cdndm5.com/11/10684/20150430155820_130x174_13.jpg" /></a></dl>里面包括了我们要的一切,名称,链接,图片
那么我们怎么得到这些有效信息呢?
#coding:UTF-8
import urllib2
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import requests
import re
import json #搜索结果页面URL
url='http://cnc.dm5.com/search? title=guanlangaoshou'
r = requests.get(url).content
soup = BeautifulSoup(r) #找出全部class="ssnr_yt"元素,然后循环找出以下的a元素,放进找一个list中
ssjg_list=[]
for line in soup.find_all(class_="ssnr_yt"):
ssjg_list.append(line.find('a')) #循环将全部图片,URL,名称放进字典中
z_url="http://cnc.dm5.com"
#总的字典
json_ss = {}
#结果数量
json_ss['num']=len(ssjg_list)
#计数器
j_s=0
for line in ssjg_list:
j_s=j_s+1
#单个字典
json_s={}
soup_a = BeautifulSoup(str(line))
json_s['title']=soup_a.a.get('title')#找出a元素title属性的值
json_s['url']=z_url+soup_a.a.get('href')#找出a元素hresf属性的值
json_s['img']=soup_a.a.img.get('src')#找出a元素下img元素src属性的值
json_ss[j_s]=json_s #以json形式输出
print json.dumps(json_ss,ensure_ascii=False,indent=2)
为什么这里搜索内容变成guanlangaoshou呢?由于有些漫画真的有多个结果,比方这个guanlangaoshou ,就有四个以下是得到的结果:
{
"3": {
"url": "http://cnc.dm5.com/manhua-guanlangaoshou/",
"img": "http://mhfm9.tel.cdndm5.com/1/860/860_c.jpg",
"title": "灌篮高手"
},
"1": {
"url": "http://cnc.dm5.com/manhua-guanlangaoshoujuchangban/",
"img": "http://mhfm5.tel.cdndm5.com/1/380/380_c.jpg",
"title": "灌篮高手剧场版"
},
"2": {
"url": "http://cnc.dm5.com/manhua-guanlangaoshoushirihou/",
"img": "http://mhfm8.tel.cdndm5.com/7/6270/6270_c.jpg",
"title": "灌篮高手十日后"
},
"num": 4,
"4": {
"url": "http://cnc.dm5.com/manhua-guanlangaoshouquanguodasaipian-quancai/",
"img": "http://mhfm1.tel.cdndm5.com/8/7312/20150526100857_130x174_12.jpg",
"title": "灌篮高手全国大赛篇(全彩)"
}
}
如今写的都是小零件和一步一步測试,等到最后会组装起来搜索结果先告一段落,如今已搜索到的结果为前提,进行下一步,找出这本漫画全部的章节的URL:这次以 yiquanchaoren 为例:URL:http://cnc.dm5.com/manhua-yiquanchaoren/这是漫画的章节页,眼下是74话(挺少的,看着只是瘾)继续使用F12这个武器,会发现章节的URL都在class=nr6 lan2下的a中:
#coding:UTF-8
import urllib2
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import requests
import re
import json url='http://cnc.dm5.com/manhua-yiquanchaoren/'
r = requests.get(url).content
soup = BeautifulSoup(r)
#找出全部class="nr6 lan2"下全部a
class_a = soup.find_all(class_="nr6 lan2")
s = BeautifulSoup(str(class_a)).find_all('a')
#这个list用来存放全部章节URL
url_list=[]
z_url = 'http://cnc.dm5.com'
#循环全部a,获取URL
for line in s:
bs_a = BeautifulSoup(str(line))
#这个推断是用来去除不须要的URL,它们是已http://开头。正确的URL是/开头
if not bs_a.a.get('href').split('/')[0]:
w_url = z_url+bs_a.a.get('href')
url_list.append(z_url+bs_a.a.get('href'))
#去重排序URL
print sorted(list(set(url_list)),key=str.lower)
这样就得到了全部章节的URL,如今这里先放一下,我们点击进入一个章节,看一会儿漫画。诶。竟然有广告,開始找出须要的漫画url。按下F12。我们能够立即找到,真的找到了吗?
之前说过浏览器下的源代码是经过js解析以后的完整源代码,而python不具备js的解析,非常easy的实验,之前也提到过。将获取的源代码写入一个文件里
#coding:utf-8
import requests wfile = open('url.html','w')
r = requests.get('http://cnc.dm5.com/m208526/').content wfile.write(r)
在这个url.html中搜索id="cp_img",原本以下应该有的img元素不见了,整个id以下居然没有子节点,再往下看,会找到关于img的js函数。如今能够确定。图片是由js控制的,python不能解析的话,仅仅能依赖别的工具selenium,phantomjs-1.9.8,好复杂的说
话不多说,直接上代码
#coding:UTF-8
import urllib2
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import requests
import re
import json
from selenium import webdriver
import sys #这两个url。待会儿再解释
#url="http://cnc.dm5.com/m208526-p1"
url="http://cnc.dm5.com/m208526/#ipg1"
#一个是windows下的路径,一个是ubuntu下的路径,依据自己的安装路径
#driver = webdriver.PhantomJS(executable_path='C:\\YXJR_ZJL\\RuanJian\\phantomjs-2.0.0-windows\\bin\\phantomjs')
driver = webdriver.PhantomJS(executable_path='/home/zjl//phantomjs-1.9.8/bin/phantomjs')
driver.get(url)
#依据xpath找到id="cp_image"的img元素。获取src属性值
r= driver.find_element_by_xpath("//img[@id='cp_image']").get_attribute('src')
#下载图片。保存本地
with open(r'yy11.jpg','wb') as f:
f.write(requests.get(r).content)
上面是两个url均有效。当你点击下一页的时候url后面会出现一个页数的參数。默认第一页是没有的就算加上參数也不影响将图片保存本地看一下。会发现一个问题。为什么下载的图片和现实看到的图片不一样呢?下载下来的图片是提示要从正确的站点进入,难道是传说中的防盗链?于是我把代码改了一下:
#coding:UTF-8
import urllib2
from bs4 import BeautifulSoup
from bs4 import UnicodeDammit
import requests
import re
import json
from selenium import webdriver
import sys #这两个url,待会儿再解释
#url="http://cnc.dm5.com/m208526-p1"
url="http://cnc.dm5.com/m208526/#ipg1"
#一个是windows下的路径,一个是ubuntu下的路径,依据自己的安装路径
#driver = webdriver.PhantomJS(executable_path='C:\\YXJR_ZJL\\RuanJian\\phantomjs-2.0.0-windows\\bin\\phantomjs')
driver = webdriver.PhantomJS(executable_path='/home/zjl//phantomjs-1.9.8/bin/phantomjs')
driver.get(url)
#依据xpath找到id="cp_image"的img元素,获取src属性值
r= driver.find_element_by_xpath("//img[@id='cp_image']").get_attribute('src')
#获取图片的头地址
rr = r.split('//')[1].split('/')[0]
#自己定义头信息
headers = {'Host':rr,
'Referer':url,
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0'}
imgUrl = r
#下载图片
with open(r'yy11.jpg','wb') as f:
#訪问时发送自己定义的头信息
f.write(requests.get(imgUrl,headers=headers).content)
如今发现ok了。下载的图片正常显示
到这里,用上面全部的知识已经能够写一个漫画下载器了,能够去站点下载漫画看了。哈哈哈......
今天先到这里,下次继续
python为在线漫画站点自制非官方API(未完待续)的更多相关文章
- [Python]从哪里开始学习写代码(未完待续)
预警:这只是我在学习中的一点感受,可能并不完全准确,也不包括面向对象编程的思想(我还不太懂),也有水文的嫌疑,大佬请温和批评指正或者绕道. 计算机语言 语言,是用来交流的.计算机是不能直接听懂人的语言 ...
- 【Python】接口自动化测试-Fidder的使用(未完待续……)
一.fidder一些一定需要掌握的知识. 1.工具简介 2.清屏操作(1中提到了,这里再着重说明下): 3.get和post请求参数相关: 4.会话框(Fidder左侧区域内容解析): 5.Reque ...
- [python]爬代理ip v2.0(未完待续)
爬代理ip 所有的代码都放到了我的github上面, HTTP代理常识 HTTP代理按匿名度可分为透明代理.匿名代理和高度匿名代理. 特别感谢:勤奋的小孩 在评论中指出我文章中的错误. REMOTE_ ...
- Python之路第一课Day7--随堂笔记(面向对象编程进阶...未完待续 )
本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@s ...
- Python面试2未完待续
Python面试重点(基础篇) 注意:只有必答题部分计算分值,补充题不计算分值. 第一部分 必答题(每题2分) 简述列举了解的编程语言及语言间的区别? c语言是编译型语言,运行速度快,但翻译时间长py ...
- Python之路第一课Day9--随堂笔记之一(堡垒机实例以及数据库操作)未完待续....
一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: ...
- python 单步调试初探(未完待续)
pdb 调试: import pdb pdb.set_trace() pudb 调试: http://python.jobbole.com/82638/
- Python的Argparse模块是什么?(未完)
近日在阅读代码的过程中遇到了Argparse模块,记得前段时间已经看了,可是过了两周现在又忘了, 看来写代码一定要钻研到底搞清楚其中原委才行,本文主要参考Python3.6系列官方文档 ...
- 【未完待续】API接口
1.json传输 2.安全:权限 http://blog.csdn.net/linlzk/article/details/50748580. 比如:调用端有userId.psw.version.ti ...
随机推荐
- .Net Core(二) 下
接上面 http://www.cnblogs.com/xcodevs/p/5584218.html 在解决方案浏览器中,右击 Controllers 目录.选择添加>新建项.选择Web API控 ...
- W3C标准冒泡、捕获机制
(一) 捕获和冒泡如何相互影响 我们来做几个任务吧! 有一个前提,#parent为标签,#child为子标签,他们是嵌套关系支线任务1 //捕获模式 document.getElementById(' ...
- android黑科技系列——Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)
一.前言 在之前一篇文章已经介绍了一款网络访问软件的破解教程,当时采用的突破口是应用程序本身的一个漏洞,就是没有关闭日志信息,我们通过抓取日志获取到关键信息来找到突破口进行破解的.那篇文章也说到了,如 ...
- JavaScript中比较运算符的使用
比较运算符的基本操作过程是:首先对操作数进行比较,这个操作数可以是数字也可以是字符串,然后返回一个布尔值true或false. 在JavaScript中常用的比较运算符如下表所示. 例如,某商场店庆搞 ...
- 171129-workaround on ubuntu-seting up piston for steem
setup ubuntu environment variables sudo vi /etc/environment Then set all below variables: percentCha ...
- jQueryAjax模拟按键消抖(可设置抖动延迟时间)
在硬件中,按键等都会有抖动现象,如何消除抖动,不重复触发事件呢,这就要用到消抖机制了. 这是我用jQuery模拟硬件消抖原理,额,可能是吧...又不对的地方,希望有高手指点指点. <!DOCTY ...
- SLAM:(编译ORB)fatal error LNK1181: 无法打开输入文件“libboost_mpi-vc110-mt-1_57.lib”
对于使用MD版本编译的ORB_SLAM,会用到MPI版本的Boost,需要自己编译,比较麻烦. 因此使用MT版本进行生成,暂时无法完成. 工程配置 发现添加库文件使用了:从父级或项目默认继承,默认包含 ...
- OpenCV的AdaptiveThreshold函数
摘自于OpenCV Doc2.410,opencv2refman文档. 1.函数原型 adaptiveThreshold //Applies an adaptive threshold to an a ...
- 详解CorelDRAW智能填充工具的运用
使用智能填充工具可以为任意的闭合区域填充颜色并设置轮廓.与其他填充工具不同,智能填充工具仅填充对象,它检测到区域的边缘并创建一个闭合路径,因此可以填充区域.例如,智能填充工具可以检测多个对象相交产生的 ...
- react功能实现-数组遍历渲染
在react中如何将一个数组遍历,并且逐个渲染在页面上? 1.在jsx渲染中,如果这个变量是一个数组,则会展开这个数组的所有成员. var arr = [ <h1>Hello world! ...