热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Python爬取妙笔阁小说信息并保存为TXT和CSV格式

本文介绍了如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。主要内容包括如何构造请求头以避免被网站封禁,以及如何利用XPath解析HTML并提取所需信息。

本文介绍如何使用Python爬取妙笔阁小说网仙侠系列中所有小说的信息,并将其保存为TXT和CSV格式。首先,打开妙笔阁小说网仙侠系列的页面,可以看到如下所示的小说列表。

小说列表

我们需要爬取的信息包括小说的书名、作者、最新更新时间和简介。为了防止网站禁止爬取,需要构造请求头,模拟浏览器访问网站。

构造请求头

在想要爬取的页面按F12,然后点击Network,按F5刷新,随便点击进入一个请求,找到User-Agent字段,如下图所示。

User-Agent
user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
headers = {'User-Agent': user_agent}

发送请求并解析HTML

使用requests库发送HTTP请求,并将响应内容转换为HTML格式。

respOnse= requests.get("http://www.mbige.com/bookstore/xianxia/default-0-0-0-0-0-0-1.html")
response.encoding = response.apparent_encoding
html = lxml.html.fromstring(response.text)

解析HTML并保存为TXT文件

利用XPath解析HTML,提取所需信息并写入TXT文件。

with open("E:/xiaoshuo.txt", 'a+', encoding='utf8') as f:
    divlst = html.xpath('//div[@id="alistbox"]')
    for i in divlst:
        title = ''.join(i.xpath('.//h2/a/text()'))
        author = ''.join(i.xpath('.//div[@class="title"]/span/text()'))
        newest = ''.join(i.xpath('.//li/a/text()'))
        intro = ''.join([x.strip('\n') for x in i.xpath('.//div[@class="intro"]/text()') if x])
        f.write(str(title) + '\n' + str(author) + '\n' + str(newest) + '\n' + str(intro) + '\n\n')

完整代码(保存为TXT格式)

import requests
import lxml.html

class myspider:
    def __init__(self):
        user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
        self.headers = {'User-Agent': user_agent}
    
    def gethtml(self, url):
        try:
            respOnse= requests.get(url)
        except:
            respOnse= None
        else:
            response.encoding = 'gb18030'
        finally:
            html = lxml.html.fromstring(response.text)
        return html
    
    def getpage(self, url):
        with open("E:/xiaoshuo.txt", 'a+', encoding='utf-8') as f:
            html = self.gethtml(url)
            divlst = html.xpath('//div[@id="alistbox"]')
            for i in divlst:
                title = ''.join(i.xpath('.//h2/a/text()'))
                author = ''.join(i.xpath('.//div[@class="title"]/span/text()'))
                newest = ''.join(i.xpath('.//li/a/text()'))
                intro = ''.join([x.strip('\n') for x in i.xpath('.//div[@class="intro"]/text()') if x])
                f.write(str(title) + '\n' + str(author) + '\n' + str(newest) + '\n' + str(intro) + '\n\n')

if __name__ == '__main__':
    sp = myspider()
    url1 = 'http://www.mbige.com/bookstore/xianxia/default-0-0-0-0-0-0-{0}.html'
    for num in range(1, 161):
        url = url1.format(num)
        sp.getpage(url)
        print(str(num) + "page")

保存为CSV格式

保存为CSV格式只需在上述代码中增加几行代码。

import requests
import lxml.html
import csv

class myspider:
    def __init__(self):
        user_agent = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'
        self.headers = {'User-Agent': user_agent}
    
    def gethtml(self, url):
        try:
            respOnse= requests.get(url)
        except:
            respOnse= None
        else:
            response.encoding = 'gb18030'
        finally:
            html = lxml.html.fromstring(response.text)
        return html
    
    def getpage(self, url):
        with open("E:/xiaoshuo.csv", 'a+', encoding='utf-8') as f:
            f1 = csv.writer(f)
            f1.writerow(['书名', '作者', '最新更新', '简介'])
            html = self.gethtml(url)
            divlst = html.xpath('//div[@id="alistbox"]')
            for i in divlst:
                title = ''.join(i.xpath('.//h2/a/text()'))
                author = ''.join(i.xpath('.//div[@class="title"]/span/text()'))
                newest = ''.join(i.xpath('.//li/a/text()'))
                intro = [x.strip('\n') for x in i.xpath('.//div[@class="intro"]/text()') if x]
                f1.writerow([str(title), str(author), str(newest), str(intro)])

if __name__ == '__main__':
    sp = myspider()
    url1 = 'http://www.mbige.com/bookstore/xianxia/default-0-0-0-0-0-0-{0}.html'
    for num in range(1, 161):
        url = url1.format(num)
        sp.getpage(url)
        print(str(num) + "page")

得到的xiaoshuo.csv文件内容如下:

CSV文件内容

如果打开CSV文件时出现乱码,可以使用Notepad++打开文件,修改编码后再打开。

修改编码

推荐阅读
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 本文介绍了如何使用JavaScript的Fetch API与Express服务器进行交互,涵盖了GET、POST、PUT和DELETE请求的实现,并展示了如何处理JSON响应。 ... [详细]
  • 本文探讨了如何在 F# Interactive (FSI) 中通过 AddPrinter 和 AddPrintTransformer 方法自定义类型(尤其是集合类型)的输出格式,提供了详细的指南和示例代码。 ... [详细]
  • 本文详细介绍了一种通过MySQL弱口令漏洞在Windows操作系统上获取SYSTEM权限的方法。该方法涉及使用自定义UDF DLL文件来执行任意命令,从而实现对远程服务器的完全控制。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 主板IO用W83627THG,用VC如何取得CPU温度,系统温度,CPU风扇转速,VBat的电压. ... [详细]
  • 本文介绍了如何在 Node.js 中使用 `setDefaultEncoding` 方法为可写流设置默认编码,并提供了详细的语法说明和示例代码。 ... [详细]
  • HTML5 表单新增属性详解
    本文深入探讨了HTML5中表单的新增属性,帮助读者全面掌握这些新特性。内容涵盖autocomplete、autofocus、list等常用属性,并详细解释了form、novalidate、enctype和accept-charset等高级属性的功能与应用场景。 ... [详细]
  • 深入解析Java虚拟机(JVM)架构与原理
    本文旨在为读者提供对Java虚拟机(JVM)的全面理解,涵盖其主要组成部分、工作原理及其在不同平台上的实现。通过详细探讨JVM的结构和内部机制,帮助开发者更好地掌握Java编程的核心技术。 ... [详细]
  • 本文详细介绍了 Java 中 org.geotools.data.shapefile.ShapefileDataStore 类的 getCurrentTypeName() 方法,并提供了多个代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文介绍 Java 中如何使用 Year 类的 atMonth 方法将年份和月份组合成 YearMonth 对象,并提供代码示例。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
author-avatar
手机用户2502941293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有