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

优采云 发布时间: 2022-01-27 23:23

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

)

  @1.必知常识:

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

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

  要把网页一个一个刮下来放到txt里,首先要找到网页URL的规则。

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

  点击序列的部分,它的地址是[]

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

  ……

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

  很容易验证它们的地址都是连续的数字,因此很容易编程自动生成链接地址,只需使用递增的数字生成地址即可。

  @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 下载页面并截取需要的部分(标题和文章内容,分别通过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人工客服


线