一、背景:个人喜欢在网上看小说,但是,在浏览器中阅读小说不是很方便,喜欢找到小说的txt版下载到手机上阅读,但是有些小说不太好找txt版本,考虑自己从网页上爬一爬,自己搞定小说的txt版本。正好学习一下有关爬虫技术。
二、环境及爬取目标
1、linux centos7系统
2、小说网站:http://www.xbiquge.la/15/15158 ,小说名称《汉乡》。
三、爬取思路
1、爬取目录页面,生成小说章节标题和链接网址形成的字典。
2、根据上一步得到的字典中的章节链接网址,逐一爬取各章节内容,并写入预设的txt文件中。
四、代码实现(代码文件名称:test2.py)
#-*- coding:utf-8 -*-
import requests
from pyquery import PyQuery as pq

s = requests.session()
catalog_url="http://www.xbiquge.la/15/15158/" 
#小说目录页面链接
novelname="汉乡_test2.txt"   
#需要生成的小说文件名
count_begin=1   #爬取的起始章节号
count_end=1491 
#爬取的结束章节号。在浏览器调试页面的console(控制台),使用命令$("dd").size()得到所有dd标签的数量为1491。

#获取网页内容
def get_html(url):
    headers =
{
   
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0)
Gecko/20100101 Firefox/68.0",
   
'Accept':"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",

'Referer':"http://www.xbiquge.la/",
   
'Host':"www.xbiquge.la",
   
'Connection':"keep-alive"
}             
#headers字典内容从小说目录页面浏览器调试器中获取
    r =
s.get(url,headers=headers,verify=False)
    r.encoding =
'utf-8'  
    return
r.text

#解析目录页面,返回“标题:章节链接”字典
def parse_catalog(html):
   
doc=pq(html)

catalog={}
    for i in
range(count_begin,
count_end+1):  
#range()为左闭右开,故括号右边界应设为count_end+1

       
url = "http://www.xbiquge.la" + str(doc("#list > dl >
dd:nth-child(" + str(i) + ") >
a").attr('href'))  
#“#list”表示名称为list的ID选择器。
       
title = doc("#list > dl > dd:nth-child(" + str(i) + ") >
a").text()
       
catalog[title] = url
    return
catalog

#解析章节页面,获取页面文字内容
def parse_html(html):
   
doc=pq(html)
   
text=doc("#content").text()  
#获取ID选择器为content的文字内容

    return
text

catalog_html=get_html(catalog_url)
catalog=parse_catalog(catalog_html)
#print(catalog)

'''

#调试用代码段,用于显示获取的小说章节内容
for title, url in catalog.items():
   
html=get_html(url)
   
text=parse_html(html)
   
print(text)
'''
with open(novelname, mode="a", encoding="utf-8") as
f:

for title,
url in catalog.items():
       
html=get_html(url)
       
text=parse_html(html)
       
print("正在下载-----------", title)
       
f.write(title)
       
f.write("\r\n")
       
f.write("\r\n")
       
f.write(text)
       
f.write("\r\n")
       
f.write("\r\n")
f.close()

 
五、爬取测试
1、测试中发现,由于小说有1491个页面需要爬取,一次性全部爬取时,由于网络或其他原因,很难成功。会显示“requests.exceptions.ConnectionError”错误。
2、考虑进行分段爬取,可通过修改count_begin和count_end变量的值来实现分段爬取。
 
六、爬取程序运行显示(count_begin=6,count_end=10):

(base) [python@ELK ~]$ python test2.py
正在下载----------- 第六章破茧
正在下载----------- 第七章穿衣为礼?
正在下载----------- 第八章生死?小事耳!
正在下载----------- 第九章努力成为一个贱人
正在下载----------- 第十章徐夫人的手艺

学习使用pyquery解析器爬小说的更多相关文章

  1. 学习使用re做解析器爬小说

    一.背景:近期学习python爬虫中看到,在对网页内容进行解析的技术中,re正则表达式工具也是一个很好的工具,使用re编制爬虫工具正好熟悉re正则表达式的使用. 二.环境及爬取目标 1.linux c ...

  2. day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等

     DjangoRsetFramework学习---restful规范,解析器组件,Postman等           本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...

  3. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  4. Boost学习之语法解析器--Spirit

    Boost.Spirit能使我们轻松地编写出一个简单脚本的语法解析器,它巧妙利用了元编程并重载了大量的C++操作符使得我们能够在C++里直接使用类似EBNF的语法构造出一个完整的语法解析器(同时也把C ...

  5. springMVC学习 七 视图解析器

    在springMVC中,如果不配置视图解析器,会走默认的视图解析器,但是有时候配置视图解析器,还有一定的作用 <bean id="viewResolver" class=&q ...

  6. 【P4语言学习】Parser解析器

    参考文章:王垠:谈谈Parser 簡單介紹 P4 語言(一)- Parser 什么是Parser 传统的parser,一般出现在编译器和编译原理课程中,援引<谈谈Parser>的定义: 首 ...

  7. 学习SpringMVC——说说视图解析器

    各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~) 相信大家在昨天那篇如何获取请求参数篇中都已经领略到了spring mvc注 ...

  8. vert.x学习(四),使用模板解析器ClassLoaderTemplateResolver

    在vert.x中使用模板解析,可以为我们带来很多方便.我这里学习了一下ClassLoaderTemplateResolver的简单使用.这次工程配置与上篇一样,不需要做任何多的配置.直接编写代码就可以 ...

  9. DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等

    DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...

随机推荐

  1. Lasso回归

    Lasso 是一个线性模型,它给出的模型具有稀疏的系数(sparse coefficients).它在一些场景中是很有用的,因为它倾向于使用较少参数的情况,能够有效减少给定解决方案所依赖变量的个数.因 ...

  2. SpringData Redis的简单使用

    SpringDate Redis是在Jedis框架的基础之上对Redis进行了高度封装,通过简单的属性配置就可以通过调用方法完成对Redis数据库的操作,而且SpringData Redis使用了连接 ...

  3. Spring官网阅读(十二)ApplicationContext详解(中)

    文章目录 1.Spring的资源(Resource) 接口简介 UML类图 抽象基类AbstractResource FileSystemResource AbstractFileResolvingR ...

  4. Python学习之字符串中的下标和切片以及逆序

    python中的下标从0开始 从后往前取 注意:后面的2代表步长,先看2:-1取出来的数值 [起始位置:终止位置:步长] 逆序 但是发现如果[-1:0:-1]发现是取不到第一个元素的,那么怎么办? 此 ...

  5. Java实现栈(链表和线性表两种方法实现)

    一.栈的介绍 任何数据结构都是一种规则 栈就是在最基础的结构--线性结构和链式结构上面定义规则形成的 如果对基本数据结构(线性表和链表)有疑问的同学可以看我之前的博客:https://www.cnbl ...

  6. 【Hadoop离线基础总结】MapReduce增强(上)

    MapReduce增强 MapReduce的分区与reduceTask的数量 概述 MapReduce当中的分区:物以类聚,人以群分.相同key的数据,去往同一个reduce. ReduceTask的 ...

  7. 字节码编程,Byte-buddy篇一《基于Byte Buddy语法创建的第一个HelloWorld》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 相对于小傅哥之前编写的字节码编程: ASM.Javassist 系列,Byte Bu ...

  8. Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig

    文章目录 目标 drivers/Kconfig demo下的Kconfig 和 Makefile Kconfig Makefile demo_gpio.c 目标 Kernel:Linux 4.4 我编 ...

  9. 移动端纯css超出盒子出现横向滚动条

    <!doctype html> <html> <head> <meta charset="utf-8"> <meta name ...

  10. CSS解决border影响元素宽高的问题(box-sizing属性)

    修改 box-sizing 属性.将 box-sizing 设置为 border-box 即可.