当当网数据采集:Scrapy框架的异步处理能力

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 当当网数据采集:Scrapy框架的异步处理能力

在互联网数据采集领域,Scrapy框架以其强大的异步处理能力而著称。Scrapy利用了Python的异步网络请求库,如twisted,来实现高效的并发数据采集。本文将深入探讨Scrapy框架的异步处理能力,并展示如何在当当网数据采集项目中应用这一能力。

  1. Scrapy框架概述
    Scrapy是一个快速的、高层次的web爬虫框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy的异步处理能力主要得益于其底层的twisted异步网络库。
    1.1 Scrapy架构
    Scrapy的架构可以分为几个主要部分:
    ● 引擎(Engine):负责控制数据流在系统中的所有组件之间的流动,并在某些动作发生时触发事件。
    ● 爬虫(Spiders):负责解析响应并生成爬取的URL和/或提取数据(即Item)。
    ● 调度器(Scheduler):负责接收引擎发送的请求,并将其入队列以待之后处理。
    ● 下载器(Downloader):负责获取网页数据。
    ● 项目管道(Item Pipeline):负责处理爬虫从网页中抽取的数据。
    ● 下载器中间件(Downloader Middlewares):位于Engine和Downloader之间,主要是处理引擎与下载器之间的请求和响应。
    ● 爬虫中间件(Spider Middlewares):位于Engine和Spider之间,主要是处理蜘蛛的输入(响应)和输出(提取的数据,即Item)。
    1.2 异步处理的优势
    Scrapy的异步处理能力使得它能够在单个爬虫实例中同时处理多个请求和响应,这大大提高了数据采集的效率。异步处理的优势包括:
    ● 提高效率:并发处理多个请求,减少等待时间。
    ● 节省资源:相比多进程或多线程,异步IO使用更少的系统资源。
    ● 易于扩展:Scrapy的架构支持水平扩展,易于在多台机器上运行。
  2. 实现当当网数据采集
    首先,确保安装了Scrapy。
    使用Scrapy创建一个新的项目:
    在items.py文件中定义当当网数据的结构。
    编写爬虫
    在spiders/doudang_spider.py文件中编写爬虫:
    ```import scrapy
    from doudang_spider.items import DoudangBookItem

class DoudangSpider(scrapy.Spider):
name = 'doudang'
allowed_domains = ['dangdang.com']
start_urls = ['http://dangdang.com']

def __init__(self, *args, **kwargs):
    super(DoudangSpider, self).__init__(*args, **kwargs)
    self.proxy = 'http://{}:{}'.format(self.proxyHost, self.proxyPort)
    self.auth = (self.proxyUser, self.proxyPass)

def parse(self, response):
    for book in response.css('div.product'):
        item = DoudangBookItem()
        item['title'] = book.css('h3::text').get()
        item['price'] = book.css('.price::text').get()
        item['description'] = book.css('.description::text').get()
        item['url'] = response.urljoin(book.css('a::attr(href)').get())
        yield item

在 settings.py 中添加以下配置

DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
}

PROXY_HOST = 'www.16yun.cn'
PROXY_PORT = '5445'
PROXY_USER = '16QMSOML'
PROXY_PASS = '280651'

2.1 异步处理
Scrapy的异步处理主要通过twisted库实现。在爬虫中,可以通过meta传递消息给下一个请求,实现请求的异步处理:
```python
def parse(self, response):
    for book in response.css('div.product'):
        # ... 省略其他代码
        yield scrapy.Request(
            url=item['url'],
            callback=self.parse_book_detail,
            meta={'item': item}
        )

def parse_book_detail(self, response):
    item = response.meta['item']
    # 处理书籍详情
    item['description'] = response.css('.detail-description::text').get()
    yield item
  1. 性能优化
    3.1 并发设置
    在settings.py中设置并发请求的数量:
    CONCURRENT_REQUESTS = 32
    
    3.2 下载延迟
    设置下载延迟,以避免对网站服务器造成过大压力:
    DOWNLOAD_DELAY = 1.0  # 每秒请求一次
    
    3.3 自动限制
    Scrapy还提供了自动限制请求速率的功能:
    AUTOTHROTTLE_ENABLED = True
    AUTOTHROTTLE_START_DELAY = 5.0
    AUTOTHROTTLE_MAX_DELAY = 60
    
相关文章
|
18天前
|
数据采集 中间件 开发者
Scrapy爬虫框架-自定义中间件
Scrapy爬虫框架-自定义中间件
36 1
|
18天前
|
数据采集 中间件 Python
Scrapy爬虫框架-通过Cookies模拟自动登录
Scrapy爬虫框架-通过Cookies模拟自动登录
43 0
|
3月前
|
数据采集 存储 中间件
高效数据抓取:Scrapy框架详解
高效数据抓取:Scrapy框架详解
|
18天前
|
数据采集 中间件 数据挖掘
Scrapy 爬虫框架(一)
Scrapy 爬虫框架(一)
35 0
|
18天前
|
数据采集 XML 前端开发
Scrapy 爬虫框架(二)
Scrapy 爬虫框架(二)
37 0
|
2月前
|
数据采集 存储 XML
Scrapy框架实现数据采集的详细步骤
本文介绍了使用Scrapy框架从宁波大学经济学院网站爬取新闻或公告详情页内容的过程,包括创建Scrapy项目、编写爬虫规则、提取所需信息,并最终将数据存储到Excel文件中的方法和步骤。
Scrapy框架实现数据采集的详细步骤
|
2月前
|
数据采集 中间件 调度
Scrapy 爬虫框架的基本使用
Scrapy 爬虫框架的基本使用
|
2月前
|
数据采集 数据可视化 数据挖掘
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
本文介绍了一个基于Python和Django框架,使用Scrapy进行去哪儿网数据采集与分析的项目,包括实现登录注册功能、MD5加密以及通过可视化大屏展示分析结果的综合系统。
基于python django的scrapy去哪儿网数据采集与分析,包括登录注册和可视化大屏,有md5加密
|
2月前
|
数据采集 存储 中间件
Python进行网络爬虫:Scrapy框架的实践
【8月更文挑战第17天】网络爬虫是自动化程序,用于从互联网收集信息。Python凭借其丰富的库和框架成为构建爬虫的首选语言。Scrapy作为一款流行的开源框架,简化了爬虫开发过程。本文介绍如何使用Python和Scrapy构建简单爬虫:首先安装Scrapy,接着创建新项目并定义爬虫,指定起始URL和解析逻辑。运行爬虫可将数据保存为JSON文件或存储到数据库。此外,Scrapy支持高级功能如中间件定制、分布式爬取、动态页面渲染等。在实践中需遵循最佳规范,如尊重robots.txt协议、合理设置爬取速度等。通过本文,读者将掌握Scrapy基础并了解如何高效地进行网络数据采集。
185 6
|
2月前
|
存储 中间件 数据处理
深入解读 Scrapy 框架原理与源码
深入解读 Scrapy 框架原理与源码
48 1