目录
遇到问题的主要方法就是开日志看打印和分析源代码。
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。