抓取网页生成电子书(在线阅读网站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 = {'<p>':' ', '':'\n\n'}
def formatTxt(strContent):
for i in matRep:
strContent = strContent.replace(i, matRep[i])
return strContent
if __name__ == '__main__':
strContent = file('out.txt', 'r').read()
file('formated.txt', 'w').write(formatTxt(strContent))
</p>