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

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

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

from requests_html importHTMLSession as hsdefget_story(url):globalf

session=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')returnnextpagedefsearch_story():globalBOOKURLglobalBOOKNAME

haveno=[]

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()break

elif(haveno==[] and booklist!=[]):print("查找到{}本小说".format(len(booklist)))for book inbooklist:print(book.text,book.absolute_links)

search_story()break

else:print("查找到结果,小说链接:",r.url)

BOOKURL=r.url

BOOKNAME=booknamebreak

globalBOOKURLglobalBOOKNAME

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]globalf

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 importHTMLSession 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')

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

  1. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  2. python爬取数据的原理_Python爬虫原理

    前言 简单来说互联网是由一个个站点和网络设备组成的大网,我们通过浏览器访问站点,站点把HTML.JS.CSS代码返回给浏览器,这些代码经过浏览器解析.渲染,将丰富多彩的网页呈现我们眼前: 一.爬虫是什 ...

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

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

  4. python爬取大众点评数据_python爬虫实例详细介绍之爬取大众点评的数据

    python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python ...

  5. python爬取历史天气查询_Python爬虫实战-爬取历史天气数据

    最近项目需要对合肥市历史天气数据进行爬取,分析了几个天气数据网站,最终选择天气后报网站. 将实现过程遇到的问题以及下来,供以后参考. 步骤分析 这里我使用的是Python中的requests库Beau ...

  6. python爬取新闻后提炼_Python爬虫开发的3大难题,别上了贼船才发现,水有多深...

    写爬虫,是一个非常考验综合实力的活儿.有时候,你轻而易举地就抓取到了想要的数据:有时候,你费尽心思却毫无所获. 好多Python爬虫的入门教程都是一行代码就把你骗上了"贼船",等上 ...

  7. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  8. python爬取多页数据_python爬虫实现爬取同一个网站的多页数据代码实例

    本篇文章小编给大家分享一下python爬虫实现爬取同一个网站的多页数据代码实例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 一.爬虫的目的 从网上获 ...

  9. python爬取网上租房信息_Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 1.爬取租房标题 按照惯例,先来爬下标题试试水,找到标题,复制xpath. 多复制几个房屋 ...

最新文章

  1. Linux下SENDMAIL+OPENWEBMAIL(2)
  2. 如何用纯 CSS 创作一个荧光脉冲 loader 特效
  3. RabbitMQ实例教程:发布/订阅者消息队列
  4. IMAX影厅专候天神下凡 巨幕电影2010年观影指南
  5. c语言b20等于多少,C语言程序:温度DS19B20显示
  6. 【深入浅出精华版视频】-刘意day01-10思维导图整理
  7. SPSS使用命令语法之复制与粘贴讲解
  8. 2021年井冈山中学高考成绩查询入口,【高考成绩】2019年高考成绩揭晓,井冈山中学取得好成绩!...
  9. 游戏角色3d建模用什么软件
  10. arma找不到合适的模型_ARMA模型建模与预测指导
  11. Android肝帝战纪之网络请求框架封装(Retrofit的封装)
  12. NAACL2022信息抽取论文分类
  13. 倒置的方法//c++
  14. matlab 母小波,小波变换的定义.ppt
  15. 软件设计师考试 | 第五章 软件工程基础知识 | 系统设计
  16. 高位缩量横盘的实战价值
  17. 2019年5月17日A股暴跌行情思考
  18. CRM是什么意思?CRM管理软件选型必知的3大“要点”
  19. BLE蓝牙广播和扫描主要数据设置解析与总结
  20. echarts gl在地球上添加发光柱

热门文章

  1. Gmail Mobile 不可忽视的七个细节
  2. android.support.v7.widget.Toolbar 中menu图标不显示问题
  3. 电脑桌面里的计算机里的软件是啥,能够在电脑桌面贴便签纸的是什么软件?
  4. 导入EXCEL文件数据到数据库中
  5. cocosCreator 物理关节组件
  6. 三款主流云笔记软件比较
  7. 5G通信与物联网技术交流群
  8. imx53 QSB添加模拟I2C
  9. Pr 入门教程:如何为剪辑添加外观?
  10. 新概念英语第一册 学习笔记(001 - 002)