python网络爬虫_Python爬虫实战之网络小说

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

      第一步,选取目标:

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

f39847119726db116250cec622b2a404.png

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

1528ba5743d44e649f6b83dfe604e6f4.png

     第二步:爬虫的编写

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

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#定义一个获取小说章节内容的函数

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

059e5f1ca1aca951f3fbb58ad190725f.png

以上代码没有写保存函数,大家可以根据自己的需求把采集下来的数据保存到文本文件或是数据库,我们一保存为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:随机等待最大时间。

第三,软件的实际运行:

爬虫运行效果截图

0752a024c67aaf1b4b49b5ee5e617adb.pngf4e799b8260c93c1a6ad55aa21431748.pngeeb8cd6c457cf2c9bbb99423165ff9f1.png

     本来可以一直开着我们的脚本在后台运行,但是运行一会儿我们发现脚本就报错停止了,研究了一番我们才发现由于对方访问有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())

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

7eb292385fd511313e2c8d9bee17f376.png

本期作者:汪苏彬

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434133.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java反射机制详解_JAVA反射机制详解_JSP/Java编程_互联网开发技术网_传播最新的编程技术_php361.com...

今天,下午在和朋友聊天的时候,聊起了反射这个话题。我们就从下面这个段简单的代码开始吧。这个代码输出什么,想必大部分的读者跟我一样,会很快地知道答案:0 1 2 3 4 5 6 7 8 9。事实也是如此:朋友这个时候就…

activity 点击后传递数据给fragment_Fragment 新特性 : Fragment Result API 使用以及源码分析

原标题: Android Fragments: Fragment Result原文地址: https://proandroiddev.com/android-fragments-fragment-result......原文作者: Husayn Hakeem今年 Google 推出了 Fragment Result API 和 Activity Results API,用来取代之前的 Activity 和 Fragment 之间通…

android卡片层叠效果_ReactNative之Android绝对布局position:#x27;absolute#x27;问题

工作中会遇到各种各样的问题,ReactNative开发也是填坑不止。比如最近在开发需求中,就遇到一个问题。在一个卡片类型的右上角添加一个删除按钮。使用了绝对布局position:absolute属性,在Android上却无法正常显示,很是烦恼。有一个相…

敏捷开发的6个实战经验

在大型企业中经常是各种软件开发模式混用,一些采用敏捷开发,一些则是采用传统的瀑布式或RUP(统一软件开发过程)。敏捷开发,相对传统软件开发模式,它主要是针对快速变化的需求,不断优化管理流程&…

java 正则匹配括号是否成对_十分钟学会正则表达式

正则表达式用处挺广的,主要用于处理字符串。正则引擎想要在计算机语言中使用正则表达式,那么这门计算机语言必须要利用正则引擎去实现相应的正则库。主要的正则引擎分为以下两类:DFA 确定性的状态机。不使用”回溯”,效率高&#…

android token机制_你真的了解16.6ms刷新机制吗?

阅读本文前,请您先点击上面的蓝色字体“Android扫地僧”,“关注”后再点击置顶公众号,优质干货,重磅资源第一时间送达。散人丶https://juejin.im/post/5ce686a46fb9a07ec754f470前言之前在整理知识的时候,看到android屏…

dfa2.java 原理_DFA编程练习2

题目: 请设计DFA, 使其接受全部含有奇数个1的串, 假定 ∑ {0, 1}.解:DFA可能出现两个个状态:qeven: 读入了偶数个1的串.qodd: 读入了奇数个1的串, 该状态也是终结状态(accept state).它们的状态转移图如下:编写程序, 运行效果如下:测试用例说明:0000不被上图的DFA接受1111不被…

fread读取整个文件_qt如何实现大文件的加载和显示

最近研究了下如何用qt的原生控件来加载和显示大文件(>1G),分享下一些摸索经验。下文源码:compilelife/loginsight​github.com文件的内存映射在开始qt部分之前,我们先了解一个概念——文件的内存映射。我们知道一般…

linux内核编译及添加系统调用(hdu)_浅谈关于Linux内核write系统调用操作的原子性

Linux系统的write调用到底是不是原子的。网上能搜出一大堆文章,基本上要么是翻译一些文献,要么就是胡扯,本文中我来结合实例来试着做一个稍微好一点的回答。先摆出结论吧。结论包含两点,即write调用不能保证什么以及write调用能保…

java 判断对象为控制_Java流程控制

Java流程控制1、Scanner对象①java.util.Scanner是Java5的新特性,可以通过Scanner类来获取用户的输入。②基本语法:1 Scanner snew Scanner(System.in);③通过next()和nextLine()方法接受用户输入,通过hasNext()和hasNextLine()方法来判断用户…

directx最终用户运行时_运维定位服务故障时,前5分钟都在忙啥?

遇到服务器故障,问题出现的原因很少可以一下就想到。我们基本上都会从以下步骤入手,这些也是绝大多数运维工程师在定位故障时前几分钟的主要排查点:一、尽可能搞清楚问题的前因后果不要一下子就扎到服务器前面,你需要先搞明白对这…

IDE--ubuntu下安装 Source insight

2013-06-03 09:05 74人阅读 评论(0) 收藏 举报 习惯了在source insight下编辑阅读源码,在linux下用vi总是用不好 ,还是在ubuntu上用回熟悉的source insight。 在ubuntu中,安装windows程序用wine,然后用wine安装windows软件即可。…

python中什么是数据驱动_利用Python如何实现数据驱动的接口自动化测试

前言 大家在接口测试的过程中,很多时候会用到对CSV的读取操作,本文主要说明Python3对CSV的写入和读取。下面话不多说了,来一起看看详细的介绍吧。 1、需求 某API,GET方法,token,mobile,email三个参数 token为必填项 mo…

密码锁 java接口_从synchronized和lock区别入手聊聊java锁机制

写这篇文章之前,我去百度了一下啥叫锁,百度百科上写道:置于可启闭的器物上,以钥匙或暗码开启。确实我们一般理解的锁就是门锁,密码锁,但是在计算机科学中,锁又是啥,说实话&#xff0…

lua 给userdata设置元表_lua学习之复习汇总篇

第六日笔记1. 基础概念程序块定义在 lua 中任何一个源代码文件或在交互模式中输入的一行代码程序块可以是任意大小的程序块可以是一连串语句或一条命令也可由函数定义构成,一般将函数定义写在文件中,然后用解释器执行这个文件换行在代码中不起任何作用&a…

集群服务负载均衡------LVS

个人的理解,以一种通俗易懂的方式讲述出来,如果有哪些地方说的不正确的话,希望大家留言指出来。笔者会非是常的感谢! Cluster服务器集群,直接理解为一些单一的服务器的集合通过某种方式组合起来,为客户端提…

tomcat jsp导入java_[导入]Tomcat JSP Web 开发中的乱码问题小姐

1. 静态页面的乱码问题文件的编码和浏览器要显示的编码不一致。1) 检查文件原始的编码, 可以用记事本打开, 然后选择另存为来看;2) 给当前页面加入一个指令来建议浏览器用指定的编码来显示文件字符内容.3) 如果系统是英文XP,没装东亚字符集支持, 也会显示乱码.2. JSP 页面的乱码…

四大开源分布式存储_ipfs分布式存储行业面临着四大主要风险,你知道是哪些吗?...

为了响应国家号召、推动分布式存储技术落地、防御行业风险,中国分布式存储产业联盟启动,全国从事IPFS以及分布式存储从业者对行业风险及联盟成立的必要性达成了高度共识,目前有36家以上的IPFS分布式存储行业企业填写了联盟申请表。几位国内知…

pjsua帮助手册(中文)

原文地址 : http://www.pjsip.org/pjsua.htm 介绍 PJSUA是一个开源的命令行SIP用户代理(软电话),用PJSIP协议,PJNATH,和PJMEDIA实现。 它虽然只有很简单的命令行界面,但是功能齐全。 SIP功能: 多…

js date转成 时间字符串_秋招快要开始了,前端笔试中的坑位-JS隐式转换问题

我们在写笔试题的时候,经常碰到涉及隐式转换的题目,例如"1" 2 obj 1 [] ![] [null] false 和 叫做严格运算符,对象类型指向地址相同或原始类型( 数值、字符串、布尔值)值相同;叫做相等运算…