前些天突然想看一些小说,可能是因为压力大,所以就要有补偿机制吧。为了节省流量,就想着把内容爬下来,然后就可以在路上看了。于是有了下面的脚本。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests
from lxml import etree
# 为了解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
# 下面注释的三行在py2上可用,py3上无法找到reload(sys)方法
# import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')
pagerNum = 0
# 要保存的文件的名字
txtName = "斗罗大陆.txt"
# 网站链接的根地址
hostUrl = "https://www.zwdu.com"
# 这样写的原因是他的下一页是这样的格式
lastUrl = "/book/17251/4633486.html"
# 解析html并保存
def parsehtml(r):
global pagerNum # 这个是为了记录一共多少网页
global lastUrl # 下一页的url的后半部分
s = etree.HTML(r.text)
title = s.xpath('//*[@class="bookname"]/h1/text()')[0] # 获取title
print(title)
content = s.xpath('//*[@id="content"]/text()') # 获取每一页的小说内容
print(content)
nextUrl = s.xpath('//*[@class="bottem2"]/a[3]/@href') # 获取下一页url的后半部分url
lastUrl = nextUrl[0]
print(lastUrl)
# 以追加的形式打开文件
with open(txtName, 'a') as f:
f.write("\n")
# 添加.encode("utf-8") 是为了解决UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
f.write(title.encode("utf-8"))
f.write("\n")
for str in content:
f.write(str.encode("utf-8"))
pagerNum = pagerNum + 1
print(pagerNum) # 打印页数
def gethtml(url):
r = requests.get(url)
r.encoding = 'GB2312' # 设置编码格式
parsehtml(r)
if __name__ == "__main__":
while 'html' in lastUrl:
url = hostUrl + lastUrl # 拼接URL
print(url)
gethtml(url)
在写的过程中遇到一个问题
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
查了很多资料,解决方案都是代码中最上面注释掉的3行,但是,在py3上reload无法找到。内心很是崩溃,然后就换用了下面的方案。
所以:
py2上
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
一定要写在最前面
py3上
title.encode("utf-8")