您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Python PySpider的使用方法
## 一、PySpider简介
PySpider是一个强大的Python网络爬虫框架,由国人binux开发。它具有以下核心特点:
1. **分布式架构**:支持多机协同爬取
2. **可视化界面**:内置Web UI管理爬虫
3. **任务调度**:灵活的任务优先级和重试机制
4. **多种数据库支持**:MySQL、MongoDB、Redis等
5. **JavaScript渲染**:支持PhantomJS页面渲染
与Scrapy相比,PySpider更适合:
- 需要可视化管理的项目
- 需要监控爬虫状态的场景
- 处理JavaScript动态加载的页面
## 二、环境安装与配置
### 1. 安装准备
```bash
# 推荐使用Python 3.6+环境
pip install pyspider
# 可选依赖
pip install phantomjs requests
在config.json中添加配置:
{
  "taskdb": "mysql+taskdb://username:password@host:port/taskdb",
  "projectdb": "mysql+projectdb://username:password@host:port/projectdb",
  "resultdb": "mysql+resultdb://username:password@host:port/resultdb"
}
# 启动服务
pyspider
# 指定端口和绑定地址
pyspider --port 5000 --address 0.0.0.0
访问Web UI:http://localhost:5000
PySpider爬虫基本结构:
from pyspider.libs.base_handler import *
class MySpider(BaseHandler):
    
    @every(minutes=24*60)  # 定时设置
    def on_start(self):
        self.crawl('http://example.com', callback=self.index_page)
    
    def index_page(self, response):
        for each in response.doc('a[href^="http"]').items():
            self.crawl(each.attr.href, callback=self.detail_page)
    
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc('title').text()
        }
| 方法/装饰器 | 说明 | 
|---|---|
on_start() | 
爬虫入口点,通常用于发起初始请求 | 
@every() | 
设置任务执行频率,如@every(minutes=10) | 
self.crawl() | 
发起新的抓取请求,支持GET/POST等方法 | 
response.doc() | 
使用pyquery解析HTML(类似jQuery语法) | 
response.json | 
当响应是JSON时的解析方法 | 
def parse(self, response):
    # CSS选择器
    titles = response.doc('div.title > a').text()
    
    # XPath选择器
    links = response.doc('//a[@class="external"]').attr('href')
    
    # 正则表达式
    ids = re.findall(r'id=(\d+)', response.text)
    
    # 属性提取
    images = [img.attr.src for img in response.doc('img').items()]
def on_start(self):
    self.crawl('http://dynamic.site.com',
               callback=self.index_page,
               fetch_type='js',  # 启用JavaScript渲染
               js_script="""
               function() {
                   window.scrollTo(0, document.body.scrollHeight);
               }
               """)
def login(self, response):
    return {
        'url': 'https://example.com/login',
        'method': 'POST',
        'data': {
            'username': 'admin',
            'password': 'secret'
        }
    }
def download_file(self, response):
    with open('output.pdf', 'wb') as f:
        f.write(response.content)
self.crawl('http://target.com',
           callback=self.parse,
           proxy='http://user:pass@proxy.example.com:8080')
import pymysql
def on_result(self, result):
    if not result: return
    
    conn = pymysql.connect(host='localhost',
                           user='root',
                           password='',
                           db='spider_data')
    try:
        with conn.cursor() as cursor:
            sql = "INSERT INTO pages(url, title) VALUES(%s, %s)"
            cursor.execute(sql, (result['url'], result['title']))
        conn.commit()
    finally:
        conn.close()
from pymongo import MongoClient
def __init__(self):
    self.client = MongoClient('mongodb://localhost:27017/')
    self.db = self.client['spider_db']
    
def on_result(self, result):
    self.db.pages.insert_one(result)
def detail_page(self, response):
    data = {
        'url': response.url,
        'html': response.text
    }
    self.save_data(data)  # 自动保存到配置的resultdb
Scheduler (任务调度) → Fetcher (网页抓取) → Processor (数据处理)
       ↑
    TaskDB
       ↓
    ResultDB
# 调度节点
pyspider --scheduler
# 抓取节点
pyspider --fetcher --xmlrpc
# 处理节点
pyspider --processor
// config.json
{
  "message_queue": "redis://localhost:6379/0"
}
并发控制:
self.crawl(..., priority=10, age=60*10)  # 设置优先级和有效期
去重优化:
self.crawl(..., fingerprint='custom_id')  # 自定义指纹
请求间隔:
@config(rate=2)  # 每秒2个请求
def index_page(self, response):
   ...
缓存利用:
pyspider --queue-maxsize=10000  # 增大内存队列
self.crawl(...,
           headers={'User-Agent': 'Mozilla/5.0'},
           cookies={'token': 'value'},
           timeout=30,
           retries=3)
def on_captcha(self, response):
    captcha_url = response.doc('#captcha-img').attr.src
    captcha = manual_input(captcha_url)  # 人工输入或OCR识别
    return {'captcha': captcha}
通过Web UI可以: - 查看实时抓取状态 - 监控请求成功率 - 设置邮件报警(需配置SMTP)
class AmazonSpider(BaseHandler):
    
    crawl_config = {
        'headers': {
            'User-Agent': 'Mozilla/5.0',
            'Accept-Language': 'en-US,en;q=0.9'
        }
    }
    
    @every(hours=12)
    def on_start(self):
        self.crawl('https://www.amazon.com/s?k=python',
                   callback=self.list_page)
    
    def list_page(self, response):
        for item in response.doc('.s-result-item').items():
            self.crawl(item.find('a').attr.href,
                      callback=self.detail_page)
        
        # 翻页处理
        next_page = response.doc('.a-last > a').attr.href
        if next_page:
            self.crawl(next_page, callback=self.list_page)
    
    def detail_page(self, response):
        return {
            'title': response.doc('#productTitle').text().strip(),
            'price': response.doc('#priceblock_ourprice').text(),
            'rating': response.doc('#acrPopover').attr('title'),
            'timestamp': int(time.time())
        }
itag参数实现增量更新
self.crawl(..., itag=hashlib.md5(response.text.encode()).hexdigest())
PySpider的灵活性和可视化界面使其成为中大型爬虫项目的优秀选择。通过合理设计爬取策略和分布式部署,可以高效完成各种网络数据采集任务。 “`
这篇文章包含了约2600字,采用Markdown格式编写,涵盖了PySpider的安装配置、基础用法、高级功能、数据存储、分布式部署等核心内容,并提供了实用示例代码和最佳实践建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。