简述
本节继续实现知乎关注对象用户信息,与上节不同之处在于以一个种子作为入口,循环抓取其关注头像并存储,便于后续统计分析。
目标对象
使用包
import json
import time, os
import requests
import datetime
from MSSql_SqlHelp import MSSQL
实现逻辑
1、数据表设计
因涉及数据量可能较多,单纯Excel
管理不利于维护,故设计数据表如下
2、逻辑拆分
单用户递归分页抓取,信息入库
def beginSpider(DOWNLOAD_User, pageNum):
print("抓取用户 "+ DOWNLOAD_User + " ,页码 "+ str(pageNum))
try:
json = download_page(DOWNLOAD_URL.replace('{DOWNLOAD_User}',DOWNLOAD_User).replace('{offset}',str(pageNum * 20)))
except:
print("抓取异常:" + DOWNLOAD_URL.replace('{DOWNLOAD_User}',DOWNLOAD_User).replace('{offset}',str(pageNum * 20)))
time.sleep(2) #延迟N秒再抓取
json = download_page(DOWNLOAD_URL.replace('{DOWNLOAD_User}',DOWNLOAD_User).replace('{offset}',str(pageNum * 20)))
#print(json)
#解析入库.........
#如果有下页,递归
if json["paging"]["is_end"] == False:
return pageNum + 1
return None
多用户序列状态管理
def main():
now = datetime.datetime.now()
print("开始时间:" + now.strftime('%Y-%m-%d %H:%M:%S'))
DOWNLOAD_User = getSeed() #从序列中获取下一个带抓取用户
if DOWNLOAD_User == -1:
print("无待抓取序列,程序终止")
return None
pageNum = 0
while pageNum != None:
pageNum = beginSpider(DOWNLOAD_User, pageNum)
updateUser(DOWNLOAD_User) #更新用户状态为已抓取
now = datetime.datetime.now()
print("结束时间:" + now.strftime('%Y-%m-%d %H:%M:%S'))
time.sleep(30) #延迟N秒再抓取
main()
抓取效果
总结
遇到问题
直接使用历史代码抓取时遇到无法抓取
排查步骤
1、确定请求地址正确
2、确认cookie
有效(可能近期知乎修改了cookie
验证规则,对比发现cookie
更长了)
3、确认数据解析正常
联想
1、后续爬虫程序开发,在时间充裕情况下,每次爬取预留间隔时间,减小服务器压力
2、数据分析:联想到自己注册时,唯一标识被占用的情况,后续分析下爬取数据中唯一标识使用情况分析;用户关注关系;用户头像分析
网友评论