• 学习使用pyquery解析器爬小说


    一、背景:个人喜欢在网上看小说,但是,在浏览器中阅读小说不是很方便,喜欢找到小说的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(" ")
            f.write(" ")
            f.write(text)
            f.write(" ")
            f.write(" ")
    f.close()
     
    五、爬取测试
    1、测试中发现,由于小说有1491个页面需要爬取,一次性全部爬取时,由于网络或其他原因,很难成功。会显示“requests.exceptions.ConnectionError”错误。
    2、考虑进行分段爬取,可通过修改count_begin和count_end变量的值来实现分段爬取。
     
    六、爬取程序运行显示(count_begin=6,count_end=10):

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

  • 相关阅读:
    安徽.NET俱乐部4月份活动图片
    C++ string和数字间的任意转换
    利用C++特性 析构对象(ScopeGuard.h)
    ffmpeg第三方库
    Apifox软件使用技巧
    工作流撤回(activity5)
    pom文件详解
    Java内部类详解成员内部类,局部内部类,匿名内部类,静态内部类
    Docker 详解
    JDK8 新特性 Lambda表达式
  • 原文地址:https://www.cnblogs.com/sfccl/p/11352561.html
Copyright © 2020-2023  润新知