您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。