本文详细介绍了如何在Linux系统上部署Scrapy框架,从安装Python环境到安装Scrapy及其依赖库,再到配置Linux环境变量,最后创建和运行Scrapy项目,整个过程清晰易懂。教程涵盖了从环境搭建到项目创建的每一个步骤,帮助读者轻松掌握Scrapy的部署方法。
Scrapy简介与安装 Scrapy是什么Scrapy是一个快速高效的网页抓取框架,用于从网站上提取结构化的数据。它具有高度的可扩展性和灵活性,能够支持从简单的网页爬取到复杂的网络数据抓取任务。Scrapy主要用于数据挖掘、信息提取和自动化测试等领域。
Scrapy的基本功能与特点1. 基本功能
- 网页抓取:Scrapy提供强大的网页抓取能力,支持各种类型的HTTP请求。
- 数据提取:通过XPath或CSS选择器从网页中提取所需的数据。
- 管道机制:数据可以通过管道进行清洗和处理,支持多种存储方式。
- 调度器:内置的调度器帮助管理待抓取的URL队列。
- 中间件支持:中间件允许对请求、响应、下载器中的数据进行预处理和后处理。
2. 特点
- 高性能:Scrapy使用异步IO和Twisted框架,支持并发请求。
- 灵活:支持多种类型的数据提取和处理方式。
- 可扩展:可以通过中间件和管道自定义行为。
- 强大:内置的下载器支持多种HTTP请求方式。
1. 安装Python环境
确保已经安装了Python环境。Scrapy支持Python 3.7及以上版本。可以通过Python官方网站下载安装,或者使用包管理器如apt
在Linux系统中安装。
sudo apt update
sudo apt install python3.7
2. 安装Scrapy
使用pip工具安装Scrapy。
pip install scrapy
3. 安装依赖库
Scrapy需要一些依赖库才能正常运行,这些库通常会随着Scrapy一起安装。如果需要额外的库,可以通过pip安装。
pip install lxml
pip install cssselect
pip install twisted
Linux环境搭建
选择合适的Linux发行版
对于Scrapy的部署,可以选择任意一种支持Python的Linux发行版。例如Ubuntu、CentOS、Debian等。Ubuntu和Debian因其稳定性、良好的社区支持和广泛的包管理器支持,更适合初学者使用。
1. Ubuntu安装
Ubuntu是许多开发者的选择,因为它稳定性和社区支持。通过以下命令安装Ubuntu:
sudo apt update
sudo apt install ubuntu-desktop
2. CentOS安装
CentOS是一个稳定的、免费的企业级Linux发行版,适合服务器部署。通过以下命令安装:
wget https://www.centos.org/download/centos-linux-latest-9.0.0-x86_64-minimal.iso
sudo yum install @development
安装Python与相关依赖库
1. 安装Python
sudo apt update
sudo apt install python3.7
2. 安装依赖库
sudo apt-get install python3-pip
pip3 install lxml
pip3 install cssselect
pip3 install twisted
配置Linux环境变量
1. 设置Python环境变量
编辑~/.bashrc
文件,并添加以下内容:
export PATH=/usr/local/bin:$PATH
export PYTHONPATH=/usr/local/lib/python3.7/site-packages
2. 更新环境变量
source ~/.bashrc
Scrapy项目的创建与部署
创建Scrapy项目
1. 创建Scrapy项目
scrapy startproject myproject
这将会创建一个名为myproject
的Scrapy项目,包含以下目录:
myproject/
:项目根目录myproject/spiders/
:存放爬虫文件myproject/settings.py
:项目设置文件myproject/items.py
:定义数据结构文件myproject/pipelines.py
:数据处理管道文件myproject/
:其他项目配置文件
2. 创建简单的Scrapy爬虫
在spiders/
目录下创建一个新的爬虫文件,例如my_spider.py
:
import scrapy
class MySpider(scrapy.Spider):
name = 'myspider'
start_urls = ['http://example.com']
def parse(self, response):
for title in response.css('div.title a::text').getall():
yield {'title': title}
3. 在Linux环境下运行Scrapy项目
运行爬虫:
cd myproject
scrapy crawl myspider
项目文件配置
1. 项目配置文件settings.py
编辑myproject/settings.py
,添加一些配置:
BOT_NAME = 'myproject'
SPIDER_MODULES = ['myproject.spiders']
NEWSPIDER_MODULE = 'myproject.spiders'
ROBOTSTXT_OBEY = True
DOWNLOAD_DELAY = 1
2. 中间件配置
在settings.py
中配置中间件:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 543,
'myproject.middlewares.MyProjectMiddleware': 544,
}
Scrapy中间件的使用
1. 自定义中间件
创建一个中间件文件,例如middlewares.py
:
from scrapy import signals
class MyProjectMiddleware:
@classmethod
def from_crawler(cls, crawler):
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
return s
def spider_opened(self, spider):
spider.logger.info('Spider opened: %s' % spider.name)
2. 中间件功能
- 用户代理代理:通过修改User-Agent来避免被封禁。
- 重试中间件:自动处理HTTP错误码,例如403或404。
- 日志记录:记录爬虫的启动信息。
1. 使用缓存
在settings.py
中启用缓存:
DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 800,
}
HTTPCACHE_ENABLED = True
HTTPCACHE_EXPIRATION_SECS = 0
HTTPCACHE_DIR = 'httpcache'
HTTPCACHE_IGNORE_HTTP_CODES = []
HTTPCACHE_IGNORE_MISSING = False
2. 调整下载延迟
在settings.py
中调整下载延迟:
DOWNLOAD_DELAY = 2
3. 限制并发请求数量
CONCURRENT_REQUESTS = 32
4. 使用Redis调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
REDIS_URL = 'redis://localhost:6379'
Scrapy数据存储与分析
数据存储到本地文件
1. 存储为CSV文件
在settings.py
中配置:
FEED_FORMAT = 'csv'
FEED_URI = 'output.csv'
2. 存储为JSON文件
FEED_FORMAT = 'json'
FEED_URI = 'output.json'
3. 存储为其他格式
FEED_FORMAT = 'xml'
FEED_URI = 'output.xml'
数据存储到数据库
1. 存储到MySQL
安装MySQL库:
pip install pymysql
在settings.py
中配置:
ITEM_PIPELINES = {'myproject.pipelines.MySQLPipeline': 1}
在pipelines.py
中定义MySQLPipeline:
import pymysql
class MySQLPipeline(object):
def open_spider(self, spider):
self.db = pymysql.connect(host='localhost', user='root', db='mydb', password='password')
self.cursor = self.db.cursor()
def process_item(self, item, spider):
sql = "INSERT INTO my_table (column1, column2) VALUES (%s, %s)"
self.cursor.execute(sql, (item['title'], item['url']))
self.db.commit()
return item
def close_spider(self, spider):
self.cursor.close()
self.db.close()
2. 存储到MongoDB
安装MongoDB库:
pip install pymongo
在settings.py
中配置:
ITEM_PIPELINES = {'myproject.pipelines.MongoPipeline': 1}
在pipelines.py
中定义MongoPipeline:
from pymongo import MongoClient
class MongoPipeline(object):
def open_spider(self, spider):
self.client = MongoClient('localhost', 27017)
self.db = self.client['mydb']
def process_item(self, item, spider):
self.db['mycollection'].insert_one(dict(item))
return item
def close_spider(self, spider):
self.client.close()
数据可视化与分析
1. 使用Matplotlib进行数据可视化
安装Matplotlib库:
pip install matplotlib
在pipelines.py
中添加数据处理:
import matplotlib.pyplot as plt
class VisualizationPipeline(object):
def open_spider(self, spider):
self.data = []
def process_item(self, item, spider):
self.data.append(item['value'])
return item
def close_spider(self, spider):
plt.hist(self.data, bins=20)
plt.savefig('histogram.png')
2. 使用Pandas进行数据处理
安装Pandas库:
pip install pandas
在pipelines.py
中处理数据:
import pandas as pd
class DataFramePipeline(object):
def open_spider(self, spider):
self.data = []
def process_item(self, item, spider):
self.data.append({'title': item['title'], 'url': item['url']})
return item
def close_spider(self, spider):
df = pd.DataFrame(self.data)
df.to_csv('output.csv', index=False)
Scrapy的安全与注意事项
遵守网站的robots.txt协议
1. Robots.txt解析
Scrapy内置的ROBOTSTXT_OBEY
设置可以帮助遵守robots.txt协议。在settings.py
中设置:
ROBOTSTXT_OBEY = True
2. 自定义解析
可以自定义解析方法:
from scrapy.spidermiddlewares.robotstxt import RobotsTxtSpiderMiddleware
class CustomRobotsTxtMiddleware:
def process_request(self, request, spider):
if not spider.robotparser:
spider.robotparser = RobotsTxtSpiderMiddleware().robotparser
if not spider.robotparser.can_fetch(spider.name, request.url):
return RequestDenial('This URL is not allowed by robots.txt')
避免被网站封禁的技巧
1. 使用代理IP
安装代理中间件:
pip install scrapy-proxies
在settings.py
中配置:
DOWNLOADER_MIDDLEWARES = {
'scrapy_proxy_pool.middlewares.ProxyPoolMiddleware': 610,
'scrapy_proxy_pool.middlewares.BanDetectionMiddleware': 620,
}
PROXY_POOL_ENABLED = True
2. 控制请求频率
在settings.py
中设置下载延迟:
DOWNLOAD_DELAY = 2
3. 验证码处理
使用第三方库处理验证码:
pip install captcha
4. 使用浏览器自动化工具
安装Selenium库:
pip install selenium
Scrapy爬虫的合法合规性
1. 知识产权保护
确保抓取的数据不侵犯版权和隐私权。
2. 遵守法律法规
遵守国家和地区的法律法规,尊重网站的使用条款。
3. 合理使用资源
合理使用网络资源,避免对网站造成不必要的负载。
4. 道德规范
遵循道德规范,不滥用爬虫技术进行非法活动。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章