scrapy命令和项目调试-scrapy框架4-python


在编写项目的时候,需要不断的调试代码。同时频繁大量的请求目标网站,可能触发一些安全策略,比如屏蔽IP等等。这时,需要掌握一些调试技巧。在这之前,先了解一些scrapy命令。

1、scrapy命令

scrapy命令分2类:全局命令和项目命令。

# 查看用法帮助和可用的命令
scrapy 
scrapy -h
# 查看某个命令的详细信息
scrapy <command> -h

全局命令:

命令格式描述
startprojectscrapy startproject <project_name> [project_dir]创建scrapy项目
genspiderscrapy genspider [-t template] 生成Spider
settingsscrapy settings [options]获取settings.py中的配置内容
runspiderscrapy runspider [options] <spider_file>运行spider(单独的)
shellscrapy shell [url|file]进入scrapy shell 控制台
fetchscrapy fetch [options] 获取一个URL并把结果打印到输出端
viewscrapy view [options] 获取一个URL并把结果展示在浏览器中
versionscrapy version [-v]获取scrapy版本

项目命令:

命令格式描述
crawlscrapy crawl 运行项目
checkscrapy check [-l] 进行contract检查
listscrapy list列举项目中spiders
editscrapy edit 使用预定义的EDITOR编辑spider
parsescrapy parse [options]获取给定的URL且使用spider(parse方法)处理响应

关于用于自定义命令部分,自行查阅相关文档。

2、项目调试

2.1、shell控制台调试

为了调试需要,我们把http缓存开启,在settings.py中去掉注释:

HTTPCACHE_ENABLED = True

调试的时候,一般我们在scrapy shell 控制台进行,进入控制台如下所示:

2022-02-26 20:14:28 [asyncio] DEBUG: Using selector: SelectSelector
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x000002392F0D2278>
[s]   item       {}
[s]   settings   <scrapy.settings.Settings object at 0x0000023932DE42E8>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
2022-02-26 20:14:29 [asyncio] DEBUG: Using selector: SelectSelector

  • 默认刚进入没有Request和Response对象,只有运行fetch之后,才会生成Request和Response对象,并且Request和Response只会存在一个最新的。
  1. fetch(‘http://www.qianmu.org/ranking/1528.htm’) , 请求成功,运行shelp()查看:

    2022-02-26 20:36:36 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.qianmu.org/ranking/1528.htm> (referer: None)
    
    [s]   request    <GET http://www.qianmu.org/ranking/1528.htm>
    [s]   response   <200 http://www.qianmu.org/ranking/1528.htm>
    
    
  2. 对response对象操作,比如查看类型,type(response),提取所有的大学链接

    In [4]: type(response)
    Out[4]: scrapy.http.response.html.HtmlResponse
    links = response.xpath('//div[@class="rankItem"]/table//tr[position()>1]/td[2]/a/@href').getall()
    In [6]: links
    Out[6]: 
    ['http://www.qianmu.org/%E9%BA%BB%E7%9C%81%E7%90%86%E5%B7%A5%E5%AD%A6%E9%99%A2',
     'http://www.qianmu.org/%E7%89%9B%E6%B4%A5%E5%A4%A7%E5%AD%A6',
    ...
    
    

下面我们通过scrapy shell url 来模拟scrapy 框架执行流程。

  1. scrapy shell http://www.qianmu.org/ranking/1528.htm

    [s]   request    <GET http://www.qianmu.org/ranking/1528.htm>
    [s]   response   <200 http://www.qianmu.org/ranking/1528.htm>
    [s]   settings   <scrapy.settings.Settings object at 0x000002485CF24048>
    [s]   spider     <UsinfoSpider 'usinfo' at 0x2485d21ff28>
    
    # 使用的都是我们项目的配置
    
  2. 下一步执行parse方法,属性spider类

    In [1]: result = spider.parse(response)
    
    In [2]: type(result)
    Out[2]: generator
    
    In [3]: result
    Out[3]: <generator object UsinfoSpider.parse at 0x000002485F1F19E8>
    
    
  3. 获取结果的第一个元素,其实是Requst对象

    req = list(result)[0]
    fetch(req)
    
  4. 获取第一个大学链接对应的数据

    In [8]: data = next(response)
    
    In [9]: data
    Out[9]: {'name': '麻省理工学院 '}
    
  5. 上面只是爬取一个,想要全部爬取

    reqs = list(result)
    for req in reqs
    	fetch(req)
    

到这里我们已经手动执行完了。

  • shell 控制台使用的都是项目的配置

2.2、parse命令

parse命令可以查看spider的输出,优点灵活和简单,但是不能用来调试方法内的代码。

scrapy parse --spider=myspider -c parse_item -d 2 -v <item_url>

2.3、日志

查看运行日志。

参考视频:https://www.bilibili.com/video/BV1R7411F7JV p559~p560

源代码仓库地址:https://gitee.com/gaogzhen/python-study

QQ群:433529853

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值