抓取网页生成电子书(在线阅读网站URL的规律编程实现的关键(图) )

优采云 发布时间: 2021-11-19 19:12

  抓取网页生成电子书(在线阅读网站URL的规律编程实现的关键(图)

)

  @1. 你必须知道的常识:

  许多网站提供在线阅读书籍,但不提供这些书籍的下载,并且有些页面受Javascript保护甚至不允许复制。但是下载这些书籍并不太难,只需要一个小程序。

  @2.注意在线阅读网站URL的规则,这是编程的关键:

  一个一个的把网页捡起来放到txt里,首先要找到网页网址的规则。

  以本书为例《成长比成功更重要》——新浪阅读链接为:[]

  点击这个栏目,它的地址是[]

  点击它的第二部分,地址又是[]

  ......

  点击它的最后一段,地址是[]

  很容易验证它们的地址都是连续的数字,所以很容易通过编程来自动生成链接地址,只需使用一个递增的数字来生成地址。

  @3. 下载页面的编程实现:

  Python 中有 urllib 包。导入它。有 urllib.open('#39;)。该函数返回一个文件对象。你只需要用返回的文件对象调用read()方法,它就会返回一个字符串

  @4. 在得到的页面中,按html标签找到对应的文字内容:

  read() 得到的页面是一个字符串。使用这个字符串的find()方法来查找对应文本内容从nIdxBeg开始到nIdxEnd结束的位置。您可以轻松地使用字符串切片 strContent[nIdxBeg:nIdxEnd] 来拦截页面。你想要的部分

  @5. 把你想要截取的部分全部保存到一个文件中。

  @6. 最后写一个程序读取前面写的文件,用string函数去掉html标签,然后把处理过的html标签的内容写到另一个“电子书成品”文件中:

  先写一个字典(dict),将要替换的字符串写入这个字典,然后使用for循环,迭代使用str的replace()方法,将字典中对应的每一项放入字典中 替换每一个记录的html标签用对应的字符串,写在“完成的文件”——另一个txt中,就大功告成了。

  将代码贴在这里以供参考。如果稍微修改变量值,您可以将其他页面作为电子书下载:

  -------------------------------------------------- -------------------------------------------------- --------------

  makeBook.py 下载页面并截取需要的部分(title 和文章 内容,分别由getTitle 和getContent 两个函数获取),写入文件out.txt。

  -------------------------------------------------- -------------------------------------------------- --------------

  nBeg = 30970

nEnd = 31082

strPrefix = 'http://vip.book.sina.com.cn/book/chapter_41187_'

strSurfix = '.html'

strTitleBeg = """"""

strTitleEnd = """"""

strContentBeg = """"""

strContentEnd = """"""

fout = file('out.txt', 'w')

import urllib

def makeUrl(i):

"""Make the url with a number"""

return strPrefix + str(i) + strSurfix

def getContent(strPage):

nIdxBeg = strPage.find(strContentBeg)

nIdxEnd = strPage.find(strContentEnd, nIdxBeg + len(strContentBeg))

if nIdxBeg == -1 or nIdxEnd == -1:

print 'Content Not Found!'

return ''

elif nIdxBeg > nIdxEnd:

print 'Content begin index larger than end index.'

return ''

else:

return strPage[nIdxBeg + len(strContentBeg): nIdxEnd]

def getTitle(strPage):

nIdxBeg = strPage.find(strTitleBeg)

nIdxEnd = strPage.find(strTitleEnd, nIdxBeg + len(strTitleBeg))

if nIdxBeg == -1 or nIdxEnd == -1:

print 'Title Not Found!'

return ''

elif nIdxBeg > nIdxEnd:

print 'Title begin index larger than end index.'

return ''

else:

return strPage[nIdxBeg + len(strTitleBeg): nIdxEnd]

def processPage(strPage):

fout.write(getTitle(strPage))

fout.write('\n\n')

fout.write(getContent(strPage))

fout.write('\n- - - - - - - - - - - - - - - - - - - - - - - - - - -\n\n')

def writeBook():

for i in range(nBeg, nEnd):

print 'Downloading file ' + str(i)

strUrl = makeUrl(i)

nRetry = 3

strPage = ''

while nRetry:

try:

strPage = urllib.urlopen(strUrl).read()

break

except:

nRetry -= 1

continue

if not nRetry:

print 'Failed downloading file ' + str(i)

fout.write('\n\n/#####' + str(i) + '#####\\\\\\n\n')

else:

processPage(strPage)

if __name__ == '__main__':

writeBook()

fout.close()

  -------------------------------------------------- -------------------------------------------------- --------------

  formatTxt.py 处理前面生成的“out.txt”文件中的html标签,然后将格式化的内容写入“formated.txt”

  -------------------------------------------------- -------------------------------------------------- --------------

  matRep = {&#39;<p>&#39;:&#39;    &#39;, &#39;&#39;:&#39;\n\n&#39;}

def formatTxt(strContent):

    for i in matRep:

        strContent = strContent.replace(i, matRep[i])

    return strContent

if __name__ == &#39;__main__&#39;:

    strContent = file(&#39;out.txt&#39;, &#39;r&#39;).read()

    file(&#39;formated.txt&#39;, &#39;w&#39;).write(formatTxt(strContent))

</p>

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线