接下来将记录我一步一步写一个非官方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的运行环境,这样就会方便很多。
当然我写的只是简单实现,并没有考虑到效率和优化
下面是几个重要的文档:
#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" ,如果存在以后就以文件的元素结构分析(以后的每一个页面最好都做一下这步)
#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)
{ "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": "灌篮高手全国大赛篇(全彩)" } }
#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)
#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)
#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了,下载的图片正常显示