c语言编程笔录

首页 >   > 笔记大全

笔记大全

python爬虫scrapy框架有什么用

更新时间:2023-11-15

什么是Scrapy框架

Scrapy是一个Python爬虫框架,可用于抓取和提取Web中的数据。 Scrapy提供了一组用于抓取Web内容的库和工具箱,包括用于处理HTML及Json的解析器和中间件,同时还提供了可以接受异步处理和多线程的机制。

import scrapy

class MySpider(scrapy.Spider):
    name = 'myspider'
    start_urls = ['http://www.example.com']

    def parse(self, response):
        pass

Scrapy的主要功能

Scrapy的核心功能包括以下几点:

  • 提供HTTP请求和自动化处理的过程。
  • 能够从URL中提取数据。
  • 可以提取HTML和XML数据,并将其存储在所需的数据库中。
  • 可以在不同的页面之间跟踪和维护这些数据。
import scrapy

class MySpider(scrapy.Spider):
    name = "quotes"
    start_urls = [
        'http://quotes.toscrape.com/page/1/',
    ]

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }

        next_page = response.css('li.next a::attr(href)').get()
        if next_page is not None:
            yield response.follow(next_page, self.parse)

Scrapy的优点

Scrapy作为一个高级爬虫框架,有以下优点:

  • 组件化和可扩展性。
  • 提供了有用的异常处理功能。
  • 具有自动性。
  • 提供针对许多目标网站的预建组件。
  • 可轻松创建自己的自定义组件。
  • 可在不同的网站之间切换。
#引入自定义pipepline
ITEM_PIPELINES = {
  'scrapy_example.pipelines.AddItemPipeline': 300,
}

# Item Pipeline示例
import pymongo

class AddItemPipeline(object):
    def __init__(self):
        connection = pymongo.MongoClient(
            'localhost',
            27017
        )
        db = connection['crawler']
        self.collection = db['items']

    def process_item(self, item, spider):
        self.collection.insert(dict(item))
        return item

Scrapy的缺点

Scrapy框架的一些缺点和限制:

  • Scrapy框架目前仅支持Python 2.x和Python 3.x,无法支持其他不同的语言。
  • 缺乏易于阅读的文档和背景资料。
  • 无法支持动态页面上的网页抓取。
  • 数据处理和分析缺乏扩展性。
#导入Dynamic website scraping示例
from scrapy_splash import SplashRequest

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

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse,
                endpoint='render.html',
                args={'wait': 0.5},
            )

    def parse(self, response):
        for quote in response.css('div.quote'):
            yield {
                'text': quote.css('span.text::text').get(),
                'author': quote.css('span small::text').get(),
                'tags': quote.css('div.tags a.tag::text').getall(),
            }