網(wǎng)站的產(chǎn)品中心怎么做國際新聞快報(bào)
Scrapy
是一個(gè)用于爬取網(wǎng)站數(shù)據(jù)、提取結(jié)構(gòu)性數(shù)據(jù)的開源和協(xié)作框架。它最初是為網(wǎng)頁抓取設(shè)計(jì)的,但也可以用于獲取 API 提供的數(shù)據(jù)或作為通用的網(wǎng)絡(luò)爬蟲。
文章目錄
- 主要特性
- 主要組件
- 使用流程
- 1. 安裝 Scrapy
- 2. 創(chuàng)建 Scrapy 項(xiàng)目
- 3. 定義 Item(數(shù)據(jù))
- 4. 創(chuàng)建和編寫 Spiders 文件
- 5. 修改 settings.py 文件
- 6. 運(yùn)行 Scrapy 爬蟲
- 運(yùn)行項(xiàng)目生成文件說明
- 1. `scrapy.cfg`
- 2. `myproject/`
- a. `__init__.py`
- b. `items.py`
- c. `middlewares.py`
- d. `pipelines.py`
- e. `settings.py`
- 3. `myproject/spiders/`
- a. `__init__.py`
- b. `myspider.py`
- 數(shù)據(jù)存儲(chǔ)
- 1. 文件存儲(chǔ)
- a. JSON 文件
- b. CSV 文件
- 2. 數(shù)據(jù)庫存儲(chǔ)
- a. SQLite
- b. MySQL
- c. MongoDB
- 3. 其他存儲(chǔ)方式
- a. Elasticsearch
- b. Amazon S3
主要特性
- 異步處理:Scrapy 使用 Twisted 異步網(wǎng)絡(luò)庫,可以高效處理多個(gè)并發(fā)請求。
- 內(nèi)置支持選擇器:Scrapy 內(nèi)置支持 XPath 和 CSS 選擇器來提取數(shù)據(jù)。
- 數(shù)據(jù)管道:提供數(shù)據(jù)處理管道,可以對(duì)抓取的數(shù)據(jù)進(jìn)行清洗、驗(yàn)證和存儲(chǔ)。
- 中間件:支持下載中間件和爬蟲中間件,可以在請求和響應(yīng)處理過程中插入自定義邏輯。
- 擴(kuò)展性:可以通過編寫擴(kuò)展和中間件來擴(kuò)展 Scrapy 的功能。
- 支持多種輸出格式:可以將抓取的數(shù)據(jù)導(dǎo)出為 JSON、CSV、XML 等格式。
- 自動(dòng)限速:內(nèi)置支持自動(dòng)限速,可以防止對(duì)目標(biāo)網(wǎng)站造成過大壓力。
主要組件
- Spider(爬蟲):定義如何抓取某個(gè)網(wǎng)站或一組網(wǎng)站,包括如何執(zhí)行抓取(即跟進(jìn)鏈接)以及如何從頁面中提取結(jié)構(gòu)化數(shù)據(jù)。
- Item(項(xiàng)目):定義抓取的數(shù)據(jù)結(jié)構(gòu),類似于 Python 中的字典,但提供了更強(qiáng)的類型檢查和驗(yàn)證。
- Item Pipeline(項(xiàng)目管道):負(fù)責(zé)處理被抓取的項(xiàng)目,通常包括數(shù)據(jù)清洗、驗(yàn)證和存儲(chǔ)。
- Downloader Middleware(下載中間件):處理請求和響應(yīng)的鉤子框架,可以用于修改、丟棄或重試請求。
- Spider Middleware(爬蟲中間件):處理爬蟲的輸入(響應(yīng))和輸出(請求和項(xiàng)目)的鉤子框架。
使用流程
Scrapy 是一個(gè)強(qiáng)大的 Python 爬蟲框架,用于從網(wǎng)站中提取數(shù)據(jù)。以下是從創(chuàng)建項(xiàng)目到運(yùn)行爬蟲的詳細(xì)步驟:
1. 安裝 Scrapy
首先,需要安裝 Scrapy。可以使用 pip 進(jìn)行安裝:
pip install scrapy
2. 創(chuàng)建 Scrapy 項(xiàng)目
使用以下命令創(chuàng)建一個(gè)新的 Scrapy 項(xiàng)目:
scrapy startproject myproject
這將在當(dāng)前目錄下創(chuàng)建一個(gè)名為 myproject
的文件夾,包含 Scrapy 項(xiàng)目的結(jié)構(gòu)。
3. 定義 Item(數(shù)據(jù))
Item 是用來定義要從網(wǎng)頁中提取的數(shù)據(jù)結(jié)構(gòu)。在 myproject/items.py
文件中定義 Item:
import scrapyclass MyItem(scrapy.Item):# 定義字段name = scrapy.Field()description = scrapy.Field()
4. 創(chuàng)建和編寫 Spiders 文件
Spider 是 Scrapy 中用于定義如何抓取網(wǎng)站的類。在 myproject/spiders
目錄下創(chuàng)建一個(gè)新的 Spider 文件,例如 myspider.py
:
import scrapy
from myproject.items import MyItemclass MySpider(scrapy.Spider):name = "myspider"start_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_item
5. 修改 settings.py 文件
在 myproject/settings.py
文件中,可以配置 Scrapy 的各種設(shè)置,例如 USER_AGENT、ROBOTSTXT_OBEY 等:
BOT_NAME = 'myproject'SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'USER_AGENT = 'Mozilla/5.0 (compatible; MyProject/1.0; +http://example.com)'ROBOTSTXT_OBEY = True
6. 運(yùn)行 Scrapy 爬蟲
使用以下命令運(yùn)行的 Spider:
scrapy crawl myspider
這將啟動(dòng) myspider
并開始抓取數(shù)據(jù)。
運(yùn)行項(xiàng)目生成文件說明
1. scrapy.cfg
這是項(xiàng)目的配置文件,通常位于項(xiàng)目的根目錄下。它主要用于定義項(xiàng)目的部署配置。
[settings]
default = myproject.settings[deploy]
#url = http://localhost:6800/
project = myproject
2. myproject/
這是項(xiàng)目的主目錄,包含了項(xiàng)目的所有代碼和配置文件。
a. __init__.py
這是一個(gè)空文件,用于標(biāo)識(shí) myproject
目錄是一個(gè) Python 包。
b. items.py
這個(gè)文件用于定義爬蟲抓取的數(shù)據(jù)結(jié)構(gòu),即 Item。Item 類似于數(shù)據(jù)庫中的表結(jié)構(gòu),用于存儲(chǔ)爬取到的數(shù)據(jù)字段。
import scrapyclass MyItem(scrapy.Item):name = scrapy.Field()description = scrapy.Field()
c. middlewares.py
這個(gè)文件用于定義自定義的中間件。中間件可以用于處理請求和響應(yīng),例如添加自定義的 HTTP 頭、處理重定向等。
class MyCustomMiddleware(object):def process_request(self, request, spider):request.headers['User-Agent'] = 'MyCustomUserAgent'return None
d. pipelines.py
這個(gè)文件用于定義數(shù)據(jù)處理管道。管道用于在數(shù)據(jù)被爬取后進(jìn)行處理,例如清洗數(shù)據(jù)、驗(yàn)證數(shù)據(jù)、存儲(chǔ)數(shù)據(jù)等。
class MyPipeline(object):def process_item(self, item, spider):# 處理 item 的邏輯return item
e. settings.py
這個(gè)文件包含了項(xiàng)目的所有配置??梢栽谶@里設(shè)置爬蟲的行為,例如設(shè)置 User-Agent、啟用中間件、配置管道等。
BOT_NAME = 'myproject'SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'USER_AGENT = {}
ROBOTSTXT_OBEY = TrueITEM_PIPELINES = {'myproject.pipelines.MyPipeline': 300,
}
3. myproject/spiders/
這個(gè)目錄用于存放爬蟲的代碼??梢栽谶@里創(chuàng)建多個(gè)爬蟲文件,每個(gè)文件定義一個(gè)爬蟲。
a. __init__.py
這是一個(gè)空文件,用于標(biāo)識(shí) spiders
目錄是一個(gè) Python 包。
b. myspider.py
這是一個(gè)示例爬蟲文件,用于定義如何抓取網(wǎng)站的數(shù)據(jù)。
import scrapyclass MySpider(scrapy.Spider):name = "myspider"start_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(),}
數(shù)據(jù)存儲(chǔ)
1. 文件存儲(chǔ)
a. JSON 文件
JSON 是一種輕量級(jí)的數(shù)據(jù)交換格式,易于閱讀和編寫。
import jsondef process_item(item):with open('data.json', 'a') as f:line = json.dumps(dict(item)) + "\n"f.write(line)return item
b. CSV 文件
CSV 文件是一種簡單的表格數(shù)據(jù)存儲(chǔ)格式。
import csvdef process_item(item):with open('data.csv', 'a', newline='') as f:writer = csv.writer(f)writer.writerow(item.values())return item
2. 數(shù)據(jù)庫存儲(chǔ)
a. SQLite
SQLite 是一種嵌入式數(shù)據(jù)庫,適合小型項(xiàng)目。
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 item
b. MySQL
MySQL 是一種流行的關(guān)系型數(shù)據(jù)庫,適合大型項(xiàng)目。
import mysql.connectordef process_item(item):conn = mysql.connector.connect(user='user', password='password', host='host', database='database')c = conn.cursor()c.execute("INSERT INTO items (name, description) VALUES (%s, %s)", (item['name'], item['description']))conn.commit()conn.close()return item
c. MongoDB
MongoDB 是一種 NoSQL 數(shù)據(jù)庫,適合存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù)。
from pymongo import MongoClientdef process_item(item):client = MongoClient('localhost', 27017)db = client['mydatabase']collection = db['items']collection.insert_one(dict(item))return item
3. 其他存儲(chǔ)方式
a. Elasticsearch
Elasticsearch 是一個(gè)基于 Lucene 的搜索引擎,適合存儲(chǔ)和搜索大量數(shù)據(jù)。
from elasticsearch import Elasticsearchdef process_item(item):es = Elasticsearch()es.index(index='items', doc_type='item', body=dict(item))return item
b. Amazon S3
Amazon S3 是一種云存儲(chǔ)服務(wù),適合存儲(chǔ)大量文件。
import boto3def process_item(item):s3 = boto3.client('s3')s3.put_object(Bucket='mybucket', Key='data.json', Body=json.dumps(dict(item)))return item