今天和大家分享的是python爬虫实战,由于本人最近迷上了看网络小说,学生党又穷,只能看看网络dao版小说,现在这类dao版小说网站可以说非常的多,但是所有的网站进去都可以看见一大把的广告信息,非常影响我们的阅读体验,所以我打算将dao版小说网站的小说内容通过学习到的python爬虫技术爬取下来搭建自己的小说网站,有了今天的这篇文章。

第一步,选取目标:

对于目标网站的选取,我们作为以为忠实的小说迷,自然要选择小说更新速度快并且访问稳定的小说网站(dao版)进行数据爬取。“笔趣阁”作为现代dao版小说网站的始祖,我们通过百度搜索相关关键词,找到了目前百度排行第一的“笔趣阁”网站,

小编我只看穿越类型的小说,所以只选取了穿越类型的小说进行爬取。在我看来,爬取数据最重要的是思路,首先我们要明确我们爬取的思路,还好这种小说类型的网站网络页面都是非常的标准荷统一化,我们的大体思路如下:

第二步:爬虫的编写

根据我们上面思路,我们需要用到以下模块:

Requests模块,用于发送网络请求

Lxml的etree模块,格式化我们的网页数据,便于我们使用xpath提取网页数据

Retrying模块,由于网络延迟会造成我们的数据请求失败,使用retrying模块来重新发送我们的网络请求

Tips:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。Xpath教程:https://www.w3school.com.cn/xpath/index.asp,在百度上学习了一个小技巧,使用chrome浏览器的开发者功能,选取目标元素,在elements模块下面右键选中的模块可以直接将该元素的xpath地址复制出来。

1.       首先创建一个发送网络请求,返回标准网页数据的函数GetUrl,代码如下:

@retry(stop_max_attempt_number=5)def GetUrl(url):    respose = requests.get(url, timeout=5)    return etree.HTML(respose.content.decode())#定义一个获取URL内容,并且返回一个被lxml模块格式化标准网页数据

2.       定义我们的获取小说列表、小说章节以及章节内容的三个函数GetBookList,GetChapterList,GetContent代码如下:

def GetBookList(url):    content = GetUrl(url)    booklist = []    bookname = content.xpath("//*[@id='newscontent']/div[1]/ul/li[1]/span[1]/a/text()")[0]    print("开始采集《{}》".format(bookname))    for book in content.xpath("//*[@id='newscontent']/div[1]/ul/li"):        booklist.append(book.xpath("./span[1]/a/@href")[0])    return booklist#定义一个获取小说链接的函数def GetChapterList(url):    content = GetUrl(url)    chapterlist = []    for chapter in content.xpath("//*[@id='list']/dl/dd"):        chapterlist.append("http://www.xbiquge.la" + chapter.xpath("./a/@href")[0])    return chapterlist#定义一个获取小说章节的函数def GetContent(url):    temp = GetUrl(url)    chaptername=temp.xpath("//*[@class='bookname']/h1/text()")[0]    content = temp.xpath("//*[@id='content']/text()")    str = ""    for con in content:        str = str + con.replace("\r", "")    print(chaptername)    return str#定义一个获取小说章节内容的函数

根据以上的思路,我们的所有代码如下图所示

以上代码没有写保存函数,大家可以根据自己的需求把采集下来的数据保存到文本文件或是数据库,我们一保存为txt文本为例:

with open('{}.txt'.format(i), 'wb') as f:f.write(content)

便可按照小说的章节序号保存

模块解析

(1)     Requests模块:

1.       向网站发送请求:requests.get(url),requests.post(url),可以使用get和post方式向网站发送请求。如果用用post发送请求,则配置requests.post(url,data=post请求参数)的形式发送。

2.       可以自定义请求头信息,requests.get(url,headers=自定义请求头信息),可以自定义user-agent和cookie信息,来绕过网站的反爬手段。

3.       返回的响应正文不论什么类型,都可以用text获取。

(2)     lxml模块

此次我们运用的是lxml模块当中的etree,etree.HTML()可以用来解析字符串格式的HTML文档对象,将传进去的字符串转变成_Element对象。作为_Element对象,可以方便的使用getparent()、remove()、xpath()等方法。

(3)     Retrying模块

我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以我们用到retrying模块,被修饰的函数执行失败会自动重新执行。

stop_max_attempt_number:最大重试次数,超过这个次数会停止重试,并报异常。

wait_random_min:随机等待最小时间。

wait_random_max:随机等待最大时间。

第三,软件的实际运行:

爬虫运行效果截图

本来可以一直开着我们的脚本在后台运行,但是运行一会儿我们发现脚本就报错停止了,研究了一番我们才发现由于对方访问有IP过滤的反爬措施,所以这里我们需要将我们的爬虫加入自动切换代理IP的功能。我们的requests模块支持代理功能,在网上找找几个代理,按照如下方式加入我们的代理到爬虫代码当中:

proxy_dict = {    "http": "http://username:password@hogehoge.proxy.jp:8080/",    "https": "http://username:password@hogehoge.proxy.jp:8080/"}#引入我们爬虫程序需要使用的模块@retry(stop_max_attempt_number=5)def GetUrl(url):    respose = requests.get(url, timeout=5,proxies=proxy_dict)    return etree.HTML(respose.content.decode())

至此我们的小说爬虫便可以一直在电脑上运行了,今天的分享也到此结束,由于是爬虫新手,文章中有错误的地方也希望大家指出和谅解,谢谢大家。

本期作者:汪苏彬

python网络爬虫_Python爬虫实战之网络小说相关推荐

  1. python pipeline框架_Python爬虫从入门到放弃(十六)之 Scrapy框架中Item Pipeline用法...

    原博文 2017-07-17 16:39 − 当Item 在Spider中被收集之后,就会被传递到Item Pipeline中进行处理 每个item pipeline组件是实现了简单的方法的pytho ...

  2. python从入门到爬虫_python爬虫从入门到放弃(一)之初识爬虫

    什么是爬虫? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引. ...

  3. 爬虫python名词解释_python爬虫

    Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以轻松实现网络爬虫功能. Pyth ...

  4. python 爬虫_python爬虫技术汇总

    爬虫技术 一.什么是网络爬虫: 网络爬虫(web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人.其目的一般为编纂网络索引. 二.爬虫分类: 主要分为以下三类: ...

  5. monthy python爬虫_Python爬虫DOTA排行榜爬取实例(分享)

    Python爬虫DOTA排行榜爬取实例(分享) 1.分析网站 打开开发者工具,我们观察到排行榜的数据并没有在doc里 doc文档 在Javascript里我么可以看到下面代码: ajax的post方法 ...

  6. python科技限制_Python爬虫怎么突破限制?经常遇到这四种限制突破方法

    Python爬虫常常用于搜索引擎,也可以进行数据的采集,现在很多企业都需要通过爬虫进行数据的采集,来分析市场的变化,同行的情况,还可以进行价格的对比等等.但是你的同行并不想让你获得这些信息,会在网站上 ...

  7. 51自学网python爬虫_Python爬虫基本流程

    爬虫定义 爬虫是请求网站并提取自己所需要数据的过程.通过我们的程序,可以代替我们向服务器发送请求,然后进行批量的数据下载. 爬虫基本流程 发起请求 通过url向服务器发送requests请求,请求可以 ...

  8. python爬虫与数据分析实战27_Python网络爬虫与文本数据分析

    原标题:Python网络爬虫与文本数据分析 课程介绍 在过去的两年间,Python一路高歌猛进,成功窜上"最火编程语言"的宝座.惊奇的是使用Python最多的人群其实不是程序员,而 ...

  9. python网络编程爬虫_Python爬虫--网络编程

    Python 网络编程 Python提供两个基本的Socket模块: Socket,提供了标准的BSD Sockets API SocketServer, 提供了服务器中心类,可以简化网络服务器的开发 ...

最新文章

  1. 数学图形(2.8)Viviani曲线
  2. .Net 3.5新特性(1)Automatic Properties, Object Initializers, and Collection Initializers
  3. AI顶会,正在使用AI来审阅AI论文
  4. Github排序(转载)
  5. python数组分成两个和相等的子集_前端面试2
  6. HTTP协议—状态码(思维导图速查)
  7. 算法系列之二十三:离散傅立叶变换之音频播放与频谱显示
  8. 电商峰值系统架构设计
  9. JavaScript实现浏览器特定区域截屏和下载功能
  10. 4种方法解决鼠标反应慢(迟钝)
  11. oracle vm virtualbox增强功能,VirtualBox增强功能包下载
  12. LED闪烁 闪灯芯片IC 手电筒IC 闪灯控制IC 闪烁IC流水灯
  13. java计算机毕业设计物流站环境监测系统源码+系统+数据库+lw文档+mybatis+运行部署
  14. R语言并行计算beta-NTI值
  15. mtd分区创建linux,浅析linux下mtd设备onenand存储器的分区和节点创建流程及yaffs2文件系统挂载...
  16. 计算机打数据执行保护删除不掉,运行某应用程序时,出现数据执行保护 (DEP)提示的解决方案...
  17. Linux内核LED模块分析(二)
  18. 随机生成学号和成绩并排序
  19. 谷歌与Oracle:Java版权大战现在牵扯到美国总统奥巴马
  20. 在LINUX用玩英杰传曹操传

热门文章

  1. Fashion-MNIST数据集离线加载办法
  2. 1042. Shuffling Machine (20)
  3. (JAVA)格式化输出日期
  4. list python 转tensor_Pytorch--Tensor, Numpy--Array,Python--List 相互之间的转换。
  5. 使用说明 思迅收银系统_使用自助收银系统让消费者自助结算更便捷高效?
  6. java将数据生成csv文件
  7. 可持久化线段树学习笔记
  8. 145. Binary Tree Postorder Traversal
  9. TPLink 备份文件bin文件解析
  10. 【整理】强化学习与MDP