51Testing软件测试论坛

标题: pyspider爬取网页 [打印本页]

作者: 测试积点老人    时间: 2018-12-3 16:10
标题: pyspider爬取网页
开启爬虫
  1. pyspider
  2. #后台启动pyspider
  3. pyspider all &
复制代码
还是爬取之前那个动漫网站做对比,pyspider最大的好处是调试非常方便,只是爬取速度没得前面的快
  1. #!/usr/bin/env python
  2. # -*- encoding: utf-8 -*-
  3. # Created on 2018-06-03 21:52:13
  4. # Project: test

  5. from pyspider.libs.base_handler import *


  6. class Handler(BaseHandler):
  7.     crawl_config = {
  8.     }

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

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

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

  32.     @config(priority=2)
  33.     def detail_page(self, response):
  34.         return {
  35.             "img": response.doc('p img').attr('src')
  36.         }
复制代码
代码简单分析:
- 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) 这个是优先级设置。数字越大越先执行。






欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2