我们的爬虫从pyspider开始说起

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我们的爬虫从pyspider开始说起相关的知识,希望对你有一定的参考价值。

  看各种爬虫文献也有好几天了,总是感觉下不了手,总结一句“提笔忘字,总是因为看的太多而写的太少”。所以从现在开始,把看到的想到的,需要总结的东西慢慢的都沉淀下来,扎扎实实的走好每一步。

  先来说这几天遇到的各种坑,好不容易找到了关于pyquery和pyspider的各种资料,准备敲到电脑上试试,结果出现了好几个问题。电脑上安装的是python3,代码是python2,转换好了环境,发现目标网站的格式变得,各种苦恼,各种困惑。或许这也是很多学习写爬虫的人总会遇到的问题。从网上下载了几本书,对照着写,结果发现各种库的调用格式都变了,真的是各种坑,各种坑,坑。。。。。

  先来看pyspider的官方docs中的第一个例子

 1 from pyspider.libs.base_handler import *
 2 
 3 
 4 class Handler(BaseHandler):
 5     crawl_config = {
 6     }
 7 
 8     @every(minutes=24 * 60)
 9     def on_start(self):
10         self.crawl(http://scrapy.org/, callback=self.index_page)    #很逗比的pyspider的案例居然爬去另一位大神之作scrapy的网站,这一行可以看作是初始化,从callback函数中可以看出调用index_page
11 
12     @config(age=10 * 24 * 60 * 60)
13     def index_page(self, response):
14         for each in response.doc(a[href^="http"]).items():         # 用pyquery解析获取初始链接中的每一个超级链接,对每一个链接再调用detail_page,需要注意的是如果需要翻页的话,在翻页的链接上再调用index_page
15             self.crawl(each.attr.href, callback=self.detail_page)    
16 
17     @config(priority=2)
18     def detail_page(self, response):    #在detail_page页面中获取 url和title,并返回
19         return {
20             "url": response.url,
21             "title": response.doc(title).text(),
22         }
  • def on_start(self) 是爬虫的入口,当点击run时显示的第一个页面
  • self.crawl(url, callback=self.index_page)*  是程序最重要的接口。它添加了一个新的爬去任务。需要注意的是self.crawl 中有很多参数可以自己设置。
  • def index_page(self, response)返回一个 Response* 对象. response.doc*pyquery 对象,这个对象就像 jQuery的 API 一样获取元素。
  • def detail_page(self, response)返回字典对象. 这个结果默认由resultdb获取. 可以通过改写 on_result(self, result)方法处理存储方式。

官方docs中爬取 http://www.imdb.com的爬虫也因为IMDB的改版已经不能使用,顺手调试了一下代码

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2015-01-04 03:08:55
# Project: tutorial_imdb

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    """
    It‘s a sample scrape script of pyspider tutorial: Level 1: html and CSS Selector
    http://docs.pyspider.org/en/latest/tutorial/HTML-and-CSS-Selector/
    """

    @every(minutes=24 * 60)
    def on_start(self):
        self.crawl(http://www.imdb.com/search/title?count=100&title_type=feature,tv_series,tv_movie&ref_=nv_ch_mm_1, callback=self.index_page)

         
    @config(age=24 * 60 * 60)
    def index_page(self, response):
        for each in response.doc(a[href^="http"]).items():
            for each in response.doc(h3.lister-item-header a).items():   把官方文档中的正则表达式改成了css path,这样看起来容易理解多了
                self.crawl(each.attr.href, priority=9, callback=self.detail_page)
        self.crawl([x.attr.href for x in response.doc(.next-page).items()], callback=self.index_page)

         
        
    def detail_page(self, response):
        return {
            "url": response.url,
            "title": response.doc(div.title_wrapper h1).text(),
            "rating": response.doc(div.ratingValue strong span).text(),
            "stars": [x.text() for x in response.doc(div.credit_summary_item span a span.itemprop).items()],
        }

进一步分析IMDB网站就会发现,影片详细信息页面下面的很多是不能够用csspath抓取的,需要进一步解析,明天再来(*^_^*)

以上是关于我们的爬虫从pyspider开始说起的主要内容,如果未能解决你的问题,请参考以下文章

python网络爬虫学习利用Pyspider+Phantomjs爬取淘宝模特图片

爬虫框架pyspider的使用

高效率爬虫框架之 pyspider

pyspider爬虫框架

Python pyspider 安装与开发

爬虫入门12Pyspider框架入门—Ajax和HTTP