测试积点老人 发表于 2018-12-3 16:10:13

pyspider爬取网页

开启爬虫
pyspider
#后台启动pyspider
pyspider all &还是爬取之前那个动漫网站做对比,pyspider最大的好处是调试非常方便,只是爬取速度没得前面的快
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Created on 2018-06-03 21:52:13
# Project: test

from pyspider.libs.base_handler import *


class Handler(BaseHandler):
    crawl_config = {
    }

    @every(minutes=24 * 60)
    def on_start(self):
      self.crawl('http://www.mmonly.cc/ktmh/hzw/list_34_1.html', callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
      #下一页
      for each in response.doc('.title a').items():
            self.crawl(each.attr.href, callback=self.detail)
      #抓取内容页
      url = response.doc('#pageNum > a:nth-last-child(2)').attr.href
      if url:
            self.crawl(url, callback=self.index_page)

    @config(age=10 * 24 * 60 * 60)
    def detail(self, response):
      #详情页面
      #print response.doc('#contbody > div > div > a > img').attr('src')
      self.crawl(response.url+'?time=1', callback=self.detail_page)
      #其他页面
      next_url = response.doc('#nl a').attr.href
      #print next_url
      #for each in response.doc('.pages a:last').items():
      if next_url != None and not next_url.endswith('##'):
            self.crawl(next_url, callback=self.detail)

    @config(priority=2)
    def detail_page(self, response):
      return {
            "img": response.doc('p img').attr('src')
      }代码简单分析:
- def on_start(self) 方法是入口代码。当在web控制台点击run按钮时会执行此方法。
- self.crawl(url, callback=self.index_page)这个方法是调用API生成一个新的爬取任务,这个任务被添加到待抓取队列。
- def index_page(self, response) 这个方法获取一个Response对象。 response.doc是pyquery对象的一个扩展方法。pyquery是一个类似于jQuery的对象选择器。
- def detail_page(self, response)返回一个结果集对象。这个结果默认会被添加到resultdb数据库(如果启动时没有指定数据库默认调用sqlite数据库)。你也可以重写on_result(self,result)方法来指定保存位置。

更多知识:
- @every(minutes=24*60, seconds=0) 这个设置是告诉scheduler(调度器)on_start方法每天执行一次。
- @config(age=10 * 24 * 60 * 60) 这个设置告诉scheduler(调度器)这个request(请求)过期时间是10天,10天内再遇到这个请求直接忽略。这个参数也可以在self.crawl(url, age=10*24*60*60) 和 crawl_config中设置。
- @config(priority=2) 这个是优先级设置。数字越大越先执行。

页: [1]
查看完整版本: pyspider爬取网页