抓取网页生成电子书(在线阅读网站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 = {'<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>