zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    C指针详解(经典,非常详细)
    PL/SQL错误提示 database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
    安装Oracle报错,全部为未知!
    Oracle 支持在具有 DHCP 分配的 IP 地址的系统上进行安装
    Asp.Net页面生命周期
    oracle 导库建立测试库
    宝塔安装建站教程
    SEM理论
    SEM小总结
    SEM大致操作梳理
  • 原文地址:https://www.cnblogs.com/bugutian/p/14097329.html
Copyright © 2011-2022 走看看