目標站點:https://www.soukai.com (商品信息)。需爬取商品列表/詳情頁數據,交付可運行源碼。
| 層面 | 選型 | 理由 |
|---|---|---|
| 語言 | Python 3.8+ | 請求/解析生態最豐富 (Requests, lxml, Scrapy),開發效率最高 |
| 框架 | Scrapy (生產級) / Requests + BeautifulSoup (輕量) | Scrapy 內置異步、中間件、管道、去重、分布式擴展 |
| 解析 | XPath (lxml) + CSS Selector | 性能好、語法標準、支持正則擴展 |
| 存儲 | MongoDB (半結構化) / PostgreSQL (結構化) / CSV/JSON (交付) | 按數據結構與後續分析需求選擇 |
| 反爬應對 | User-Agent 池、代理 IP、隨機延遲、Cookies 持久化、Headless Chrome (動態渲染) | 按站點具體策略組合 |
| 部署 | Docker + Scrapyd / Kubernetes + Scrapy Cluster | 標準化交付與擴展 |
# items.py
class SoukaiItem(scrapy.Item):
product_id = scrapy.Field()
name = scrapy.Field()
price = scrapy.Field()
category = scrapy.Field()
spec = scrapy.Field()
image_urls = scrapy.Field()
detail_html = scrapy.Field()
crawl_time = scrapy.Field()
# spiders/soukai.py
class SoukaiSpider(scrapy.Spider):
name = 'soukai'
allowed_domains = ['soukai.com']
start_urls = ['https://www.soukai.com/']
custom_settings = {
'DOWNLOAD_DELAY': 1.5,
'RANDOMIZE_DOWNLOAD_DELAY': True,
'CONCURRENT_REQUESTS_PER_DOMAIN': 8,
'DEFAULT_REQUEST_HEADERS': {'User-Agent': 'Mozilla/5.0 ...'},
'ITEM_PIPELINES': {'soukai.pipelines.MongoPipeline': 300},
}
def parse(self, response):
# 1. 列表頁提取商品鏈接
for href in response.xpath('//a[@class="product-link"]/@href').getall():
yield response.follow(href, self.parse_detail)
# 2. 翻頁
next_page = response.xpath('//a[@class="next-page"]/@href').get()
if next_page:
yield response.follow(next_page, self.parse)
def parse_detail(self, response):
item = SoukaiItem()
item['product_id'] = response.url.split('/')[-1].split('.')[0]
item['name'] = response.xpath('//h1[@class="product-title"]/text()').get('').strip()
item['price'] = response.xpath('//span[@class="price"]/text()').re_first(r'[\d.]+')
item['category'] = response.xpath('//nav[@class="breadcrumb"]//a[last()]/text()').get('')
item['spec'] = response.xpath('//div[@class="spec-table"]//tr').xpath('string(.)').getall()
item['image_urls'] = response.xpath('//img[@class="product-img"]/@src').getall()
item['detail_html'] = response.text
item['crawl_time'] = datetime.utcnow().isoformat()
yield item
# pipelines.py
class MongoPipeline:
def open_spider(self, spider):
self.client = pymongo.MongoClient(spider.settings.get('MONGO_URI'))
self.db = self.client[spider.settings.get('MONGO_DB')]
def close_spider(self, spider):
self.client.close()
def process_item(self, item, spider):
self.db.products.update_one(
{'product_id': item['product_id']},
{'$set': dict(item)},
upsert=True
)
return item
scrapy-splash 或 selenium/playwright 中間件,或直接逆向分析 AJAX 接口 (優先);Last-Modified/ETag 或數據庫時間戳過濾已爬數據;requirements.txt/Dockerfile);settings.py.template):代理、數據庫、代理池 API Key;docker-compose up -d 一鍵啟動 Scrapyd + MongoDB + Redis;robots.txt、User-agent: * 規則;DOWNLOAD_DELAY),不影響站點正常服務;「寫完了,挺簡單的,寫了一個下午」——這句話背後是**成熟框架 (Scrapy) + 標準化流程 + 經驗積累**。爬蟲開發核心不在「請求/解析」幾行代碼,而在於**反爬對抗、數據質量、工程化交付、合規邊界**。掌握 Scrapy 架構、中間件/管道擴展、分佈式部署,才能從「寫個腳本」進化為「交付產品級爬蟲系統」。