python pyspider的使用方法

发布时间:2021-07-13 18:08:54 作者:chen
来源:亿速云 阅读:405
# Python PySpider的使用方法

## 一、PySpider简介

PySpider是一个强大的Python网络爬虫框架,由国人binux开发。它具有以下核心特点:

1. **分布式架构**:支持多机协同爬取
2. **可视化界面**:内置Web UI管理爬虫
3. **任务调度**:灵活的任务优先级和重试机制
4. **多种数据库支持**:MySQLMongoDBRedis等
5. **JavaScript渲染**:支持PhantomJS页面渲染

与Scrapy相比,PySpider更适合:
- 需要可视化管理的项目
- 需要监控爬虫状态的场景
- 处理JavaScript动态加载的页面

## 二、环境安装与配置

### 1. 安装准备

```bash
# 推荐使用Python 3.6+环境
pip install pyspider

# 可选依赖
pip install phantomjs requests

2. 数据库配置(以MySQL为例)

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"
}

3. 启动PySpider

# 启动服务
pyspider

# 指定端口和绑定地址
pyspider --port 5000 --address 0.0.0.0

访问Web UI:http://localhost:5000

三、基础爬虫开发

1. 项目结构解析

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()
        }

2. 核心方法说明

方法/装饰器 说明
on_start() 爬虫入口点,通常用于发起初始请求
@every() 设置任务执行频率,如@every(minutes=10)
self.crawl() 发起新的抓取请求,支持GET/POST等方法
response.doc() 使用pyquery解析HTML(类似jQuery语法)
response.json 当响应是JSON时的解析方法

3. 选择器使用示例

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()]

四、高级功能应用

1. 处理动态页面

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);
               }
               """)

2. 登录与表单提交

def login(self, response):
    return {
        'url': 'https://example.com/login',
        'method': 'POST',
        'data': {
            'username': 'admin',
            'password': 'secret'
        }
    }

3. 文件下载示例

def download_file(self, response):
    with open('output.pdf', 'wb') as f:
        f.write(response.content)

4. 代理设置

self.crawl('http://target.com',
           callback=self.parse,
           proxy='http://user:pass@proxy.example.com:8080')

五、数据存储方案

1. 保存到MySQL

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()

2. 保存到MongoDB

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)

3. 使用内置ResultDB

def detail_page(self, response):
    data = {
        'url': response.url,
        'html': response.text
    }
    self.save_data(data)  # 自动保存到配置的resultdb

六、分布式部署

1. 组件架构

Scheduler (任务调度) → Fetcher (网页抓取) → Processor (数据处理)
       ↑
    TaskDB
       ↓
    ResultDB

2. 多机部署方案

# 调度节点
pyspider --scheduler

# 抓取节点
pyspider --fetcher --xmlrpc

# 处理节点
pyspider --processor

3. 使用Redis作为消息队列

// config.json
{
  "message_queue": "redis://localhost:6379/0"
}

七、性能优化技巧

  1. 并发控制

    self.crawl(..., priority=10, age=60*10)  # 设置优先级和有效期
    
  2. 去重优化

    self.crawl(..., fingerprint='custom_id')  # 自定义指纹
    
  3. 请求间隔

    @config(rate=2)  # 每秒2个请求
    def index_page(self, response):
       ...
    
  4. 缓存利用

    pyspider --queue-maxsize=10000  # 增大内存队列
    

八、常见问题解决

1. 反爬虫绕过方案

self.crawl(...,
           headers={'User-Agent': 'Mozilla/5.0'},
           cookies={'token': 'value'},
           timeout=30,
           retries=3)

2. 验证码处理

def on_captcha(self, response):
    captcha_url = response.doc('#captcha-img').attr.src
    captcha = manual_input(captcha_url)  # 人工输入或OCR识别
    return {'captcha': captcha}

3. 监控与报警

通过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())
        }

十、最佳实践建议

  1. 遵守robots.txt:检查目标网站的爬虫政策
  2. 设置合理间隔:避免对目标服务器造成压力
  3. 异常处理:完善网络异常和解析错误的处理
  4. 增量爬取:利用itag参数实现增量更新
    
    self.crawl(..., itag=hashlib.md5(response.text.encode()).hexdigest())
    
  5. 定期维护:监控爬虫状态,及时更新选择器

PySpider的灵活性和可视化界面使其成为中大型爬虫项目的优秀选择。通过合理设计爬取策略和分布式部署,可以高效完成各种网络数据采集任务。 “`

这篇文章包含了约2600字,采用Markdown格式编写,涵盖了PySpider的安装配置、基础用法、高级功能、数据存储、分布式部署等核心内容,并提供了实用示例代码和最佳实践建议。

推荐阅读:
  1. Python3网络爬虫实战-10、爬虫框架的安装:PySpider、Scrapy
  2. Python3爬虫中pyspider框架的简介

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

python pyspider

上一篇:如何在Android手机上配置 Python 环境

下一篇:selenium库的使用方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》