遇到问题的主要方法就是开日志看打印和分析源代码。

1.如何找到pyspider的安装目录?

>>> import os
>>> print os.sys.path
['', '/usr/lib64/python27.zip', '/usr/lib64/python2.7', 
'/usr/lib64/python2.7/plat-linux2', '/usr/lib64/python2.7/lib-tk', 
'/usr/lib64/python2.7/lib-old', '/usr/lib64/python2.7/lib-dynload',
 '/usr/lib64/python2.7/site-packages', 
'/usr/lib64/python2.7/site-packages/tornado-4.3-py2.7-linux-x86_64.egg', 
'/usr/lib/python2.7/site-packages', 
'/usr/lib/python2.7/site-packages/cloud_init-0.7.6-py2.7.egg']

查找一下打印出的目录中的site-packages目录,可以发现pyspider的最终目录

/usr/lib/python2.7/site-packages/pyspider

2.pyspider如何开启DEBUG日志?

vim /usr/lib/python2.7/site-packages/pyspider/logging.conf
# 把所有的INFO都改成DEBUG就行了。

3.为什么我把status改成了RUNING却好像任务没执行,没获取到结果?

这其中有三道关

第一关:@every和age

@every: 表示每隔多长时间执行一次
age: 表示当前访问的网页多长时间过期,没过期就不会重新请求。

第二关: itag

class Handler(BaseHandler):
    crawl_config = {
        'itag': 'v223'
    }

不多说了,看一段代码:

schedule_age = _schedule.get('age', self.default_schedule['age'])
if _schedule.get('itag') and _schedule['itag'] != old_schedule.get('itag'):
    restart = True
elif schedule_age >= 0 and schedule_age + (old_task.get('lastcrawltime', 0) or 0) < now:
    restart = True
elif _schedule.get('force_update'):
    restart = True

意思是itag代表代码的版本号,如果你的版本号没变,默认认为你的代码没变,就不会重新开始执行任务。
因此,pyspider会依然按照@every和age限制的规则执行。你新RUN的也不行。

PS:版本号这样描述其实不严谨。但意思是这个意思;

第三关:etag

有这样一种场景, 张三觉得库里存的都是互联网上有的,删库重爬就是了,结果删除之后发现pyspider没有重新爬取。

解决方法:清除data目录下的task.db的数据

4.为什么清空task.db可以解决不重新爬取的问题?

熟悉HTTP的同学应该知道etag可以用来检测网页是否发生变化。

爬虫在爬取的时候,会找上次爬取该网页的记录,看是否有etag,
如果有,发送请求的时候会带If-Modified-Since、If-None-Match两个字段;
源码如下:

# etag
if task_fetch.get('etag', True):
    _t = None
    if isinstance(task_fetch.get('etag'), six.string_types):
        _t = task_fetch.get('etag')
    elif track_ok:
        _t = track_headers.get('etag')
    if _t and 'If-None-Match' not in fetch['headers']:
        fetch['headers']['If-None-Match'] = _t

抓包的结果如下:

GET /zjuqing/253895.html HTTP/1.1
Host: www.juqingba.cn
Accept-Language: zh-CN,zh;q=0.8
Accept-Encoding: gzip, deflate, sdch
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
Connection: keep-alive
If-Modified-Since: Fri, 04 Dec 2020 04:27:16 GMT
If-None-Match: "5fc9baa4-5885"

HTTP/1.1 304 Not Modified
Server: nginx
Date: Fri, 04 Dec 2020 10:17:24 GMT
Connection: keep-alive
Last-Modified: Fri, 04 Dec 2020 04:27:16 GMT
Vary: Accept-Encoding
ETag: "5fc9baa4-5885"
Expires: Fri, 04 Dec 2020 22:17:24 GMT
Cache-Control: max-age=43200
X-Cache: MISS

显然别人返回的是304,也就是说文件(网页)没发生变化,pyspider自然也就不会继续爬取了。
etag哪来的呢?那必然是task.db中存了,我们来看看task.db的数据结构:

taskid   'ff8e1c7fca1995e2590664682b9892fc',
project  'ymewd',
url      'https://www.juqingba.cn/zjuqing/253895_47.html',
status   2,
schedule '{"priority": 2, "itag": "v223"}',
fetch    '{}',
process  '{"callback": "detail_page"}',
track    '{
			"process":
			{
					"exception": null, "ok": true, "logs": "", "follows": 0,
					"result": "{''url'': ''h", "time": 0.031713008880615234},
					"save": {},
					"fetch": {
						"ok": true, "encoding": "gb18030",
						"status_code": 200, "time": 0.043409109115600586,
						"content": null,
						"headers": {"last-modified": "Sat, 28 Nov 2020 12:47:43 GMT", "etag": "W/\"5fc246ef-55a4\""},
						"redirect_url": null,
						"error": null
					}
			}',
lastcrawltime:  1.60704630474469590184e+09,
updatetime:     1.60704630474472093585e+09

可以看到,对于每一个网址,都有一条task记录,在track字段中记录了etag。

posted on 2020-12-07 15:23  步孤天  阅读(664)  评论(0编辑  收藏  举报