文档章节

zg手册 之 scrapy 开发(7)-- 爬虫调试

 东昕
发布于 2014/05/24 22:51
字数 838
阅读 2472
收藏 5

scrapy 提供的调试方法

  1. scrapy shell 调试选择器

  2. 命令行调试 spider

  3. web 控制台(运行时)

  4. telnet 控制台(运行时查看scrapy对象,检测检测内存泄漏问题)


scrapy shell 调试选择器

可以在命令行直接启动 scrapy shell,在shell中导入scrapy内置的方法,可以对抓取的内容进行查看。

# 启动 shell,抓取豆瓣本周音乐人最热单曲榜
scrapy shell 
 
# 使用scrapy内置的选择器,通过 xpath 获取榜单的音乐名称
In [1]: musicNames=sel.xpath('//div[@class="article"]//div[@class="intro"]//a/text()').extract()

# 打印歌曲名称
In [16]: for i in musicNames: print i

# 以下内容为上面选择器命令的输出
Hello,I Love You 2014
欢迎你来大工厂demo
合欢
才华有限公司
另一个自己
Dear Mama Remix
西兰花
Now it's a brave time_New versions Mini Maton
四月挽歌
《快了个播》词:HK&拖鞋
去远方(demo)想当年(正式版)
爱情
请你嫁给我
星河小夜曲
Pi的奇幻之旅   demo

杂念 - Sleepy Cat(beat by Mr.积).
走在通往明天的路上
(路)


命令行调试 spider

写一个抓取豆瓣音乐排行榜的 spider。

from scrapy.spider import Spider
from scrapy.selector import Selector
from douban.items import DoubanItem

class MySpider(Spider):
    name = 'myspider'
    allowed_domains = ["douban.com"]
    start_urls = (
        'http://music.douban.com/chart',
        )

    def parse(self, response):
        sel = Selector(response)
        musicNames = sel.xpath('//div[@class="article"]//div[@class="intro"]//a/text()').extract()
        for musicName in musicNames:
            item = DoubanItem()
            item['musicName'] = musicName
            yield item

# 命令行指定蜘蛛抓取起始的 url,输出抓取的解析信息
scrapy parse --spider=MySpider -d 3 http://music.douban.com/chart
 
# 输出的内容(中文名称是unicode编码)
>>> STATUS DEPTH LEVEL 1 <<<
# Scraped Items  -------------------------------------------------
[{'musicName': u'Hello,I Love You 2014'},
 {'musicName': u'\u6b22\u8fce\u4f60\u6765\u5927\u5de5\u5382demo'},
 {'musicName': u'\u5408\u6b22'},
 {'musicName': u'\u624d\u534e\u6709\u9650\u516c\u53f8'},
 {'musicName': u'\u53e6\u4e00\u4e2a\u81ea\u5df1'},
 {'musicName': u'Dear Mama Remix'}, 
 {'musicName': u'\u897f\u5170\u82b1'}, 
 {'musicName': u"Now it's a brave time_New versions Mini Maton"}, 
 {'musicName': u'\u56db\u6708\u633d\u6b4c'}, 
 {'musicName': u'\u300a\u5feb\u4e86\u4e2a\u64ad\u300b\u8bcd\uff1aHK&\u62d6\u978b'}, 
 {'musicName': u'\u53bb\u8fdc\u65b9(demo)'}, 
 {'musicName': u'\u60f3\u5f53\u5e74\uff08\u6b63\u5f0f\u7248\uff09'}, 
 {'musicName': u'\u7231\u60c5'}, 
 {'musicName': u'\u8bf7\u4f60\u5ac1\u7ed9\u6211'}, 
 {'musicName': u'\u661f\u6cb3\u5c0f\u591c\u66f2'}, 
 {'musicName': u'Pi\u7684\u5947\u5e7b\u4e4b\u65c5   demo'}, 
 {'musicName': u' '}, 
 {'musicName': u'\u6742\u5ff5 - Sleepy Cat(beat by Mr.\u79ef).'}, 
 {'musicName': u'\u8d70\u5728\u901a\u5f80\u660e\u5929\u7684\u8def\u4e0a'}, 
 {'musicName': u'\uff08\u8def\uff09'}]
 
# Requests  -----------------------------------------------------
[]


web service 控制接口接单介绍

所有 web 接口使用 JSON-RPC 2.0 协议,可以在监控系统中通过 API 集成 scrapy 的状态信息。

  1. 控制爬虫进程:http://localhost:6080/crawler

  2. 查看爬虫的状态:http://localhost:6080/stats

  3. 还可以自定义查看引擎状态等接口

具体看 scrapy文档


telnet 控制台(运行时查看scrapy对象,检测内存泄漏问题)

这个最好选用 Scrapy 0.22.2 之后的版本

scrapy默认打开6023端口,telnet 连接这个端口,可以查看scrapy运行状态

telnet localhost 6023# 查看对象引用情况
>>> prefs()Live References

ExampleSpider                       1   oldest: 15s ago
HtmlResponse                       10   oldest: 600s ago
Selector                            2   oldest: 0s ago
FormRequest                       878   oldest: 7s ago

# 上面HtmlResponse已经存在10分钟,比较可疑,查看最长时间的HtmlResponse对象
>>> from scrapy.utils.trackref import get_oldest
>>> r = get_oldest('HtmlResponse')
>>> r.url
'
 
# 后面就是看代码,解决为什么上面的url对应的对象没有销毁

我在项目中使用过这个技巧,查看过下载器的队列内容,engine的状态信息,对于调试还是比较有帮助的。


zg手册 之 scrapy 开发(7)-- 爬虫调试

© 著作权归作者所有

粉丝 12
博文 22
码字总数 16965
作品 0
浦东
架构师
私信 提问
zg手册 之 scrapy 开发(6)-- extensions(扩展)开发

scrapy 扩展 扩展提供了一种机制,添加自定义的功能到 scrapy 例如,爬虫状态统计扩展,统计爬虫的运行信息 加载和运行 在 scrapy 启动时创建扩展的单一实例对象,添加扩展的配置到 settings...

东昕
2014/04/13
484
1
zg手册 之 scrapy 开发(4)-- javascript 动态页面的抓取

javascript 动态页面 目前许多网站大量运用js脚本进行一些页面的处理,这些页面的抓取对爬虫是个挑战。 这类页面的抓取,我用到了下面的方法 分析页面(firebug/chrome调试工具 等),找到a...

东昕
2014/04/02
985
2
zg手册 之 scrapy 开发(3)-- 下载中间件

下载中间件功能 这是处于引擎和下载器之间的一层组件,可以有多个下载中间件被加载运行, 在引擎传递请求给下载器的过程中,下载中间件可以对请求进行处理 (例如增加http header信息等), ...

东昕
2014/03/30
1K
0
zg手册 之 scrapy 开发(5)-- downloader(下载器)开发

为什么需要开发下载器 定向抓取时,目标站点的数据不能单次请求获取,需要3,4次或者更多,请求之间有依赖关系,就是需要连续请求完成这个下载事物 前面讲过的 js 动态页面下载 ...... 注意事...

东昕
2014/04/02
2.4K
2
使用python,scrapy写(定制)爬虫的经验,资料,杂。

近期找工作略不顺。技术无用。晚上写下了这点东西。 首先说下最近在找工作的x的大概相关技术加点路线。py 3年+,linux日常熟练,限于不擅web、手机app开发,一直无太好的可展示的东西。前段时...

斑ban
2013/12/27
18.1K
7

没有更多内容

加载失败,请刷新页面

加载更多

前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
5
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0
栈-链式(c/c++实现)

上次说“栈是在线性表演变而来的,线性表很自由,想往哪里插数据就往哪里插数据,想删哪数据就删哪数据...。但给线性表一些限制呢,就没那么自由了,把线性表的三边封起来就变成了栈,栈只能...

白客C
今天
42
0
Mybatis Plus service

/** * @author beth * @data 2019-10-20 23:34 */@RunWith(SpringRunner.class)@SpringBootTestpublic class ServiceTest { @Autowired private IUserInfoService iUserInfoS......

一个yuanbeth
今天
5
0
php7-internal 7 zval的操作

## 7.7 zval的操作 扩展中经常会用到各种类型的zval,PHP提供了很多宏用于不同类型zval的操作,尽管我们也可以自己操作zval,但这并不是一个好习惯,因为zval有很多其它用途的标识,如果自己...

冻结not
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部