从某些网站看小说的时候经常出现垃圾广告,一气之下写个爬虫,把小说链接抓取下来保存到txt,用requests_html全部搞定,代码简单,容易上手.

中间遇到最大的问题就是编码问题,第一抓取下来的小说内容保持到txt时出现乱码,第二url编码问题,第三UnicodeEncodeError

先贴源代码,后边再把思路还有遇到的问题详细说明。

from requests_html import HTMLSession as hsdef get_story(url):global fsession=hs()r=session.get(url,headers=headers)r.html.encoding='GBK'title=list(r.html.find('title'))[0].text#获取小说标题nr=list(r.html.find('.nr_nr'))[0].text#获取小说内容nextpage=list(r.html.find('#pb_next'))[0].absolute_links#获取下一章节绝对链接nextpage=list(nextpage)[0]if(nr[0:10]=="_Middle();"):nr=nr[11:]if(nr[-14:]=='本章未完,点击下一页继续阅读'):nr=nr[:-15]print(title,r.url)f.write(title)f.write('\n\n')f.write(nr)f.write('\n\n')return nextpagedef search_story():global BOOKURLglobal BOOKNAMEhaveno=[]booklist=[]bookname=input("请输入要查找的小说名:\n")session=hs()payload={'searchtype':'articlename','searchkey':bookname.encode('GBK'),'t_btnsearch':''}r=session.get(url,headers=headers,params=payload)haveno=list(r.html.find('.havno'))#haveno有值,则查找结果如果为空booklist=list(r.html.find('.list-item'))#booklist有值,则有多本查找结果while(True):if(haveno!=[] and booklist==[]):print('Sorry~!暂时没有搜索到您需要的内容!请重新输入')search_story()breakelif(haveno==[] and booklist!=[]):print("查找到{}本小说".format(len(booklist)))for book in booklist:print(book.text,book.absolute_links)search_story()breakelse:print("查找到结果,小说链接:",r.url)BOOKURL=r.urlBOOKNAME=booknamebreakglobal BOOKURL
global BOOKNAME
url='http://m.50zw.net/modules/article/waps.php'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.99'
}search_story()
chapterurl=BOOKURL.replace("book","chapters")
session=hs()
r=session.get(chapterurl,headers=headers)
ch1url=list(r.html.find('.even'))[0].absolute_links#获取第一章节绝对链接
ch1url=list(ch1url)[0]
global f
f=open(BOOKNAME+'.txt', 'a',encoding='gb18030',errors='ignore')
print("开始下载,每一章节都需要爬到,速度快不了,请等候。。。。\n")
nextpage=get_story(ch1url)
while(nextpage!=BOOKURL):nextpage=get_story(nextpage)
f.close

爬虫思路及遇到的问题分析如下:

先查找小说,并且把小说链接抓取下来,以网站http://m.50zw.net/modules/article/waps.php为例,首先在浏览器中打开链接并且右键点检查,选择Network标签,我用的是chrome浏览器,按F1设置把Network底下的Preserve log勾选上,方便接下来查找log,以搜索‘帝后世无双’为例,搜索到结果后直接跳到了此本小说的url:http://m.50zw.net/book_86004/

查看到请求方式是GET,Request URL是 http://m.50zw.net/modules/article/waps.php?searchtype=articlename&searchkey=%B5%DB%BA%F3%CA%C0%CE%DE%CB%AB&t_btnsearch=

然后分析出请求参数有三个,searchtype先固定用图书名来查找,而searchkey我们输入的是”敌后世无双“,url encoding成了%B5%DB%BA%F3%CA%C0%CE%DE%CB%AB,我们在python ide里边分别输入:

"敌后世无双".encode('GBK'):b'\xb5\xd0\xba\xf3\xca\xc0\xce\xde\xcb\xab'

"敌后世无双".encode('utf-8'):b'\xe6\x95\x8c\xe5\x90\x8e\xe4\xb8\x96\xe6\x97\xa0\xe5\x8f\x8c'

对照输出结果我们知道这里url编码采用的是GBK

接下来我们用代码来验证我们分析的结果

from requests_html import HTMLSession as hs
url='http://m.50zw.net/modules/article/waps.php'
payload={'searchtype':'articlename','searchkey':'帝后世无双','t_btnsearch':''}
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.170 Safari/537.36 OPR/53.0.2907.99'
}
session=hs()
r=session.get(url,headers=headers,params=payload)
print(r.url)

运行结果:

http://m.50zw.net/modules/article/waps.php?searchtype=articlename&searchkey=%E5%B8%9D%E5%90%8E%E4%B8%96%E6%97%A0%E5%8F%8C&t_btnsearch=

比较得到的url跟我们刚才手动输入后得到的url有出入,代码里边如果没有指定编码格式的话了这里url编码默认是urf-8,因为编码问题我们没有得到我们想要的结果,那接下来我们修改代码指定编码试试

payload={'searchtype':'articlename','searchkey':'帝后世无双'.encode('GBK'),'t_btnsearch':''}

这回运行结果得到我们想要的url:

http://m.50zw.net/book_86004/

好,成功了!!!

那接下来我们要获取第一章节的链接,中间用到了requests_html来抓取绝对链接

bookurl='http://m.50zw.net/book_86004/'
chapterurl=bookurl.replace("book","chapters")
session=hs()
r=session.get(chapterurl,headers=headers)
ch1url=list(r.html.find('.even'))[0].absolute_links
ch1url=list(ch1url)[0]
print(ch1url)

运行结果:

http://m.50zw.net/book_86004/26127777.html

成功取得第一章节链接

接下来我们开始获取小说内容并且获取下一章链接直到把整本小说下载下来为止,

在这个部分遇到UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 46:illegal multibyte sequence,这个问题最终在用open函数打开txt时加两个参数解决encoding='gb18030',errors='ignore'.

在之前也用过另外一种方案,就是把u'\xa0'替换成跟它等效的u' ',虽然解决了'\xa0'的error,可是后来又出现了’\xb0'的error,总不能出现一个类似的rror就修改代码替换一次,所以这个方案被放弃掉.

session=hs()
r=session.get(ch1url,headers=headers)
title=list(r.html.find('title'))[0].text
nr=list(r.html.find('.nr_nr'))[0].text
##nr=nr.replace(u'\xa0',u' ')
nextpage=list(r.html.find('#pb_next'))[0].absolute_links
nextpage=list(nextpage)[0]
if(nr[0:10]=="_Middle();"):nr=nr[11:]
if(nr[-14:]=='本章未完,点击下一页继续阅读'):nr=nr[:-15]
print(title,r.url)
print(nextpage)
f=open('帝后世无双.txt', 'a',encoding='gb18030',errors='ignore')
f.write(title)
f.write('\n\n')
f.write(nr)
f.write('\n\n')

转载于:https://www.cnblogs.com/springyun/p/9300474.html

Python爬虫中文小说网点查找小说并且保存到txt(含中文乱码处理方法)相关推荐

  1. python爬取小说出现乱码_Python爬虫中文小说网点查找小说并且保存到txt(含中文乱码处理方法)...

    从某些网站看小说的时候经常出现垃圾广告,一气之下写个爬虫,把小说链接抓取下来保存到txt,用requests_html全部搞定,代码简单,容易上手. 中间遇到最大的问题就是编码问题,第一抓取下来的小说 ...

  2. Python爬虫鲁迅先生《经典语录》保存到Excel表格(附源码)

    Python爬虫鲁迅先生<经典语录>保存到Excel表格(附源码) 前言 今天用Python 爬取鲁迅先生<经典语录>,直接开整~ 代码运行效果展示 开发工具 Python版本 ...

  3. python输出print到txt-pycharm实现print输出保存到txt文件

    程序比较大,运行时间又长的时候,不想等着结果,只要先确保程序功能正确无误,可以把需要的结果print然后保存到TXT文件中,超级方便 # 创建一个txt文件,文件名为mytxtfile def tex ...

  4. Python爬虫:正则表达式的应用以及数据保存到excel表

    上一节学习了如何解析网页,说白了就是怎么将一个html文件中的信息提取出来,当然这需要有一定的html基础,这样对于一些标签的使用更加的容易和方便一些.解析来要学习的内容就是上节提到的比较常用而且比较 ...

  5. Python爬虫爬取纵横中文网小说

    Python爬虫爬取纵横中文网小说 学了一周的爬虫,搞了这个东西,自己感觉还不错,有什么问题可以提一提哈 目标:纵横中文网-完本-免费小说 网址:http://book.zongheng.com/st ...

  6. python爬虫下载小说_用PYTHON爬虫简单爬取网络小说

    用PYTHON爬虫简单爬取网络小说. 这里是17K小说网上,随便找了一本小说,名字是<千万大奖>. 里面主要是三个函数: 1.get_download_url() 用于获取该小说的所有章节 ...

  7. Python爬虫练习 爬取网络小说保存到txt

    原文链接:https://yetingyun.blog.csdn.net/article/details/107916769 创作不易,未经作者允许,禁止转载,更勿做其他用途,违者必究. 利用 Pyt ...

  8. Python爬虫之爬取网络小说并在本地保存为txt文件

    Python爬虫之爬取网络小说并在本地保存为txt文件 注:本文使用软件为Sublime Text,浏览器为谷歌浏览器 (新手小白第一次写,写得不好请见谅) **1.**首先找到想要爬取的小说章节目录 ...

  9. 用PYTHON爬虫简单爬取网络小说

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资 ...

最新文章

  1. android服务之录音功能
  2. http header 具体解释
  3. oracle怎么删除lob对象,Oracle系列:LOB大对象处理
  4. 数据结构与算法2——数组
  5. 度盘转存工具 v1.8
  6. ajaxGet 获取封装
  7. SSM项目启动报错More than one fragment with the name [spring_web] was found. This is not legal with relativ
  8. [转]SQL:JOIN用法
  9. Open Graphics Library初步_搭建环境_GLUT
  10. Python+OpenCV:交互式图像前景提取(Interactive Foreground Extraction using GrabCut Algorithm)
  11. OpenCV探索之路(六):图像变换——霍夫变换
  12. 车机常用adb 命令总结
  13. 扫盲:什么是steam令牌验证器?哪些行为会触发steam交易限制
  14. 汉语词频统计工具java_中文分词词频统计工具_python 结巴_Java开源中文分词类库分类列表...
  15. cadence Allegro17.2关闭start page 界面方法
  16. C# 解析种子文件(bt文件)
  17. 配置网络拓扑图测试软件,网络工程师必备系列课程专题(数据恢复+RAID配置+画拓扑图)...
  18. SEO:让网站收录更好的十个方法 网站一直不被收录怎么办
  19. 文明5 java 英_文明5模组“Future Worlds”(未来世界)中英版补丁
  20. 字符转ASII码以及大小写之间的转换

热门文章

  1. 极路由2hc5761刷华硕固件_极路由2_hc5761_mt7620刷openwrt实现NDR客户端拨号and开机自启动and内网无法访问...
  2. 华为手机打开html文件,华为手机必须打开的6个功能,让你手机顺滑流畅,再用3年也不卡!...
  3. c语言课程设计电影选座,C语言课程设计电影院座位分配(1).doc
  4. Kali安装VMware Tools,解决“安装VMware Tools”灰色按钮问题
  5. 告诉你C盘里的每个文件夹都是干什么用的
  6. 使用ReadyFor4GB
  7. ktv服务器系统调试,张启东:KTV效果器如何调试参数?(音响系统测试)
  8. 巴士拉银匠哈桑的故事(四)
  9. 最优化理论-线性规划中的大M法的步骤
  10. MATLAB保存当前视图的图像为PDF