您的位置:首页 > 其它

pyspider 使用过程中遇到的一些坑

2016-05-22 11:39 211 查看

1. 前言

最近在玩爬虫, 使用最基本的urllib库来爬取静态网页的方法, 我们基本已经掌握了, 于是觉得应该整个框架玩玩, 于是看到了pyspider, 这是一个国内的大神写的一个框架, 非常好用, 不过毕竟新手, 使用的时候, 还是遇到不少问题, 这里做一个整理

2. 练手项目

我们这里选用的练手项目是 爬取 豆瓣电影上的电影信息, 作者给出教程我也转载了过来 http://blog.csdn.net/zhyh1435589631/article/details/51474203

3. 遇到的各种问题

pip 安装

我们尝试了各种安装的手段, 使用 get_pip.py, 或者 easy_install 都不行, 后来经过实验室同学提醒发现, 原来是我们实验室设置的网络出口有问题, 给跪了。。。。(改成教育网出口, 就好了)

pyspider : failed to create process



我们原先安装的python版本是2.7.5, 安装pyspider 的过程中也没有任何报错, 于是很苦恼, 重新下载了一个 python 新版本的 2.7.11 问题解决, 于是以为是版本问题, 可是今天在 centos 7 上面, 也是 python 2.7.5 却又是可以使用的了, 感觉有些灵异。。。。。

pyspider: connect to scheduler rpc error: error(10061, ”)



这个问题, 尝试了很久都没有解决, 最终的处理方式是, 换操作系统, ie, 在windows 上面实现不了, 同样的框架代码到linux 上可以完美运行, 基本可以认定, 当前版本的pyspider 对windows 支持不是很好。

HTTPError: HTTP 599: SSL certificate problem: self signed certificate in certi…

这个问题, 我们采用的是忽略证书, 为crawl 方法添加参数 validate_cert = False, 即可

css 选择器

pyspider 可以匹配相应的字符串, 支持css 选择器功能, 但是需要注意的是 在chrome 中 对tbody 的渲染支持不好, 因而css 选择器参数中 请不要使用 tbody 标签进行筛选

关于css 选择器的资料可以看看这个链接中的内容 http://www.w3schools.com/cssref/css_selectors.asp

4. 运行效果(centos 7)





5. 最终实现代码

需要注意crawl 方法用来抓取页面, callback 为抓取页面后的回调函数

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2016-05-21 20:21:32
# Project: tutorial_douban_moive

from pyspider.libs.base_handler import *
import re

class Handler(BaseHandler):
crawl_config = {
}

@every(minutes=24 * 60)
def on_start(self):
url = "http://movie.douban.com/tag/"
self.crawl(url, callback=self.index_page, validate_cert = False)

@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
for each in response.doc('a[href^="http"]').items():
if re.match("https://movie.douban.com/tag/\w+", each.attr.href, re.U):
self.crawl(each.attr.href, callback=self.list_page, validate_cert = False)

def list_page(self, response):
for each in response.doc('#content > div > div.article > div > table  tr > td > div > a').items():
#print each
self.crawl(each.attr.href, callback=self.detail_page, validate_cert = False)

@config(priority=2)
def detail_page(self, response):
return {
"url": response.url,
"title": response.doc('#content > h1 > span').text(),
"rating": response.doc('#interest_sectl > div.rating_wrap.clearbox > div.rating_self.clearfix > strong').text(),
"director": [x.text() for x in response.doc('#info > span:nth-child(1) > span.attrs > a').items()],
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  爬虫 pyspider