zoukankan      html  css  js  c++  java
  • 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的执行环境。这样就会方便非常多。

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

    以下是几个重要的文档:


    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 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了。下载的图片正常显示
    到这里,用上面全部的知识已经能够写一个漫画下载器了,能够去站点下载漫画看了。哈哈哈......

    今天先到这里,下次继续










  • 相关阅读:
    Python3-元组
    Python3-列表
    Python3-字符串
    Python3-for循环机制
    Python3-初识
    优先队列——priority queue
    单调队列 —— 滑动窗口
    SDNU_ACM_ICPC_2021_Winter_Practice_7th [个人赛]
    博弈论入门(论和威佐夫、巴什、尼姆打牌被吊打是什么感受(╥﹏╥)
    字符串最大最小表示法
  • 原文地址:https://www.cnblogs.com/jzssuanfa/p/7133411.html
Copyright © 2011-2022 走看看