23hh小说网——爬虫python

  1 #! /bin/python
  2 # -*- coding:utf-8 -*-
  3 
  4 # --------------------------------------------
  5 #     程序:【23hh小说网】爬虫
  6 #     版本:0.2
  7 #     作者:Silence
  8 #     日期:2014-04-01
  9 #     操作:输入quit
 10 #     功能:提供一个目录页,把这个小说的全部章节都抓取下来
 11 # ---------------------------------------------
 12 import urllib2
 13 import re
 14 import os
 15 
 16 class Novel_Tool:
 17 
 18     def __init__(self,weburl):
 19         self.url = weburl
 20         self.headers = {
 21             'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
 22         }
 23 
 24         self.pagesInfo = {}
 25     
 26     #获取当前页面的编码格式,现在某些小说网喜欢用gbk来编码
 27     # 但是,也有一些不厚道的网站,他们的实际编码格式不是在页面中charset中定义的格式,暂时先忽略了
 28     def getPageType(self,content):
 29         pattern = re.compile('charset=.*?"')
 30         pagetype = pattern.search(content).group()
 31         pagetype = pagetype[8:len(pagetype) - 1]
 32         return pagetype
 33 
 34     def start(self):
 35         # 得到utf-8编码的小说返回文本
 36         req = urllib2.Request(
 37             url = self.url,
 38             headers = self.headers
 39         )
 40         myResponse = urllib2.urlopen(req).read()
 41         # print myResponse
 42         decodeResp = myResponse.decode(self.getPageType(myResponse)).encode('utf-8')
 43         
 44         pagesInfo = self.getAllUrlsAndNames(decodeResp)
 45         # index = 1
 46         for index,pageInfo in pagesInfo.items():
 47             # print page
 48             print '正在爬第%d个页面……'%index
 49             req = urllib2.Request(
 50                 url = pageInfo['pageurl'],
 51                 headers = self.headers
 52                 )
 53             print pageInfo['pageurl']
 54             pageResponse = urllib2.urlopen(req).read()
 55             decodePageResp = pageResponse.decode(self.getPageType(pageResponse)).encode('utf-8')
 56             pageContent = self.getPageContent(decodePageResp)
 57             self.writeToFile(pageContent,pageInfo['pagename'])
 58 
 59     def writeToFile(self,content,filename):
 60         if os.path.exists(os.getcwd() + '/Nodels'):
 61             if not os.path.isdir(os.getcwd() + '/Nodels'):
 62                 os.rename('Nodels','Nodels.bak')
 63                 os.mkdir(os.getcwd() + '/Nodels')
 64         else:
 65             os.mkdir(os.getcwd() + '/Nodels')
 66 
 67         ofile = open(os.getcwd() + '/Nodels/' + filename,'w')
 68         print os.getcwd() + '/Nodels/' + filename
 69         try:
 70             ofile.write(content)
 71         except Exception, e:
 72             print '存储网页',filename,'出错!'
 73         finally:
 74             ofile.close()
 75         
 76     def getPageContent(self,content):
 77         contentPattern = re.compile('(<dd id="contents">)((.|\s)*?)(</dd>)')
 78         content = contentPattern.search(content).group(2)
 79         content = self.replaceWebTag(content)
 80         return content
 81 
 82     # 获取下一页的地址
 83     def getNextPage(self,content):
 84         # 先获取到下一页的位置
 85         footlinkRex = re.compile('(footlink">)(.*?)</dd>')
 86         foot = footlinkRex.search(content).group(2)
 87         pattern = re.compile(r'(返回目录.*?(<a.*?">下一页))')
 88         m = pattern.search(foot).groups()
 89         nextUrl = m[len(m)-1][9:m[len(m)-1].find('">')]
 90 
 91         return self.url[0:self.url.rfind('/')+1] + nextUrl
 92 
 93     def getAllUrlsAndNames(self,content):
 94         print '正在分析目录页面,请稍后…………'
 95         pageRex = re.compile('<a href=".*?</td>') #定义获取所有章节页面链接的正则
 96         pageUrlRex = re.compile('".*?"')    #获取章节url的正则
 97         pageNameRex = re.compile('>.*?<')    #获取章节名字的正则
 98 
 99         pages = pageRex.findall(content)
100         index = 1
101         for page in pages:
102             pageurl = pageUrlRex.search(page).group()
103             pageurl = pageurl[1:len(pageurl) - 1]
104             pageurl = self.url + pageurl
105 
106             pagename = pageNameRex.search(page).group()
107             pagename = pagename[1:len(pagename) - 1]
108 
109             # print pagename + '     ' + pageurl
110             self.pagesInfo[index] = {
111                 'pagename' : pagename,
112                 'pageurl' : pageurl
113             }
114             index = index + 1
115         print '目录页分析完成!该小说共有%d个章节'%index
116         return self.pagesInfo
117 
118 
119     def getNovelName(self,content):
120         titleRex = re.compile('<h1>.*?</h1>')
121         title = titleRex.search(content).group()
122         return title[4:len(title) - 5]
123 
124     def replaceWebTag(self,content):
125         charToNoneRex = re.compile(r'&nbsp;')
126         charToNewLineRex = re.compile("<br />|<br>|<br/>")
127 
128         content = charToNoneRex.sub("",content)
129         content = charToNewLineRex.sub("\n",content)
130         return content
131 
132 if __name__ == '__main__':
133     print u"""
134     # --------------------------------------------
135     #     程序:【23hh小说网】爬虫
136     #     版本:0.2
137     #     作者:Silence
138     #     日期:2014-04-01
139     #     操作:启动后输入要爬得小说目录页地址,就可以自动爬了
140     #     功能:提供一个目录页,把目录页中所有的目录章节都抓出来(默认是:23hh的争霸天下),
141     #         分章节保存在启动脚本目录下的Novels目录下;如果该目录下已经有一个Novels,则把这个Novels改名为Novels.bak
142     # ---------------------------------------------"""
143 
144     myinput = raw_input('请输入要爬的小说目录页面地址(默认是:23hh的争霸天下)\n')
145     if myinput == '':
146         myinput = 'http://www.23hh.com/book/43/43957/'
147     nodel = Novel_Tool(myinput)
148     nodel.start()

周末自己看小说,发现现在的网页上,一次请求回来的东西有很多无用的js和广告,速度也非常非常的慢;

于是自己就弄了这个一个爬虫,把所有小说章节从网页上爬下来。

看小说到我这种程度,算是苦逼了

转载于:https://www.cnblogs.com/SilenceCity/p/3640395.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是Python语言实现HH模型的仿真的完整代码示例: ```python import numpy as np import matplotlib.pyplot as plt # HH模型仿真 # 参数设置 Cm = 1 # 细胞膜电容 gNa = 120 # 钠离子通道导纳 ENa = 115 # 钠离子平衡电位 gK = 36 # 钾离子通道导纳 EK = -12 # 钾离子平衡电位 gL = 0.3 # 漏电导纳 EL = 10.6 # 漏电平衡电位 I = 10 # 外部电流 # 初始值 V = np.zeros(len(t)) m = np.zeros(len(t)) h = np.zeros(len(t)) n = np.zeros(len(t)) V[0] = 0 m[0] = 0 h[0] = 0 n[0] = 0 # 时间和步长 t = np.arange(0, 50, 0.01) dt = t[1] - t[0] # 辅助函数 def alpha_m(v): return 0.1 * (v + 40) / (1 - np.exp(-0.1 * (v + 40))) def beta_m(v): return 4 * np.exp(-0.0556 * (v + 65)) def alpha_h(v): return 0.07 * np.exp(-0.05 * (v + 65)) def beta_h(v): return 1 / (1 + np.exp(-0.1 * (v + 35))) def alpha_n(v): return 0.01 * (v + 55) / (1 - np.exp(-0.1 * (v + 55))) def beta_n(v): return 0.125 * np.exp(-0.0125 * (v + 65)) # 模拟 for i in range(1, len(t)): # 计算当前的导纳和电势 gNa_now = gNa * m[i-1]**3 * h[i-1] gK_now = gK * n[i-1]**4 IL_now = gL * (V[i-1] - EL) INa_now = gNa_now * (V[i-1] - ENa) IK_now = gK_now * (V[i-1] - EK) I_now = I # 计算下一个时间步的值 m[i] = m[i-1] + dt * (alpha_m(V[i-1]) * (1 - m[i-1]) - beta_m(V[i-1]) * m[i-1]) h[i] = h[i-1] + dt * (alpha_h(V[i-1]) * (1 - h[i-1]) - beta_h(V[i-1]) * h[i-1]) n[i] = n[i-1] + dt * (alpha_n(V[i-1]) * (1 - n[i-1]) - beta_n(V[i-1]) * n[i-1]) V[i] = V[i-1] + dt * (1/Cm * (I_now - IL_now - INa_now - IK_now)) # 绘图 plt.plot(t, V) plt.xlabel('Time (ms)') plt.ylabel('Voltage (mV)') plt.title('HH Model Simulation') plt.show() ``` 请注意,此代码使用了NumPy和Matplotlib库,您需要安装这些库才能运行此代码。此外,此代码使用了与之前的Matlab代码相同的模型和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值