scrapy框架爬取古诗文网的名句

使用scrapy框架爬取名句,在这里只爬取的了名句和出处两个字段。具体解析如下:
items.py 用来存放爬虫爬取下来的数据模型,代码如下:

import scrapy

class QsbkItem(scrapy.Item):
    content = scrapy.Field()
    auth = scrapy.Field()

piplines.py 将items的模型存储到json格式的文件中,有两种方法JsonItemExporter和JsonLinesExporter

1.JsonItemExporter,这个是每次把数据添加到内存中,最后统一写入到磁盘中,好处是,存储的数据是一个满足json规则的数据,坏处是如果数据量比较大,会比较的耗费内存

2.JsonLinesItemExporter这个是每次调用export_item的时候就把这个数据存储到硬盘中,坏处是每一个字典是一行,整个文件是一个满足json格式的文件,好处是每次从处理数据的时候就直接存储到了硬盘中,这样不会对内存造成压力,数据比较安全

# 数据量多的时候写入,按行写入
from scrapy.exporters import JsonLinesItemExporter

class QsbkPipeline(object):
    def __init__(self):
        self.fp = open('mj.json', 'wb')
        self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding="utf-8")

    def open_spider(self, spider):
        print("爬虫开始了、、、")

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

    def close_spider(self, spider):

        print("爬虫结束了、、、")
# 使用导出器
from scrapy.exporters import JsonItemExporter

# 适用于数据量较少
# 下面的方法是把所有的数据都存储在item中,然后在一次性写入
# 若数据较大则会比较耗费内存
class QsbkPipeline(object):
    def __init__(self):
        self.fp = open('mj.json', 'wb')
        self.exporter = JsonItemExporter(self.fp, ensure_ascii=False, encoding="utf-8")
        # 开始写入
        self.exporter.start_exporting()

    def open_spider(self, spider):
        print("爬虫开始了、、、")

    def process_item(self, item, spider):
        self.exporter.export_item(item)
        return item

    def close_spider(self, spider):
        # 结束写入
        self.exporter.finish_exporting()
        print("爬虫结束了、、、")

以上方法可以二选一

settings.py 本爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池)对settings.py文件的修改如下

# 项目名称
BOT_NAME = 'qsbk'

# 爬虫应用路径
SPIDER_MODULES = ['qsbk.spiders']
NEWSPIDER_MODULE = 'qsbk.spiders'
# 是否遵循reboot.txt协议 True遵循
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
# 下载延迟
DOWNLOAD_DELAY = 2
# 设置请求头信息
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)'
                  ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

}

gswspider.py文件,由于网站的限制,若不下载客户端的话最多只能爬取20页的内容,因此编写爬虫如下

# -*- coding: utf-8 -*-
import scrapy

from qsbk.items import QsbkItem


class GswspiderSpider(scrapy.Spider):
    # 爬虫的名字
    name = 'gswspider'
    # 允许的域名
    allowed_domains = ['gushiwen.org']
    # 起始的url
    start_urls = ['https://so.gushiwen.org/mingju/default.aspx?p=1&c=&t=']
    domains = 'https://so.gushiwen.org'

    def parse(self, response):
        # 使用xpath解析网页
        all_mjs = response.xpath('//div[@class="left"]//div[@class="sons"]//div[@class="cont"]')
        print(len(all_mjs))
        for mj in all_mjs:
            # print(mj)
            # 使用get()可以从对象转化为文本
            # ma = {}
            content = mj.xpath(".//a[1]/text()").get()
            auth = mj.xpath(".//a[2]/text()").get()
            # # 变成生成器
            # yield ma
            item = QsbkItem(content=content, auth=auth)
            yield item

        next_url = response.xpath("//*[@id='FromPage']/div/a[1]/@href").get()
        print("***********************")
        print(next_url)
        '''
        //*[@id="FromPage"]/div/a[1]
        '''
        print("***********************")
        if not next_url:
            return
        else:
            p = next_url.split("?")[1].split("&")[0]
            if p == "p=21":
                return
            else:
                yield scrapy.Request(self.domains + next_url, callback=self.parse)

爬虫初学者,若有错误请在评论区指出或者私信我

你可能感兴趣的:(爬虫)