简述python Scrapy框架

1. 简介

Scrapy是一个用于爬取网站数据的Python框架。该框架基于Twisted异步网络框架开发,能够快速高效地爬取互联网上的数据。

2. 安装Scrapy框架

2.1 安装方法

首先需要安装Python,推荐使用Python3版本。使用pip安装Scrapy:

pip install scrapy

2.2 安装验证

安装完成后,可以通过运行下面的命令验证是否安装成功:

import scrapy

如果没有报错,则表明安装成功。

3. Scrapy框架组成

3.1 Scrapy引擎

Scrapy引擎是整个框架的核心。它负责协调各个模块之间的工作,比如调度器、下载器、爬虫和管道等。它负责触发事件和传递数据。

3.2 调度器

调度器负责维护待爬取的请求队列,并根据优先级和调度策略选择下一个要爬取的请求,发送给下载器进行处理。

3.3 下载器

下载器负责将HTTP请求返回的响应进行处理,包括解析网页内容、处理异常和存储响应等操作,并将处理后的结果返回给引擎。

3.4 爬虫

爬虫是开发者自己定义的用于处理特定网站或网页的Python类。它包括一些属性和方法,用于指定要爬取的网站、定义如何提取数据以及如何跟踪链接等内容。

3.5 管道

管道是Scrapy框架用于对爬取到的数据进行处理和持久化的组件。它负责将爬虫返回的数据进行处理,比如清洗、去重、存储等。

4. Scrapy框架基本使用

4.1 创建一个Scrapy项目

使用命令行工具创建一个Scrapy项目:

scrapy startproject project_name

后面的project_name是项目名称,可以根据自己的需要进行修改。

4.2 定义爬虫

使用命令行工具创建一个爬虫:

scrapy genspider spider_name domain_name

spider_name是爬虫名称,可以根据自己的需要进行修改;domain_name是要爬取的网站域名。

定义爬虫类:

import scrapy

class MySpider(scrapy.Spider):

name = 'myspider'

start_urls = ['https://www.example.com']

def parse(self, response):

# 处理返回的响应数据

pass

其中,name是这个爬虫的名称,需要与之前的spider_name相同;start_urls是开始爬取的网站列表;parse方法用于处理响应。

4.3 下载网页

使用Scrapy的下载器下载网页:

import scrapy

class MySpider(scrapy.Spider):

name = 'myspider'

start_urls = ['https://www.example.com']

def parse(self, response):

html = response.text

filename = 'example.html'

with open(filename, 'w') as f:

f.write(html)

其中,response.text是下载到的网页内容,可以直接保存到文件中。

4.4 提取数据

Scrapy提供了丰富的选择器,可以方便地从网页中提取数据。这里以提取新闻列表为例。

import scrapy

class NewsSpider(scrapy.Spider):

name = 'newsspider'

start_urls = ['https://www.example.com/news']

def parse(self, response):

# 提取新闻列表

news_list = response.css('.news-list li a')

for news in news_list:

# 提取每条新闻的标题和链接

title = news.css('::text').extract_first()

link = news.css('::attr(href)').extract_first()

yield {

'title': title,

'link': link

}

在这个爬虫中,使用了response.css方法选择新闻列表,并使用css选择器提取每个新闻的标题和链接。

4.5 使用管道

使用管道对爬虫返回的数据进行处理和持久化。这里以将爬虫数据存储到MongoDB数据库为例。

import pymongo

class MyPipeline(object):

def __init__(self, mongo_uri, mongo_db):

self.mongo_uri = mongo_uri

self.mongo_db = mongo_db

@classmethod

def from_crawler(cls, crawler):

return cls(

mongo_uri=crawler.settings.get('MONGO_URI'),

mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')

)

def open_spider(self, spider):

self.client = pymongo.MongoClient(self.mongo_uri)

self.db = self.client[self.mongo_db]

def close_spider(self, spider):

self.client.close()

def process_item(self, item, spider):

collection_name = spider.name

self.db[collection_name].insert_one(dict(item))

return item

在这个管道中,使用了MongoDB作为数据存储介质。需要在settings.py文件中进行配置:

ITEM_PIPELINES = {

'myproject.pipelines.MyPipeline': 300,

}

MONGO_URI = 'mongodb://localhost:27017/'

MONGO_DATABASE = 'mydatabase'

这里的'300'表示管道的优先级,较低的数字优先级较高。

5. 总结

Scrapy是一个功能强大的Python爬虫框架,可以快速高效地爬取互联网上的数据。其采用了Twisted异步网络框架,能够提高爬虫的效率。Scrapy拥有完整的架构,包括引擎、调度器、下载器、爬虫和管道等模块,使用起来非常方便。

后端开发标签