Python练习

09_知乎

2017-08-16  本文已影响22人  过桥

简述

本节继续实现知乎关注对象用户信息,与上节不同之处在于以一个种子作为入口,循环抓取其关注头像并存储,便于后续统计分析。

目标对象

依旧是知乎轮子哥关注对象作为种子

使用包

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、数据分析:联想到自己注册时,唯一标识被占用的情况,后续分析下爬取数据中唯一标识使用情况分析;用户关注关系;用户头像分析

源码

spider_www.zhihu.com_following_json_DB.py
MSSql_SqlHelp.py

上一篇 下一篇

猜你喜欢

热点阅读