Python爬虫教程使用Scrapy框架爬取小说代码示例

Python爬虫教程使用Scrapy框架爬取小说代码示例是一篇讲解如何使用Scrapy爬虫框架爬取小说网站的教程。在这个过程中,包括创建Scrapy项目、编写爬虫代码、解析HTML页面、提取数据等步骤,下面我将一一进行详细讲解。

1. 创建Scrapy项目

首先,我们需要创建一个Scrapy项目,使用命令行进入想要存储项目的目录下,然后执行以下命令:

scrapy startproject novel

这会创建一个名为novel的项目文件夹,其中包含一些Scrapy框架所需要的文件。

2. 定义Spider爬虫

接下来,我们需要定义一个Spider爬虫,该爬虫会根据我们在代码中提供的规则进行网页爬取。

例如,我们可以定义一个名为NovelSpider的Spider爬虫,用于爬取某个小说网站上的小说列表页。执行以下命令:

scrapy genspider NovelSpider novel.com

这将会在novel/spiders目录下创建一个名为NovelSpider.py的文件,我们在该文件中定义具体的爬虫逻辑。

3. 编写爬虫代码

在NovelSpider.py文件中,我们需要编写一些代码,用于定义爬虫的逻辑和规则,包括设置请求头、解析页面、提取数据等。

具体来说,我们要做以下几件事情:

  • 设置请求头,避免被反爬虫机制识别:
# settings.py中添加
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'

# NovelSpider.py文件中添加
class NovelSpider(scrapy.Spider):
    name = "novel"
    allowed_domains = ["novel.com"]
    start_urls = ["http://www.novel.com/"]

    headers = {
        'User-Agent': USER_AGENT
    }
  • 解析页面,提取数据:
class NovelSpider(scrapy.Spider):
    # ...

    def parse(self, response):
        novels = response.xpath('//ul[@class="novels-list"]/li')
        for novel in novels:
            item = NovelItem()
            item['title'] = novel.xpath('h4/a/text()').extract_first().strip()
            item['author'] = novel.xpath('p[@class="author"]/a/text()').extract_first().strip()
            item['intro'] = novel.xpath('p[@class="intro"]/text()').extract_first().strip()
            yield item

在这段代码中,我们使用xpath解析页面,并使用extract_first()方法提取第一个匹配的结果,从而得到小说的标题、作者和简介。

4. 存储数据

爬取到的数据并没有直接显示在页面上,而是存储在了内存中。为了将这些数据存储到本地或是数据库中,我们需要自定义处理管道。

可以在settings文件中设置数据库相关的信息,例如这里我使用MySQL数据库存储爬虫数据:

# settings.py中添加
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_DBNAME = 'novel_db'
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'

# NovelSpider.py文件中添加
import pymysql.cursors

class NovelPipeline(object):
    def __init__(self):
        self.connection = pymysql.connect(
            host=MYSQL_HOST,
            port=MYSQL_PORT,
            user=MYSQL_USER,
            password=MYSQL_PASSWD,
            db=MYSQL_DBNAME,
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
        self.cursor = self.connection.cursor()

    def process_item(self, item, spider):
        sql = "INSERT INTO novel (title, author, intro) VALUES (%s, %s, %s)"
        self.cursor.execute(sql, (item['title'], item['author'], item['intro']))
        self.connection.commit()
        return item

    def close_spider(self, spider):
        self.connection.close()

在这段代码中,我们首先在__init__()方法中建立数据库连接,然后在process_item()方法中将爬取到的数据插入到数据库中,最后在close_spider()方法中关闭数据库连接。

5. 运行爬虫

至此,我们已经完成了Scrapy爬虫程序的编写,接下来需要运行该程序进行小说网站的爬取。

在命令行中执行以下命令即可启动爬虫:

scrapy crawl novel

输出结果:

2018-10-17 09:59:03 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: novel)
2018-10-17 09:59:03 [scrapy.utils.log] INFO: Versions: lxml 4.2.5.0, libxml2 2.9.8, cssselect 1.0.3, parsel 1.5.1, w3lib 1.19.0, Twisted 18.7.0, Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56) [MSC v.1900 64 bit (AMD64)], pyOpenSSL 18.0.0 (OpenSSL 1.1.0i  14 Aug 2018), cryptography 2.3.1, Platform Windows-10-10.0.17134-SP0
2018-10-17 09:59:03 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'novel', 'NEWSPIDER_MODULE': 'novel.spiders', 'ROBOTSTXT_OBEY': True, 'SPIDER_MODULES': ['novel.spiders']}
2018-10-17 09:59:03 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2018-10-17 09:59:03 [scrapy.middleware] INFO: Enabled downloader middlewares:
['scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware',
 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
 'scrapy.downloadermiddlewares.retry.RetryMiddleware',
 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware',
 'scrapy.downloadermiddlewares.stats.DownloaderStats']
2018-10-17 09:59:03 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2018-10-17 09:59:03 [scrapy.middleware] INFO: Enabled item pipelines:
['novel.pipelines.NovelPipeline']
2018-10-17 09:59:03 [scrapy.core.engine] INFO: Spider opened
2018-10-17 09:59:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.novel.com/robots.txt> (referer: None)
2018-10-17 09:59:04 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.novel.com/> (referer: None)
2018-10-17 09:59:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.novel.com/>
{'title': '神兵传奇', 'author': '梁羽生', 'intro': '江湖上流传着许多关于兵器的神话传说,有传说…'}
2018-10-17 09:59:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.novel.com/>
{'title': '天龙八部', 'author': '金庸', 'intro': '蒙古可汗儿完颜洪熙在围攻襄阳的战争中被华山大小姐殷…'}
2018-10-17 09:59:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.novel.com/>
{'title': '笑傲江湖', 'author': '金庸', 'intro': '于湘西遇见了一个名叫程灵素,他被这个秀丽的女子所吸引…'}
2018-10-17 09:59:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.novel.com/>
{'title': '鹿鼎记', 'author': '金庸', 'intro': '明朝天启元年,陕西自来水集团总经理陆游炜来到了李鸿…'}
2018-10-17 09:59:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.novel.com/>
{'title': '射雕英雄传', 'author': '金庸', 'intro': '南宋年间,金国入侵中国领土。英雄人物郭靖和黄蓉联手终于…'}
2018-10-17 09:59:04 [scrapy.core.scraper] DEBUG: Scraped from <200 http://www.novel.com/>
{'title': '倚天屠龙记', 'author': '金庸', 'intro': '天龙寺遗失了《九阳真经》,僧人们认为失落已久的真经正是一…'}
2018-10-17 09:59:04 [scrapy.core.engine] INFO: Closing spider (finished)
2018-10-17 09:59:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 423,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 29831,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 2,
 'dupefilter/filtered': 6,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 10, 17, 1, 59, 4, 752210),
 'item_scraped_count': 6,
 'log_count/DEBUG': 9,
 'log_count/INFO': 7,
 'log_count/WARNING': 1,
 'request_depth_max': 1,
 'response_received_count': 2,
 'scheduler/dequeued': 2,
 'scheduler/dequeued/memory': 2,
 'scheduler/enqueued': 2,
 'scheduler/enqueued/memory': 2,
 'start_time': datetime.datetime(2018, 10, 17, 1, 59, 3, 921501)}
2018-10-17 09:59:04 [scrapy.core.engine] INFO: Spider closed (finished)

以上输出结果表明已成功通过爬虫程序获取到了小说的相关信息,并将其存储到了MySQL数据库之中。

示例1:爬取豆瓣Top250电影

以豆瓣Top250电影为例,创建Spider爬虫的代码如下:

import scrapy

class DoubanSpider(scrapy.Spider):
    name = "douban"
    allowed_domains = ["douban.com"]
    start_urls = ["https://movie.douban.com/top250"]

    def parse(self, response):
        for movie in response.xpath('//div[@class="hd"]'):
            title = movie.xpath('a/span/text()').extract_first().strip()
            link = movie.xpath('a/@href').extract_first().strip()

            yield {
                'title': title,
                'link': link
            }

示例2:爬取微博热门话题

我们也可以爬取微博上的热门话题和相关微博内容,代码如下:

import scrapy

class WeiboSpider(scrapy.Spider):
    name = "weibo"
    allowed_domains = ["weibo.com"]
    start_urls = ["https://s.weibo.com/top/summary?cate=realtimehot"]

    def parse(self, response):
        for topic in response.xpath('//td[@class="td-02"]'):
            title = topic.xpath('a/text()').extract_first().strip()
            link = topic.xpath('a/@href').extract_first().strip()

            yield {
                'title': title,
                'link': link
            }

以上便是使用Scrapy框架爬取小说的完整攻略,其中包括Scrapy项目的创建、爬虫编写和运行等过程,同时也给出了两个示例,希望能对大家在实际开发中有所启发。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python爬虫教程使用Scrapy框架爬取小说代码示例 - Python技术站

(0)
上一篇 2023年5月14日
下一篇 2023年5月14日

相关文章

  • python协程之yield和yield from实例详解

    Python协程之yield和yield from实例详解 协程是一种轻量级的线程,可以在单个线程中实现并发。Python中的协程通过生成器实现,其中yield和yield from是实现协程的关键。本文将为您提供一个完整攻略,详细讲解yield和yield from的用法,并提供两个示例说明。 1. yield的用法 yield是Python中实现协程的关…

    python 2023年5月14日
    00
  • python使用str & repr转换字符串

    Python中的str和repr是两个用于将对象转换为字符串的函数。str返回一个人可读的字符串,而repr返回Python解释器读取的字符串,可用于重新创建该对象。下面是使用str和repr函数的攻略: 1. str函数 1.1 使用方法 str函数使用语法:str(object=[…]) 其中,object是要转换为字符串的对象,如果省略,则返回空字…

    python 2023年6月5日
    00
  • 举例介绍Python中的25个隐藏特性

    Python是一门非常强大的编程语言,拥有许多隐藏的特性,这些特性可以帮助我们更好地编程。本篇攻略将介绍Python中25个隐藏特性,包括但不限于: 1. 列表推导式 列表推导式提供了一种简洁的方式来生成列表。例如: squares = [x**2 for x in range(1, 6)] print(squares) # 输出:[1, 4, 9, 16,…

    python 2023年5月14日
    00
  • Python基本结构之判断语句的用法详解

    Python基本结构之判断语句的用法详解 Python中判断语句主要有三种:if语句、if-else语句和if-elif-else语句。这些语句用于根据给定的条件来执行不同的代码块。下面详细介绍Python判断语句的用法。 if语句 if语句用于在给定条件为真时执行代码块。 if condition: # 如果条件为真,执行这里的代码 其中,conditio…

    python 2023年5月31日
    00
  • pip报错“OSError: [Errno 1] Operation not permitted: ‘/tmp/pip-uninstall-…’”怎么处理?

    当使用 pip 安装 Python 包时,可能会遇到 “OSError: [Errno 1] Operation not permitted: ‘/tmp/pip-uninstall-…'” 错误。这个错误通常是由于权限问题导致的。以下是详细讲解 pip 报错 “OSError: [Errno 1] Operation not permitted: ‘/…

    python 2023年5月4日
    00
  • 基于python实现操作redis及消息队列

    基于Python操作Redis及消息队列的完整攻略 1. 什么是Redis Redis是一款基于内存的高性能键值存储数据库,它可以将数据存储在内存中,从而支持非常快速的读写操作。Redis不仅支持诸如字符串、哈希、列表、集合、有序集合等常见的数据类型,还提供了一些特殊的功能,例如发布/订阅、Lua脚本等。它的特点是简单、快速、可靠。 2. Redis的安装及…

    python 2023年5月14日
    00
  • python 异常捕获详解流程

    Python异常捕获详解流程 在Python编程过程中,异常经常会出现,如何正确的捕获和处理异常事关代码质量和可靠性。本篇文章将介绍Python异常捕获的详细流程,包括以下几个方面: 异常捕获的概念 异常捕获的语法和用法 异常捕获的流程 异常捕获的概念 异常是指在程序运行过程中出现的错误或异常状况,如除0异常、文件不存在异常等。Python提供了异常捕获机制…

    python 2023年5月13日
    00
  • Python学习之自定义异常详解

    以下是关于Python学习之自定义异常详解的完整攻略: 问题描述 在Python中,我们可以自定义异常来处理特定的错误或异常情况。自定义异常可以让我们更好地控制程序的流程和错误处理。但是,自定义异常需要遵循一定的规则和约定。 解决方法 可以使用以下步骤自定义异常: 定义异常类。 定义一个继承自Exception类的异常类。可以在异常类中添加一些属性或方法,以…

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部