使用scrapy爬取长安有妖气小说

目标网站:https://www.snwx3.com/txt/434282.html
第一章地址:https://www.snwx3.com/book/434/434282/92792998.html
最后一章地址:https://www.snwx3.com/book/434/434282/92793103.html

注意查看地址最后的,有规律。

3103-2998+1=106,但是有三章地址是重复的,所有实际有103个地址,103个章节,正好符合目录列表,(多余的这三个章节等爬取下来后再手动删除)

创建项目

scrapy startproject quotetutorial
cd quotetutorial
scrapy genspider quotes www.snwx3.com

项目结构如下:

quotetutorial/start.py文件内容

目的是直接运行这个文件从而运行爬虫,就不用在命令行中运行爬虫了

#!/usr/bin/env python
#-*- coding: utf-8 -*-

from scrapy.cmdline import execute
execute(['scrapy', 'crawl', 'quotes']) # quotes为quotes.py文件中的name变量的值

quotetutorial/quotetutorial/spiders/quotes.py文件内容

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import scrapy
from quotetutorial.items import QuotetutorialItem

class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['www.snwx3.com']
    base_url = "https://www.snwx3.com/book/434/434282/9279"

    pages = list(range(2998,3104)) # 遍历页数

    def start_requests(self):
        # 遍历循环图书索引页
        for page in self.pages:
            url = self.base_url + str(page) + ".html" # 构造请求地址
            print('请求第%s页' % (url))
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        res = response.css('#BookText::text').extract() # 使用浏览器的css选择器功能
        # print(res)
        item = QuotetutorialItem()
        item['text'] = res
        yield item

使用浏览器的css选择器功能

quotetutorial/quotetutorial/items.py文件内容

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import scrapy

class QuotetutorialItem(scrapy.Item):
    text = scrapy.Field() # 只获取内容,章节标题最后添加

quotetutorial/quotetutorial/pipelines.py文件内容

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os

class QuotetutorialPipeline:
    def process_item(self, item, spider):
        base_dir = os.getcwd()
        fiename = base_dir + '/new2.txt' # 保存文件到当前目录
        with open(fiename, 'a',encoding='utf-8') as f: # 防止乱码
            text = "".join(item['text']) # list转str
            f.write(text + '\n')
        return item

quotetutorial/quotetutorial/settings.py文件内容

ROBOTSTXT_OBEY = False # 设置为False,表示不准收robots.txt规则

ITEM_PIPELINES = {
   'quotetutorial.pipelines.QuotetutorialPipeline': 300, # 调用下载
}

最终效果

爬取后的结果是一行一个章节,使用notepad++软件操作,删除空白行,删除掉三个重复的章节,正好103行,表示103个章节,根据目标网站的地址,获取每章的名称,然后使用块编辑复制粘贴到每行的开头,完美。

posted @ 2020-11-19 22:27  哈喽哈喽111111  阅读(182)  评论(0编辑  收藏  举报