在web调试界面单步调试没问题,但是点击run后批量爬取就会有部分漏爬,为什么?

单步调试没问题,但是批量爬取的时候就会漏掉很多没有爬,具体表现为没有存入数据库。
1:下面是调试界面,可以抓到get请求的链接2491个,都是返回的json串信息,然后单步调试是可以一个一个的抓到,并且保存到数据库里面,但是现在的问题是不知道为什么批量爬就会有很多漏爬。。。图片描述

:
2:这是active task界面,为什么状态是active状态,而不是success状态,但是点进去还是显示爬取成功了,数据库里面也有数据。图片描述

图片描述

3:关于重复爬取的问题,想问问,假设我想开始完整爬一次(就是爬取全部内容),然后每隔10分钟再爬取(爬取更新后的内容),具体应该怎么操作?直接设置age = 10*60吗?

下面是代码:

from pyspider.libs.base_handler import *
import MySQLdb
import json

# 定义常量
host = '127.0.0.1'
username = 'root'
password = ''
dbname = 'wulong'

class Handler(BaseHandler):
    crawl_config = {
    }

    def on_start(self):
        self.crawl('http://www.shgtj.gov.cn/tdgl/jsydsp/', callback=self.index_page,fetch_type='js')

    @config(age=10 * 24 * 60 * 60)
    def index_page(self, response):
        maxPage = int(response.doc('span:nth-child(4) > label').text())
        print "一共有%s页"%(maxPage)
        
        '''
        获取到页面一共有的页面,分析出本页面是get请求
        get的请求的url为:http://www.shgtj.gov.cn/i/tdgl/spjg?pn=1&ps=15&pzsj=0
        pn后面的数字即为页码,ps后面的数字为每页显示信息的条数
        那么现在只需要爬取get的url的json数据,获取数据然后解析,最后存到数据库中
        '''
        for i in range(1,maxPage+1):
            self.crawl('http://www.shgtj.gov.cn/i/tdgl/spjg?pn=%d&ps=15&pzsj=0'%i,callback=self.json_parser,auto_recrawl=True,age = 10,force_update = True)
        
    @config(priority=2)
    def json_parser(self, response):
        '''
        response获取的数据为json格式,现在只需要进行json解析即可
        json解析需要导入json模块
        由于每页有15行信息,因此需要循环解析
        解析后的数据放入数据库即可
        '''
        db = MySQLdb.connect(host,username,password,dbname,charset = 'utf8')
        cu = db.cursor()
        sql1 = "CREATE TABLE IF NOT EXISTS GTJ_JSYDSP(XMMC TEXT , YDDW TEXT , SLSX TEXT ,WH VARCHAR(50) PRIMARY KEY, PZSJ TEXT)default character set utf8;"
        cu.execute(sql1)
        for i in range(0,15):
            # 解析的数据是Unicode类型,需要转换为utf8类型,type(变量)查看变量类型
            xmmc = response.json['data']['list'][i]['xmmc'].encode('utf8')
            yddw = response.json['data']['list'][i]['yddw'].encode('utf8')
            slsx = response.json['data']['list'][i]['slsx'].encode('utf8')
            wh = response.json['data']['list'][i]['wh'].encode('utf8')
            pzsj = response.json['data']['list'][i]['pzsj'].encode('utf8')
            print xmmc,yddw,slsx,wh,pzsj
            print type(wh)
            sql2 = "REPLACE INTO GTJ_JSYDSP(XMMC,YDDW,SLSX,WH,PZSJ) VALUES('%s','%s','%s','%s','%s')"%(xmmc,yddw,slsx,wh,pzsj)
            cu.execute(sql2)
            db.commit()
        db.close()
        

新手,刚开始接触pyspider,所以问的问题不是特别专业,希望能理解,谢谢!

阅读 3.6k
1 个回答
  1. 用单步调试中的 taskid 去图3查看状态

  2. 大量任务为 active,看 dashboard 哪个组件阻塞了。如果你以前抓过这个页面,track 的数据是上一次的,当前状态以 status 为准。

@every(10)
def on_start(...):
    ...
@config(age=10*60)
def index_page(...):
    ...
@config(priority=2, age=10*60)
def json_parser(...):
    ...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏