欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

爬虫— scrapy 的基本使用

程序员文章站 2022-05-04 19:21:25
以 quotes.toscrape.com 为例一、创建项目startproject 项目名cd 项目名scrapy genspider 爬虫名 爬虫网站【爬虫名 != 爬虫网站】startproject examplecd examplescrapy genspider quotes quotes.toscrape.com注意,区分项目目录【项目名】,工作目录【默认和项目名一样】,爬虫目录【默认是spiders】:scrapy.cfg是项目 配置 文件,在项目目录下,其中定义了....

quotes.toscrape.com 为例

一、创建项目

startproject 项目名
cd 项目名
scrapy genspider 爬虫名 爬虫网站【爬虫名 != 爬虫网站】

startproject example
cd example
scrapy genspider quotes quotes.toscrape.com

爬虫— scrapy 的基本使用
注意,区分项目目录【项目名】,工作目录【默认和项目名一样】,爬虫目录【默认是spiders】:

  • scrapy.cfg是项目 配置 文件,在项目目录下,其中定义了工作目录项目设置文件的路径
  • settings.py是默认的项目 设置 文件,默认在工作目录下,其中定义了爬虫目录和的路径
  • pycharm写代码时要将工作目录标记为根目录
  • 命令行工作时应该在项目目录下

二、编写项目

爬虫— scrapy 的基本使用

1、items.py 字段记录

每条数据分别为名言text, 作者author, 标签tags

import scrapy


class ExampleItem(scrapy.Item):
    # 这个文件用来记录数据的字段
    text = scrapy.Field()
    author = scrapy.Field()
    tags = scrapy.Field()

2、quotes.py 爬虫文件

import scrapy
from items import ExampleItem


class QuotesSpider(scrapy.Spider):
    name = 'quotes'
    allowed_domains = ['quotes.toscrape.com']
    start_urls = ['http://quotes.toscrape.com/']

    def parse(self, response):
        quotes = response.xpath("//div[@class='quote']")    # 也支持 .css 选择器
        for quote in quotes:
            # 和平时的[0]直接提取文本不同,其用 .get() 来提取数据
            text = quote.xpath(".//span[@class='text']/text()").get()
            author = quote.xpath(".//small[@class='author']/text()").get()
            tags = quote.xpath(".//a[@class='tag']/text()").getall()
            item = ExampleItem()
            item['text'] = text
            item['author'] = author
            item['tags'] = tags
            yield item

        next = response.xpath("//li[@class='next']/a/@href").get()
        url = response.urljoin(next)        # 拼接网址
        yield scrapy.Request(url=url, callback=self.parse)  # 回调自己实现翻页

3、pipelines.py 项目管道

对数据的筛选和存储可以在这里完成
注意:

  • 管道类的方法有明确的执行顺序需要的参数以及执行次数,需要记忆
  • 管道中的process_item()一定要返回一个对象,别TM把return的位置写错了,然后调试半天!
import pymongo
from scrapy.exceptions import DropItem


class ExamplePipeline:
    def __init__(self):
        self.limit = 50

    def process_item(self, item, spider):
        if item['text']:
            if len(item['text']) > self.limit:
                # 将超过 limit 的部分替换
                item['text'] = item['text'][0:self.limit].rstrip() + '...'
            return item
        else:
            return DropItem('Missing Text')


class MongoPipeline:
    def __init__(self, mongo_uri, mongo_db):
        # 2、初始化方法其次执行, 初始化类变量
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db


    @classmethod
    def from_crawler(cls, crawler):
        # 1、类方法最先执行, 从项目设置文件中获取字段数据, 交给初始化方法
        return cls(
            mongo_uri = crawler.settings.get('MONGO_URI'),
            mongo_db = crawler.settings.get('MONGO_DB')
        )


    def open_spider(self, spider):
        # 3、爬虫启动时执行的操作,在初始化完成之后执行
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
        
        
    def process_item(self, item, spider):
        # 4、获取到数据后执行
        name = item.__class__.__name__
        self.db[name].insert(dict(item))
        return item
    
    def close_spider(self, spider):
        # 5、爬虫关闭后执行
        self.client.close()

上面写了两个管道,写完管道的类后需要在设置文件中安排管道的优先顺序才能启用管道

4、settings.py 设置文件

序号越小,顺序越高

MONGO_URI = 'localhost'
MONGO_DB = 'quotes'


ITEM_PIPELINES = {
    'example.pipelines.ExamplePipeline': 300,
    'example.pipelines.MongoPipeline': 400,
}

三、其他常用操作

1、命令行启动

scrapy crawl 爬虫文件名--nolog 可以不打印日志】

scrapy crawl quotes

2、制作启动器

在项目目录下新建start.py,每次运行这个即可

from scrapy import cmdline

cmd = "scrapy crawl quotes --nolog"
cmdline.execute(cmd.split())

3、shell交互模式

scrapy shell 网址

scrapy shell http://quotes.toscrape.com/

爬虫— scrapy 的基本使用

4、打开页面

scrapy view 网址 获取没有加载js的页面

scrapy view http://quotes.toscrape.com/

5、保存数据

scrapy crawl 爬虫文件名 -o 文件名 默认是保存在项目目录下,支持多种格式:‘json’, ‘jsonlines’, ‘jl’, ‘csv’, ‘xml’, ‘marshal’, ‘pickle’

scrapy crawl quotes -o quotes.json

甚至支持ftp远程保存

本文地址:https://blog.csdn.net/qq_41205771/article/details/107438531

相关标签: 所谓爬虫 python