51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1213|回复: 0
打印 上一主题 下一主题

pyspider爬取网页

[复制链接]
  • TA的每日心情
    无聊
    10 小时前
  • 签到天数: 528 天

    连续签到: 1 天

    [LV.9]测试副司令

    跳转到指定楼层
    1#
    发表于 2018-12-3 16:10:13 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
    开启爬虫
    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) 这个是优先级设置。数字越大越先执行。

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-18 20:32 , Processed in 0.062686 second(s), 24 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表