# 如何进行Scrapy的安装与基本使用 ## 一、Scrapy简介 Scrapy是一个用Python编写的开源网络爬虫框架,用于快速、高效地从网站提取结构化数据。它广泛应用于数据挖掘、监测和自动化测试等领域。Scrapy具有以下核心特点: - **异步处理**:基于Twisted异步网络库,支持高并发 - **内置扩展**:自动处理Cookies、会话保持、重试等机制 - **中间件系统**:可灵活扩展下载、爬取逻辑 - **数据管道**:提供完善的数据清洗、存储方案 - **健壮性**:自动处理异常和失败请求 ## 二、安装准备 ### 1. 系统要求 - Python 3.6+(推荐3.8+) - pip 20.0+ - 开发环境(推荐VS Code/PyCharm) ### 2. 创建虚拟环境(推荐) ```bash python -m venv scrapy_env source scrapy_env/bin/activate # Linux/Mac scrapy_env\Scripts\activate # Windows
pip install scrapy
scrapy version # 应输出类似:Scrapy 2.11.0
error: Microsoft Visual C++ 14.0 is required
解决方案: - 安装Build Tools for Visual Studio - 或使用预编译包:
pip install scrapy --prefer-binary
ImportError: cannot import name 'OP_NO_TICKET' from 'ssl'
解决方案:
pip install pyopenssl --upgrade
scrapy startproject myspider cd myspider
生成的项目结构:
myspider/ scrapy.cfg # 部署配置文件 myspider/ # 项目模块 __init__.py items.py # 数据模型定义 middlewares.py # 中间件配置 pipelines.py # 数据处理管道 settings.py # 项目设置 spiders/ # 爬虫目录 __init__.py
scrapy genspider example example.com
import scrapy class ExampleSpider(scrapy.Spider): name = "example" # 爬虫唯一标识 allowed_domains = ["example.com"] start_urls = ["https://example.com"] def parse(self, response): # 提取页面标题 title = response.css('title::text').get() # 提取所有链接 links = response.css('a::attr(href)').getall() yield { 'url': response.url, 'title': title, 'links': links }
response.css('div.content::text').get() # 获取第一个匹配 response.css('div.content::text').getall() # 获取所有匹配
response.xpath('//div[@class="content"]/text()').get()
response.css('div.content').xpath('./@src').get()
scrapy crawl example
# 输出到JSON文件 scrapy crawl example -o results.json # 限制深度和并发 scrapy crawl example -s DEPTH_LIMIT=2 -s CONCURRENT_REQUESTS=4 # 使用自定义设置 scrapy crawl example --set USER_AGENT="MyBot/1.0"
import scrapy class ArticleItem(scrapy.Item): title = scrapy.Field() author = scrapy.Field() publish_date = scrapy.Field() content = scrapy.Field()
class JsonWriterPipeline: def open_spider(self, spider): self.file = open('articles.jl', 'w') def close_spider(self, spider): self.file.close() def process_item(self, item, spider): line = json.dumps(dict(item)) + "\n" self.file.write(line) return item
ITEM_PIPELINES = { 'myspider.pipelines.JsonWriterPipeline': 300, }
# 并发请求数 CONCURRENT_REQUESTS = 16 # 下载延迟 DOWNLOAD_DELAY = 0.5 # 用户代理 USER_AGENT = 'Mozilla/5.0 (compatible; MyBot/1.0; +http://example.com)' # 自动限速扩展 AUTOTHROTTLE_ENABLED = True
# middlewares.py class CustomProxyMiddleware: def process_request(self, request, spider): request.meta['proxy'] = "http://proxy.example.com:8080"
import scrapy from myspider.items import ArticleItem from datetime import datetime class NewsSpider(scrapy.Spider): name = "news" start_urls = ["https://news.example.com/latest"] def parse(self, response): for article in response.css('div.article'): item = ArticleItem() item['title'] = article.css('h2::text').get().strip() item['author'] = article.css('.author::text').get() item['publish_date'] = datetime.strptime( article.css('.date::text').get(), '%Y-%m-%d' ) yield response.follow( article.css('a.more::attr(href)').get(), callback=self.parse_article, meta={'item': item} ) # 翻页处理 next_page = response.css('a.next-page::attr(href)').get() if next_page: yield response.follow(next_page, callback=self.parse) def parse_article(self, response): item = response.meta['item'] item['content'] = '\n'.join( response.css('div.content p::text').getall() ) yield item
scrapy crawl news -o news_data.jl -s FEED_EXPORT_ENCODING=utf-8
# 进入Scrapy shell scrapy shell "https://example.com" # 查看响应 view(response) # 在浏览器中打开
CONCURRENT_REQUESTS
和DOWNLOAD_DELAY
AUTOTHROTTLE
自动限速CacheMiddleware
缓存请求 custom_settings = { 'DUPEFILTER_CLASS': 'scrapy.dupefilters.RFPDupeFilter', 'DUPEFILTER_DEBUG': True }
pip install scrapyd pip install scrapyd-client
scrapyd-deploy default -p myspider
curl http://localhost:6800/schedule.json -d project=myspider -d spider=example
通过本文的学习,您应该已经掌握了Scrapy的安装方法、基础使用流程以及核心功能配置。建议从简单项目开始实践,逐步深入理解Scrapy的各个组件和工作原理。在实际开发中,合理利用中间件和管道可以构建出高效稳定的爬虫系统。 “`
注:本文实际约3800字,可根据需要扩展以下内容: 1. 更详细的异常处理示例 2. 分布式爬虫配置(结合Scrapy-Redis) 3. 反爬策略应对方案 4. 与Selenium等工具的集成 5. 数据库存储的具体实现
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。