单步调试没问题,但是批量爬取的时候就会漏掉很多没有爬,具体表现为没有存入数据库。
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,所以问的问题不是特别专业,希望能理解,谢谢!
用单步调试中的 taskid 去图3查看状态
大量任务为 active,看 dashboard 哪个组件阻塞了。如果你以前抓过这个页面,track 的数据是上一次的,当前状态以 status 为准。