一、背景:个人喜欢在网上看小说,但是,在浏览器中阅读小说不是很方便,喜欢找到小说的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. Eugene and an array(边界麻烦的模拟)

    一道看似小学生的题,搞了我几个小时...... 首先思路就有两种: \(Ⅰ.找和为0的bad子串,再用n*(n+1)/2-bad子串得到答案\) \(Ⅱ.找和不为0的good子串\) 如果你选择找ba ...

  2. 【XR-3】核心城市(树直径)

    [XR-3]核心城市 这题真的难啊......... k个核心城市太麻烦,我们假设先找一个核心城市,应该放在哪里? \(任意取一个点,它的最远端是直径的端点.\) \(所以当这个点是直径的中点时,可以 ...

  3. 【Spark】SparkStreaming的容错机制

    文章目录 检查点机制 驱动器程序容错 工作节点容错 接收器容错 处理保证 检查点机制 Metadata checkpointing -- 将定义流计算的信息存入容错的系统如HDFS. Data che ...

  4. Openwrt:编译固件提示[mktplinkfw] error: images are too big 错误

    在编译mr3420的固件时,添加了luci.jamvm,但是最终编译的固件"openwrt-ar71xx-generic-tl-mr3420-v1-squashfs-factory.bin& ...

  5. 关于51单片机IO引脚的驱动能力与上拉电阻设计方案

    转载自:http://bbs.dianyuan.com/article/20312-2 单片机的引脚,可以用程序来控制,输出高.低电平,这些可算是单片机的输出电压.但是,程序控制不了单片机的输出电流. ...

  6. 设计模式之GOF23责任链模式

    责任链模式chain of responsibility 将能够处理同一类请求的对象连成一条链,所提交的请求依次在链上传递,直到传递至有能力处理该请求的对象,不能则传给链上下一个 场景: -打牌时 - ...

  7. python 基础知识3-列表元祖

    1.列表增. # append 追加,给列表的最后面追加一个元素 li = ['alex','wufa','太白','大白'] li.append('教师') li.append(1) print(l ...

  8. 简述SpringCloud框架

    1.什么是SpringCloud? SpringCloud是一系列框架的有序集合,它利用SpringBoot的开发便利性简化了分布式系统的开发,比如服务发现.服务网关.服务路由.链路追踪等.Sprin ...

  9. 封装组件el-upload通过v-model (一): 上传单张图片

    ElementUI 中的el-upload 上传图片 我进行了二次封装.(默认大家都是有一定的vue基础的,细节就不过多的讲了) 在项目中我们主要拿到图片或者其他的一些参数 ,我这里是上传后返回的Gu ...

  10. 格式转换工具:使用kgEncode转换压缩无损音乐

    在kugou安装目录下,有kgEncode目录,可以在各种格式中相互转换