文字爬虫

  • 1.爬虫的行为
  • 2.项目设计
  • 3.获取静态网页的html代码
  • 4.获取下一章的url
  • 5.获取小说的章节名字
  • 6.获取小说正文
  • 7.保存章节小说
  • 8.合并临时文件
  • 9.主程序
  • 10.总结

首先看下目标网页:
这个就是本次测试的小说书籍:

这是正文部分:

url:http://www.xbiquge.la/13/13959/5939025.html

1.爬虫的行为

从初始网页中获取下一个网页的链接;
然后从当前网页获取目标信息。

2.项目设计

文字爬虫的项目分析:
1.输入:
带有目标文字的网站url
2.输出:
符合要求的所有目标文字文件(txt)

项目流程:
1.获取第一个网站的HTML
2.获取baseUrl
3.获取next
4.组装nextUrl
5.放入全局Queue

6.获取网站的HTML
7.获取目标文字
8.目标文字格式化

9.目标文字写入文件(mini.txt)

10.文件合并(mini.txt->all.txt)
11.mini.txt删除

13.为了提高效率,mini.txt就是缓存(100个文件/50个文件一组)

其中抽取:
1.url->HTML
2.HTML->nextUrl
3.HTML->str
4.全局Queue
5.str->mini.txt
6.mini.txt->all.txt
7.del nimi.txt

3.获取静态网页的html代码

import requestsdef getHtml(url):header = {'Accept': "*/*",'accept-encoding': "gzip, deflate",'Connection': "keep-alive",'Accept-Language' : 'zh-CN,zh;q=0.9','User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}if url is not None and url.strip() != '':response = requests.request('GET', url = url.strip(), headers = header, timeout = 60)response.encoding = 'utf-8'return response.text

这里用到了python的requests库,所以需要安装requests库
安装requests库也是非常的简单:

或者更简单的直接import requests,然后requests会报错,在idea的ide下,使用alt+回车,选择下载requests库,让ide去下载第三方库。
第三方库安装后再python的sdk的安装目录的下面:


所以如果发现找不到第三方库
在project中看下工作空间的sdk

然后看下sdk的package信息

如果发现没有第三方库,有时需要等待一段时间,或者重启,让ide扫描package信息。

言归正传,如何测试获取静态网页的html方法是否正确呢?

在方法的下面直接进行测试:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Cache-Control" content="no-siteapp" />
<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>圣墟 第二章 后文明时代_玄幻小说_新笔趣阁</title>
<meta name="keywords" content="圣墟, 第二章 后文明时代" />
<meta name="description" content="新笔趣阁提供了辰东创作的玄幻小说《圣墟》干净清爽无错字的文字章节: 第二章 后文明时代在线阅读。" />
<link rel="stylesheet" type="text/css" href="http://www.xbiquge.la/images/biquge.css"/>
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="http://www.xbiquge.la/images/bqg.js"></script><script type="text/javascript">
<!--
var preview_page = "index.html";
var next_page = "5939026.html";
var index_page = "index.html";
var article_id = "13959";
var chapter_id = "5939025";
function jumpPage() {var event = document.all ? window.event : arguments[0];if (event.keyCode == 37) document.location = preview_page;if (event.keyCode == 39) document.location = next_page;if (event.keyCode == 13) document.location = index_page;
}
document.onkeydown=jumpPage;
-->
</script></head>
<body><div id="wrapper"><script>login();</script><div class="header"><div class="header_logo"><a href="http://www.xbiquge.la">新笔趣阁</a></div><script>bqg_panel();</script></div><div class="nav"><ul><li><a href="http://xbiquge.la/">首页</a></li><li><a href="/modules/article/bookcase.php">我的书架</a></li><li><a href="/xuanhuanxiaoshuo/">玄幻小说</a></li><li><a href="/xiuzhenxiaoshuo/">修真小说</a></li><li><a href="/dushixiaoshuo/">都市小说</a></li><li><a href="/chuanyuexiaoshuo/">穿越小说</a></li><li><a href="/wangyouxiaoshuo/">网游小说</a></li><li><a href="/kehuanxiaoshuo/">科幻小说</a></li><li><a href="/paihangbang/">排行榜单</a></li><li><a href="/xiaoshuodaquan/">全部小说</a></li></ul></div><div class="content_read"><div class="box_con"><div class="con_top"><script>textselect();</script><a href="/">新笔趣阁</a> &gt; <a href="/fenlei/1_1.html">玄幻小说</a> &gt; <a href="http://www.xbiquge.la/13/13959/">圣墟</a> &gt;  第二章 后文明时代                </div><div class="bookname"><h1> 第二章 后文明时代</h1><div class="bottem1"><a href="javascript:;" onclick="showpop_vote(13959);">投推荐票</a> <a href="/13/13959/">上一章</a> &larr; <a href="http://www.xbiquge.la/13/13959/">章节目录</a> &rarr; <a href="/13/13959/5939026.html">下一章</a> <a href="javascript:;" onclick="showpop_addmark(13959,5939025);">加入书签</a></div><div id="listtj">&nbsp;推荐阅读:<a href="/2/2699/" target="_blank">妖神记</a>、<a href="/2/2210/" target="_blank">全职法师</a>、<a href="/2/2208/" target="_blank">霸皇纪</a>、<a href="/13/13959/" target="_blank">圣墟</a>、<a href="/7/7246/" target="_blank">神藏</a>、<a href="/7/7004/" target="_blank">遮天</a>、<a href="/15/15409/" target="_blank">牧神记</a>、<a href="/0/183/" target="_blank">官道无疆</a>、<a href="/0/215/" target="_blank">魔天记</a>、<a href="/0/218/" target="_blank">我欲封天</a>、<a href="/7/7552/" target="_blank">万古神帝</a>、<a href="/9/9419/" target="_blank">一念永恒</a>、<a href="/0/381/" target="_blank">天域苍穹</a>、<a href="/0/993/" target="_blank">唐砖</a>、<a href="/10/10489/" target="_blank">三寸人间</a></div></div><table style="width:100%; text-align:center;"><tr><td><script>read_1_1();</script></td><td><script>read_1_2();</script></td><td><script>read_1_3();</script></td></tr></table>
<br />&nbsp;&nbsp;&nbsp;&nbsp;书评区非常火热,也有很多人飘红,谢谢大家的热情,谢谢所有书友。<br /><br /><p><a href="http://koubei.baidu.com/s/xbiquge.la" target="_blank">亲,点击进去,给个好评呗,分数越高更新越快,据说给新笔趣阁打满分的最后都找到了漂亮的老婆哦!</a><br />手机站全新改版升级地址:http://m.xbiquge.la,数据和书签与电脑站同步,无广告清新阅读!</p></div><script>read3();</script><script>bdshare();</script><div class="bottem2"><a href="javascript:;" onclick="showpop_vote(13959);">投推荐票</a> <a href="/13/13959/">上一章</a> &larr; <a href="http://www.xbiquge.la/13/13959/">章节目录</a> &rarr; <a href="/13/13959/5939026.html">下一章</a> <a href="javascript:;" onclick="showpop_addmark(13959,5939025);">加入书签</a></div><script>read4();</script><div id="hm_t_54219"></div></div></div><div class="footer"><div class="footer_link">&nbsp;新书推荐:<a href="/23/23756/" target="_blank">万能卡牌带我飞</a>、<a href="/23/23755/" target="_blank">抗战之无敌战神</a>、<a href="/23/23754/" target="_blank">逆罪而行</a>、<a href="/23/23753/" target="_blank">阴阳先生奇谈</a>、<a href="/23/23752/" target="_blank">烈火救赎</a></div><div class="footer_cont"><script>footer();right();dl();</script><!--<script>mark();</script>--><div class="reader_mark1"><a href="javascript:;" onclick="showpop_addmark(13959,5939025);"></a></div><div class="reader_mark0"><a href="javascript:;" onclick="showpop_vote(13959);"></a></div></div></div></div>
</body>
<script charset="utf-8" src="http://www.baidu.com/js/opensug.js"></script>
<script>(function(){var bp = document.createElement('script');bp.src = '//push.zhanzhang.baidu.com/push.js';var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(bp, s);})();
</script>
</html>

4.获取下一章的url

通过对静态网页的html的分析发现,或者更简单一些:使用浏览器的检查功能:
在网页中按ctrl+shitf+I(谷歌浏览器)

然后切换到


但是这个地址是相对地址,是相对网站的地址,并不是绝对地址,不能直接访问:

网站的地址可以直接在代码中定义,也可以通过logo获取。
至此,获取下一个网页的url的所有的信息都找到了,那么如何在html中找到呢?

网站的地址比较简单,直接在class为header_logo的div标签的a标签内。
div内也只有一个a标签。

相对地址的获取也比较简单,首先能获取到class为bottem1的div标签。
说明一下,使用的是Jquery的选择器的方法获取节点。
所以获取有属性,id等等的节点比较容易。
获取到div后获取所有的a标签,然后取html输出文字为"下一章"的a标签的href属性值即可。

def getNextUrl(soup):baseTag = soup.select("div[class='header_logo'] > a")if len(baseTag):baseTag = baseTag.pop()nextTag = soup.select("div[class='bottem2'] > a")for oneTag in nextTag:if oneTag.text == '下一章' and oneTag['href'].endswith('.html'):return baseTag['href'] + oneTag['href']

这里输入参数是一个BeautifulSoup的对象。
我们还需要根据html代码获取目标小说文字,所以需要在Main程序中持有这个soup对象。soup对象就是根据一定的规则解析html代码后的一个对象。
操作这个对象可以进行节点的查找等等。
所以测试的时候需要导入这个库。
因为我使用的是python3,对应的BeautifulSoup是bs4这个库
这个库同样需要下载,下载代码:
pip install bs4
下载完成后增加如下代码进行测试:

按住ctrl+shift+f10直接运行python
会发现有异常,这是因为我们没有指定解析的方式,但是这个类库非常的强大,及时没有指定解析的模式,也能成功的解析,但是为了不输出异常信息,所以还是指定一下解析方式(具体请参考官方文档(有中文语言的文档))

我们拷贝这个地址到浏览器验证

完全正确。

5.获取小说的章节名字

小说的章节名字,是一章小说的精髓所在,所以,如果看小说不看章节名,或者章节名字不怎么好,那么整个小说就会看的比较迷茫。
所以,小说的章节也需要正确的获取。
采用同样的方式进行获取章节名字:

class为bookname的节点下第一个h1标签(也是唯一一个)

def getTitle(soup):fictionTag = soup.select("div[class='bookname'] > h1")if len(fictionTag):fictionTag = fictionTag.pop()return fictionTag.text

6.获取小说正文

获取小说正文就最简单了

直接根据id获取div节点,然后获取输出文字即可。
但是,一章完整的小说应该还包括章节名字,所以这里需要把章节名字加入。

from GetTitle import getTitledef getFiction(soup):fictionTag = soup.select('#content')if len(fictionTag):fictionTag = fictionTag.pop()result = '\n\n\n' + getTitle(soup) + '\n\n\n'result += fictionTag.textreturn result


这里有一个比较坑爹的地方:
调试结果如上:

实际输出结果

感觉有些信息被丢失了,所以输出结果与预期不同,不要惊慌,静下心来,慢慢调试。

7.保存章节小说

之前就说过,因为I/O的速度比较慢,所以为了防止文件被占用的问题(此项目中不存在,因为是单线程项目)
使用了缓冲文件的机制。
让每一章都用单独的临时文件保存,当所有的文件全部下载完成后,在进行文件的合并。

def saveFiction(fiction, filePath):if fiction is not None and fiction.strip() != '':file = open(filePath, 'w', encoding='utf-8')file.write(fiction)file.close()

这里输入的是带有章节名字的小说正文,和临时文件的存储路径和存储名字。


8.合并临时文件

import osdef mergeFile(filePath1, filePath2):if filePath1 is not None and filePath1.strip() != '' and \filePath2 is not None and filePath2.strip() != '':file1 = open(filePath1, 'a', encoding = 'utf-8')file2 = open(filePath2, 'r', encoding = 'utf-8')file1.write(file2.read())file1.close()file2.close()os.remove(filePath2)

这里用到了os模块,os模块是Python标准库中就有的,所以无需下载

9.主程序

现在我们完成了静态网页文字爬虫的所有模块,那么,如何把这些模块合并到一起呢?
现在各个模块的代码已经完成,所以可以注释或者删除各个模块内部的测试代码
首先主程序组织所有的模块就需要把所有的模块加入:

然后为了友好的进行交互:

这里采用了全局队列的处理方式:
首先把初始连接url加入全局的url队列中:

创建临时文件夹

输出进度信息

然后临时文件也需要一个全局队列

把临时文件目录放入缓冲队列。
临时文件名字生成:
当前网页的url的哈希值
当所有的章节都下载完成后,合并临时文件(合并临时文件后会删除临时文件)


合并完所有的临时文件后会删除临时文件夹。
这个项目因为最后一章是回去不到下一章的链接的,所以需要用try——except处理。

整个项目需要输入三个参数:
1.目标url(只能是此站点,其余站点需要适当修改)
2.小说文件存放目录(临时文件存放目录)
3.小说存储名字(自定义名字)

10.总结

总体来说,使用Python做爬虫比使用java做爬虫简单一些,特别是第三方库的丰富,大大的减轻了做爬虫时重复造轮子的过程。
但是Python确实比较慢(可能与获取网站的网页html速度有直接关系)

最后,附上github地址:https://github.com/a18792721831/StudyPython.git

Python静态网页爬虫----文字小说爬虫相关推荐

  1. python 静态网页_Python静态网页爬虫相关知识

    想要开发一个简单的Python爬虫案例,并在Python3以上的环境下运行,那么需要掌握哪些知识才能完成一个简单的Python爬虫呢? 爬虫的架构实现 爬虫包括调度器,管理器,解析器,下载器和输出器. ...

  2. Python带进度条的小说爬虫(笔趣网爬小说—简约版)

    Python带进度条的小说爬虫(笔趣网爬小说-简约版) 准备: BeautifulSoup.selenium.PhantomJS 注意PhantomJS安装方式 这里附上安装方式连接: https:/ ...

  3. python手机壁纸超清_详解Python静态网页爬取获取高清壁纸

    前言 在设计爬虫项目的时候,首先要在脑内明确人工浏览页面获得图片时的步骤 一般地,我们去网上批量打开壁纸的时候一般操作如下: 1.打开壁纸网页 2.单击壁纸图(打开指定壁纸的页面) 3.选择分辨率(我 ...

  4. Python 使用requests实现网络小说爬虫案例(一)

    一.简介 网络爬虫,也叫网络蜘蛛(Web Spider).它根据网页地址(URL)爬取网页内容,而网页地址(URL)就是我们在浏览器中输入的网站链接.比如:www.baidu.com,它就是一个URL ...

  5. 怎么用python扒网页?新手入门爬虫第一篇!

    python爬虫网页的基本流程: 首先选取一部分精心挑选的种子URL. 将这些URL放入待抓取URL队列. 从待抓取URL队列中读取待抓取队列的URL,解析DNS,并且得到主机的IP,并将URL对应的 ...

  6. python打开网页被禁止_Python爬虫被禁?看看是不是这几个问题

    Python爬虫在网上完成网站的信息采集时,常常出现无缘无故的ip被禁的情况,正爬取呢就没法继续了,造成日常业务也没办法正常进行了,整个人都不好了呢.一部分人完全不清楚被禁的原因,这么简单的就给禁掉了 ...

  7. python 小说爬虫_小说爬虫python

    在线观看多费劲呀,不如爬下来看 小说网站地址:http://www.quanshuwang.com/ 分析: 第一种方法: 首先随便打开一个小说章节详情页,比如莽荒记 发现这个详情页,居然包含了所有章 ...

  8. python登录网页后打印_python爬虫中文网页cmd打印出错问题解决

    问题描述 用python写爬虫,很多时候我们会先在cmd下先进行尝试. 运行爬虫之后,肯定的,我们想看看爬取的结果. 于是,我们print... 运气好的话,一切顺利.但这样的次数不多,更多地,我们会 ...

  9. python爬网页源码_python爬虫爬取网页的内容和网页源码不同?

    可以看到这里id为k_total的元素值不同,爬出来是1,网页源码是55. 附还未完成的代码:import requests from bs4 import BeautifulSoup import ...

最新文章

  1. 使用Rainbow tables和Ophcrack的组合工具破解Windows密码
  2. mysql数据库未启动失败_mysql数据库启动失败
  3. 当 IDENTITY_INSERT 设置为 OFF 时,不能为表中的标识列插入显式值
  4. QT中循环显示图片和简单的显示图片
  5. DataTable新增列设置DefaultValue问题。
  6. 网约车司机无证最低罚款拟从10000元降至200元
  7. vijos 1464 积木游戏 DP
  8. 车辆撞人有全险但是是全责,车主不愿出钱垫付医药费,该怎么办?
  9. 计算机应用基本技能题库,计算机应用基本技能技能考试题库.pdf
  10. mysql中exists 和 in的用法你还真不知道
  11. 小米蓝牙耳机使用说明_小米10手机专用?小米“真无线蓝牙耳机Air 2s”评测
  12. BUUCTF:[WUSTCTF2020]alison_likes_jojo
  13. unity-光照烘焙GI简单应用
  14. 联想小新V1000外接R9-380显卡
  15. 产生调幅波的几种方法
  16. H5表单validity各个属性对应
  17. 并发编程--线程池原理
  18. LeetCode 1053
  19. android使用其他应用打开方式,Android 启动activity的4种方式及打开其他应用的activity的坑...
  20. android之网络状态判断(wifi和移动网络数据)

热门文章

  1. 2019年第十届蓝桥杯程序设计大赛国赛C++大学B组题解
  2. tableau高级绘图(八)-tableau绘制渐变图
  3. 51nod 1430:奇偶游戏 博弈
  4. 为什么3A信用评级证书与投标工作息息相关呢?
  5. 郑伟峰谈:房地产企业应当全面“触网”,逐步摆脱渠道绑架
  6. java excel截图
  7. 晶能转债,正元转02上市价格预测
  8. sort 单条件多条件排序
  9. 工作生活中容易存在的缺点
  10. BurpSuite使用详解(四)Scanner功能