接下来将记录我一步一步写一个非官方API的过程,因为一些条件的约束,最后的成品可能很粗暴简陋

现在介绍要准备的所有工具:

系统:ubuntu 14.04

语言:python 2.7

需要自行安装的库:flask,BeautifulSoup4,requests,selenium,pinyin,phantomjs-1.9.8

服务器:Sina App Engine

因为成本原因我选择了Sina App Engine,因为免费,但是免费也带来了一定的麻烦就是功能不全,虽然Sina App Engine允许安装python的第三方库,但是对于javascript解释器我很无奈,如果可以我很希望Sina App Engine有nodejs的运行环境,这样就会方便很多。

当然我写的只是简单实现,并没有考虑到效率和优化

下面是几个重要的文档:

http://beautifulsoup.readthedocs.org/zh_CN/latest/

http://cn.python-requests.org/zh_CN/latest/

http://dormousehole.readthedocs.org/en/latest/
http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html

https://github.com/cleverdeng/pinyin.py

(一定要多看文档,一定要多看文档,一定要多看文档,重要的事要说三遍,因为我经常不看文档)

下面是搜索漫画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 requestswfile = open('url.html','w')
r = requests.get('http://cnc.dm5.com/search?title=yiquanchaoren').contentwfile.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 jsonurl='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的解析,很简单的实验,之前也提到过,将获取的源码写入一个文件中

#coding:utf-8
import requestswfile = open('url.html','w')
r = requests.get('http://cnc.dm5.com/m208526/').contentwfile.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(未完待续)相关推荐

  1. Python中常用的一些操作总结(未完待续)update @ 2017-5-18

    写在前面的话 其实也没有什么可以写的,或者说完全没有价值.因为你只要动一动手指就可以在Google上找到我要写的这些东西.只是我还不习惯好久没有碰我的blog,但是我又不想写没有价值的东西.或许有价值 ...

  2. [Python]从哪里开始学习写代码(未完待续)

    预警:这只是我在学习中的一点感受,可能并不完全准确,也不包括面向对象编程的思想(我还不太懂),也有水文的嫌疑,大佬请温和批评指正或者绕道. 计算机语言 语言,是用来交流的.计算机是不能直接听懂人的语言 ...

  3. nodejs+Vue在线漫画网站周边购物网站express项目源码

    在线漫画网站作为一种新型的漫画服务方式,越来越多的人会选择这种随时.随地可以进行的漫画消费模式.在线漫画网站,可以为人们提供新漫画发行.热门漫画.个人收藏漫画等各类目录选择,可以提供在线查看.下载本地 ...

  4. 学习前端的实用网站——未完待续

    学习前端的实用网站--未完待续 一.学习类网站 1.视频教程 2.技术分享 3.大牛博客 4.参考手册 二.功能类网站 1.颜色 2.图标 3.字体 4.素材 三.辅助类网站 一.学习类网站 1.视频 ...

  5. python爬虫requests源码链家_python爬虫——爬取链家房价信息(未完待续)

    爬取链家房价信息(未完待续) items.py # -*- coding: utf-8 -*- # Define here the models for your scraped items # # ...

  6. Python基础:内置异常(未完待续)

    Python基础:内置异常(未完待续) 参考文章: (1)Python基础:内置异常(未完待续) (2)https://www.cnblogs.com/luo630/p/9176768.html 备忘 ...

  7. python线程和进程-未完待续

    python线程和进程-未完待续 环境变量 0. 概念 1. 并行/并发 并行 并发 并行与并发的关系 2.进程/线程 基本概念 线程 多线程 队列 互斥锁/线程共享 阻塞 锁 条件锁 进程 多进程 ...

  8. 用python做归结演绎推理_Python中惯用的一些操作总结(未完待续)

    Python中常用的一些操作总结(未完待续) 写在前面的话 其实也没有什么可以写的,或者说完全没有价值.因为你只要动一动手指就可以在Google上找到我要写的这些东西.只是我还不习惯好久没有碰我的bl ...

  9. Python爬虫项目,获取所有网站上的新闻,并保存到数据库中,解析html网页等(未完待续)

    1.需求说明 需求: 爬取虎嗅网站的所有新闻,并保存到数据库中. http://www.huxiu.com 技术: 1.爬虫 获取服务器的资源(urllib) 解析html网页(BeautifulSo ...

  10. java调用高德地图API开发,高德在线地图开发——未完待续

    这是目录 一.引入高德地图API 二.高德地图开发 1.定义一个div来存放地图 2.生成地图 3.添加一个跳跃的点 4.添加控件 5.有其他需要的请留言 一.引入高德地图API 高德地图官方示例:h ...

最新文章

  1. CSS 实现打字效果
  2. NEU 1040 Count
  3. c++ 线程池_基础篇:高并发一瞥,线程和线程池的总结
  4. Windows Server 2008远程桌面端口更改方法
  5. 《塞尔达传说:旷野之息》技术分析:神作是怎么炼成的
  6. Exception in thread main java.lang.NullPointerException一例解决
  7. 2ASK调制与解调(包含maltab代码)
  8. 自定义C++异常处理
  9. skywalking 引起 spring-cloud-gateway 的内存溢出 skywalking的bug
  10. 六.dbms_session(提供了使用PL/SQL实现ALTER SESSION命令)
  11. html没有插件怎么办,html网页包插件没有插入options.title
  12. 保证Web数据库安全 认真把好七道关
  13. Metro风格的Android界面应用
  14. 用NAnt 将StarTeam中的文件CheckOut回本地计算机
  15. Android自己写的三款实用开关控件
  16. Markdown编辑器简单总结
  17. 开通写scdn博客第一天
  18. 如何使用Xpose绕过APP自定义证书验证去抓Https包
  19. 微信开发之百度地图API学习(一)
  20. AGV机器人核心部件——驱动轮

热门文章

  1. 信必优成功案例 – 中国网络电视台(CNTV)
  2. 你真的了解性能压测中的SLA吗?
  3. 【C语言】输出“*”菱形图案
  4. s3c6410 开发板Linux系统支持 K9GAG08U0E的方法(第二篇)
  5. 基于JSP的美食论坛系统毕业设计
  6. 豆瓣读书isbn 查询
  7. leetcode 热点——排列组合问题
  8. leetcode 排列组合系列
  9. 云服务器ecs什么意思
  10. 怎么理解本征无序态的蛋白质(Intrinsically disordered proteins)