编写Python脚本抓取网络小说来制作自己的阅读器

论坛 期权论坛 脚本     
niminba   2021-5-23 04:06   1430   0

你是否苦恼于网上无法下载的“小说在线阅读”内容?或是某些文章的内容让你很有收藏的冲动,却找不到一个下载的链接?是不是有种自己写个程序把全部搞定的冲动?是不是学了 python,想要找点东西大展拳脚,告诉别人“哥可是很牛逼的!”?那就让我们开始吧! 哈哈~
    好吧,我就是最近写 Yii 写多了,想找点东西调剂一下.... = =

    本项目以研究为目的,所有版权问题我们都是站在作者的一边,以看盗版小说为目的的读者们请自行面壁!
    说了这么多,我们要做的就是把小说正文的内容从网页上爬下来,我们的研究对象是全本小说网....再次声明,不对任何版权负责....
    一开始先做最基础的内容,就是把某一章的内容抓取下来。

    环境:Ubuntu, Python 2.7

    基础知识
    这个程序涉及到的知识点有几个,在这里列出来,不详细讲,有疑问的直接百度会有一堆的。
    1.urllib2 模块的 request 对像来设置 HTTP 请求,包括抓取的 url,和伪装浏览器的代理。然后就是 urlopen 和 read 方法,都很好理解。
    2.chardet 模块,用于检测网页的编码。在网页上抓取数据很容易遇到乱码的问题,为了判断网页是 gtk 编码还是 utf-8 ,所以用 chardet 的 detect 函数进行检测。在用 Windows 的同学可以在这里 http://download.csdn.net/detail/jcjc918/8231371 下载,解压到 python 的 lib 目录下就好。
    3. decode 函数将字符串从某种编码转为 unicode 字符,而 encode 把 unicode 字符转为指定编码格式的字符串。
     4. re 模块正则表达式的应用。search 函数可以找到和正则表达式对应匹配的一项,而 replace 则是把匹配到的字符串替换。

    思路分析:
    我们选取的 url 是 http://www.quanben.com/xiaoshuo/0/910/59302.html,斗罗大陆的第一章。你可以查看网页的源代码,会发现只有一个 content 标签包含了所有章节的内容,所以可以用正则把 content 的标签匹配到,抓取下来。试着把这一部分内容打印出来,会发现很多 <br /> 和 &nbsp,<br /> 要替换成换行符, &nbsp 是网页中的占位符,即空格,替换成空格就好。这样一章的内容就很美观的出来了。完整起见,同样用正则把标题爬下来。

    程序

# -*- coding: utf-8 -*- 
 
import urllib2 
import re 
import chardet 
 
 
class Book_Spider: 
 
  def __init__(self): 
    self.pages = [] 
 
  # 抓取一个章节 
  def GetPage(self): 
    myUrl = "http://www.quanben.com/xiaoshuo/0/910/59302.html"; 
    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
    headers = { 'User-Agent' : user_agent } 
    request = urllib2.Request(myUrl, headers = headers) 
    myResponse = urllib2.urlopen(request) 
    myPage = myResponse.read() 
 
    #先检测网页的字符编码,最后统一转为 utf-8 
    charset = chardet.detect(myPage) 
    charset = charset['encoding'] 
    if charset == 'utf-8' or charset == 'UTF-8': 
      myPage = myPage 
    else: 
      myPage = myPage.decode('gb2312','ignore').encode('utf-8') 
    unicodePage = myPage.decode("utf-8") 
 
    try: 
      #抓取标题 
      my_title = re.search('<h1>(.*?)</h1>',unicodePage,re.S) 
      my_title = my_title.group(1) 
    except: 
      print '标题 HTML 变化,请重新分析!' 
      return False 
     
    try: 
      #抓取章节内容 
      my_content = re.search('<div.*?id="htmlContent" class="contentbox">(.*?)<div',unicodePage,re.S) 
      my_content = my_content.group(1) 
    except: 
      print "内容 HTML 变化,请重新分析!" 
      return False 
     
    #替换正文中的网页代码 
    my_content = my_content.replace("<br />","\n") 
    my_content = my_content.replace(" "," ") 
 
    #用字典存储一章的标题和内容 
    onePage = {'title':my_title,'content':my_content} 
    return onePage 
 
 
  # 用于加载章节 
  def LoadPage(self): 
    try: 
      # 获取新的章节 
      myPage = self.GetPage() 
       
      if myPage == False: 
        print '抓取失败!' 
        return False 
       
      self.pages.append(myPage) 
    except: 
      print '无法连接服务器!' 
 
  #显示一章 
  def ShowPage(self,curPage): 
      print curPage['title'] 
      print curPage['content'] 
 
  def Start(self): 
    print u'开始阅读......\n' 
    #把这一页加载进来 
    self.LoadPage() 
    # 如果self的pages数组中存有元素 
    if self.pages: 
      nowPage = self.pages[0] 
      self.ShowPage(nowPage) 
 
 
#----------- 程序的入口处 ----------- 
print u""" 
--------------------------------------- 
  程序:阅读呼叫转移 
  版本:0.1 
  作者gBBBKKKKKKKKKH9niyc!KKKKKKKKKKHB[HBKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHB9n!z+o9ck9B9+;B9/g: !{[\HB9'ML

B:+ ;]B9b&"y."ic"BKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHBBB[I"y."iB][]
	B^PHY\
HB^P\

HBBOB]Bg*:/b9i&l#!z+j;$y. :)y$y.yl#,9+9g,99,yioy.d#!"y.*f!z+j9#.b9m:`"Bamk.".*n9$9.i)!`.#9$y.y."9.yb9c :)y,9 9&y.#y/ai{ #9+iH9b c%. 9.*+#yyg,9.yk."my\:/c9;`b9&yg'#,:/l#9 9d#. 9"myd﹣y+eyd﹣y+- `9.$y. 9.*hmy&yl,y/)9.*d﹣yi{cya9.)9.*d﹣y. 9-&{l,y`g9h  9d#l,y+*n :)yi&.$y.y. 9.*.#yyg*9#mzghl,z(c9.B.#z/#9l#i&. 9&{oyk9$9&"y.axbcyl,y.#z  b9i&.g+9b9$9l,HBg`9+&bczghg`9+H9i&+g9+ B9. {BB]\HHBH\H\NBJH[Ν]NJHBB[\\XB[\\XB[\HB[\XYB[\\]BB\Y\BBY[]NBYHBYHHBYHYHB\H]X[[KX[[LL[BBl! 9.*"BYYNB^U\H\B\H	[K
\]XNTH
KN
IBXY\HPY	\HB\HH\X\]Y\^U\XY\HXY\B^T\H\X\[\JHB^TYH^T\XY

HBB\H\]]X^TYHB\H\[[HBY\OH	N	\OH	N	B^TYH^TYB[B^TYH^TYXJ	I[J	N	B[XTYH^TYXJ]NHBBoaYH[]!BNB幨!B^W]HHK\	III[XTYKB^W]HH^W]K
JHB^B[	S9c%+9b!;B]\[BBNBaykHB^W[HK\	]YH[[\H[I][XTYKB^W[H^W[
JHB^B[aykHS9c%+9b!;B]\[BB^W[H^W[\XHB^W[H^W[\XHBBef9`9. 9!9aykHBTYH]IΛ^W]K	[	Λ^W[HBBNB,:hmzgh.":/繣yc.gB[HK\	]\H\\\YI][XTYKB[H[˙
JHB繣yc.go."my/繣{.ykhmy..."y.*B^\HK[[
IYHHII[KBezd﹣HB\H^\VHB^\H^\VHB9."(z/c9:d﹣HB\H^\BBY\OH^\
NBYH[BB]\TYB^B[nz`﹣yc%+9b!HB]\[BB.b:/oy"BYYNBBH[H)	HB[HYBNB#9hmzghB^TYHY
HBBY^TYOH[B[	,z-){BYH[BB]HH^TY]I[J	N	B[H^TY[	[J	N	BB]J]H
B]J[
HB]J	BB[m"^TY]IBB^B[	繣y#ybyfj;BYH[BBJ
HBBY\
NB[I"BBY
HBBB[H."9$BBBKKKKKKKKKH9niyc!KKKKKKKKKKHB[HBKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHB9n!z+o9ck9B9+;B9/g: !{[\HB9'ML
B:+ ;]B9b&"y."io 9i"BKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKHBBB[I"y."iB][]
	B^PHY\
HB^P\

HBOB]B[Y[HZZ[Z[[^][KNKYLX
NM
XM
NL
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP