pyspider常見問題匯總


遇到問題的主要方法就是開日志看打印和分析源代碼。

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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM