做奢侈品的网站,公司做网站推广的价格,好口碑自适应网站建设,dw做框架网站Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的#xff0c;但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item#xff08;数据#xff…Scrapy 是一个用于爬取网站数据、提取结构性数据的开源和协作框架。它最初是为网页抓取设计的但也可以用于获取 API 提供的数据或作为通用的网络爬虫。 文章目录 主要特性主要组件使用流程1. 安装 Scrapy2. 创建 Scrapy 项目3. 定义 Item数据4. 创建和编写 Spiders 文件5. 修改 settings.py 文件6. 运行 Scrapy 爬虫运行项目生成文件说明1. scrapy.cfg2. myproject/a. __init__.pyb. items.pyc. middlewares.pyd. pipelines.pye. settings.py 3. myproject/spiders/a. __init__.py b. myspider.py 数据存储1. 文件存储a. JSON 文件b. CSV 文件 2. 数据库存储a. SQLiteb. MySQLc. MongoDB 3. 其他存储方式a. Elasticsearchb. Amazon S3 主要特性
异步处理Scrapy 使用 Twisted 异步网络库可以高效处理多个并发请求。内置支持选择器Scrapy 内置支持 XPath 和 CSS 选择器来提取数据。数据管道提供数据处理管道可以对抓取的数据进行清洗、验证和存储。中间件支持下载中间件和爬虫中间件可以在请求和响应处理过程中插入自定义逻辑。扩展性可以通过编写扩展和中间件来扩展 Scrapy 的功能。支持多种输出格式可以将抓取的数据导出为 JSON、CSV、XML 等格式。自动限速内置支持自动限速可以防止对目标网站造成过大压力。 主要组件
Spider爬虫定义如何抓取某个网站或一组网站包括如何执行抓取即跟进链接以及如何从页面中提取结构化数据。Item项目定义抓取的数据结构类似于 Python 中的字典但提供了更强的类型检查和验证。Item Pipeline项目管道负责处理被抓取的项目通常包括数据清洗、验证和存储。Downloader Middleware下载中间件处理请求和响应的钩子框架可以用于修改、丢弃或重试请求。Spider Middleware爬虫中间件处理爬虫的输入响应和输出请求和项目的钩子框架。 使用流程
Scrapy 是一个强大的 Python 爬虫框架用于从网站中提取数据。以下是从创建项目到运行爬虫的详细步骤
1. 安装 Scrapy
首先需要安装 Scrapy。可以使用 pip 进行安装
pip install scrapy2. 创建 Scrapy 项目
使用以下命令创建一个新的 Scrapy 项目
scrapy startproject myproject这将在当前目录下创建一个名为 myproject 的文件夹包含 Scrapy 项目的结构。
3. 定义 Item数据
Item 是用来定义要从网页中提取的数据结构。在 myproject/items.py 文件中定义 Item
import scrapyclass MyItem(scrapy.Item):# 定义字段name scrapy.Field()description scrapy.Field()4. 创建和编写 Spiders 文件
Spider 是 Scrapy 中用于定义如何抓取网站的类。在 myproject/spiders 目录下创建一个新的 Spider 文件例如 myspider.py
import scrapy
from myproject.items import MyItemclass MySpider(scrapy.Spider):name myspiderstart_urls [http://example.com,]def parse(self, response):for item in response.css(div.item):my_item MyItem()my_item[name] item.css(h1::text).get()my_item[description] item.css(p::text).get()yield my_item5. 修改 settings.py 文件
在 myproject/settings.py 文件中可以配置 Scrapy 的各种设置例如 USER_AGENT、ROBOTSTXT_OBEY 等
BOT_NAME myprojectSPIDER_MODULES [myproject.spiders]
NEWSPIDER_MODULE myproject.spidersUSER_AGENT Mozilla/5.0 (compatible; MyProject/1.0; http://example.com)ROBOTSTXT_OBEY True6. 运行 Scrapy 爬虫
使用以下命令运行的 Spider
scrapy crawl myspider这将启动 myspider 并开始抓取数据。 运行项目生成文件说明
1. scrapy.cfg
这是项目的配置文件通常位于项目的根目录下。它主要用于定义项目的部署配置。
[settings]
default myproject.settings[deploy]
#url http://localhost:6800/
project myproject2. myproject/
这是项目的主目录包含了项目的所有代码和配置文件。
a. __init__.py
这是一个空文件用于标识 myproject 目录是一个 Python 包。
b. items.py
这个文件用于定义爬虫抓取的数据结构即 Item。Item 类似于数据库中的表结构用于存储爬取到的数据字段。
import scrapyclass MyItem(scrapy.Item):name scrapy.Field()description scrapy.Field()c. middlewares.py
这个文件用于定义自定义的中间件。中间件可以用于处理请求和响应例如添加自定义的 HTTP 头、处理重定向等。
class MyCustomMiddleware(object):def process_request(self, request, spider):request.headers[User-Agent] MyCustomUserAgentreturn Noned. pipelines.py
这个文件用于定义数据处理管道。管道用于在数据被爬取后进行处理例如清洗数据、验证数据、存储数据等。
class MyPipeline(object):def process_item(self, item, spider):# 处理 item 的逻辑return iteme. settings.py
这个文件包含了项目的所有配置。可以在这里设置爬虫的行为例如设置 User-Agent、启用中间件、配置管道等。
BOT_NAME myprojectSPIDER_MODULES [myproject.spiders]
NEWSPIDER_MODULE myproject.spidersUSER_AGENT {}
ROBOTSTXT_OBEY TrueITEM_PIPELINES {myproject.pipelines.MyPipeline: 300,
}3. myproject/spiders/
这个目录用于存放爬虫的代码。可以在这里创建多个爬虫文件每个文件定义一个爬虫。
a. __init__.py
这是一个空文件用于标识 spiders 目录是一个 Python 包。
b. myspider.py
这是一个示例爬虫文件用于定义如何抓取网站的数据。
import scrapyclass MySpider(scrapy.Spider):name myspiderstart_urls [http://example.com,]def parse(self, response):for item in response.css(div.item):yield {name: item.css(h1::text).get(),description: item.css(p::text).get(),}数据存储
1. 文件存储
a. JSON 文件
JSON 是一种轻量级的数据交换格式易于阅读和编写。
import jsondef process_item(item):with open(data.json, a) as f:line json.dumps(dict(item)) \nf.write(line)return itemb. CSV 文件
CSV 文件是一种简单的表格数据存储格式。
import csvdef process_item(item):with open(data.csv, a, newline) as f:writer csv.writer(f)writer.writerow(item.values())return item2. 数据库存储
a. SQLite
SQLite 是一种嵌入式数据库适合小型项目。
import sqlite3def process_item(item):conn sqlite3.connect(data.db)c conn.cursor()c.execute(INSERT INTO items VALUES (?, ?), (item[name], item[description]))conn.commit()conn.close()return itemb. MySQL
MySQL 是一种流行的关系型数据库适合大型项目。
import mysql.connectordef process_item(item):conn mysql.connector.connect(useruser, passwordpassword, hosthost, databasedatabase)c conn.cursor()c.execute(INSERT INTO items (name, description) VALUES (%s, %s), (item[name], item[description]))conn.commit()conn.close()return itemc. MongoDB
MongoDB 是一种 NoSQL 数据库适合存储非结构化数据。
from pymongo import MongoClientdef process_item(item):client MongoClient(localhost, 27017)db client[mydatabase]collection db[items]collection.insert_one(dict(item))return item3. 其他存储方式
a. Elasticsearch
Elasticsearch 是一个基于 Lucene 的搜索引擎适合存储和搜索大量数据。
from elasticsearch import Elasticsearchdef process_item(item):es Elasticsearch()es.index(indexitems, doc_typeitem, bodydict(item))return itemb. Amazon S3
Amazon S3 是一种云存储服务适合存储大量文件。
import boto3def process_item(item):s3 boto3.client(s3)s3.put_object(Bucketmybucket, Keydata.json, Bodyjson.dumps(dict(item)))return item