自从这两天开始学爬虫,就一直想做个爬虫爬知乎。于是就开始动手了。

知乎用户动态采取的是动态加载的方式,也就是先加载一部分的动态,要一直滑道底才会加载另一部分的动态。要爬取全部的动态,就得先获取全部的url。

我先找到了第一条url:

https://www.zhihu.com/api/v4/members/***************************/activities?limit=7&session_id=************************&after_id=*************&desktop=True
为了不泄露别人的隐私。涉及到用户信息部分我都用*来代替。
通过几个url的比对,我找到个关键的信息after_id。
这个after_id是一串n位的数字,刚开始我以为每条url之间的after_id都是有规律的,但对比了几条url之后我发现这个数字完全没有规律。那没有规律的话该怎么找出下一个url呢?
情急之下我想到一个办法,我发现after_id前几位是不变的,一直改变的是后六位数字。于是我想到,能不能遍历十万个数,每次after_id加一,这样就能找出所有的url了。
这不太可行。
冷静下来我开始分析url。打开url之后我发现回复的json数据里有一个键值‘next’,里面放的就是下一次请求的url。只要不断提取next的值,就能拿到所有的url。于是我想到了递归的方法。难点解决了,剩下的其实很快就可以完成。下面的源码:
import re
import os
import requests
import urllib
import json
allUrl=[] #全局数组,用来保存该用户所有的动态的url def getUrl(url): #递归获取用户所有的动态url
nextUrl=urllib.request.urlopen(url)
nextUrl=json.loads(nextUrl.read())
key=nextUrl['paging']
if 'next' in key: #假如还没到底
nextUrl=nextUrl['paging']['next']
allUrl.append(nextUrl)
#print(nextUrl)
getUrl(nextUrl)
else: #已经到底,停止递归
print('成功获取所有url!')
return def getArticle(): #获取文章,并将文章存入文本文件中
a=''
cnt=0
for line in allUrl:
t=urllib.request.urlopen(line)
t=json.loads(t.read())
t=t['data']
try: #异常处理,由于未知原因,爬取某个url时会出现找不到json数据里的content键,导致报错
for k in t: #提取单个url内所有文章
k1=k['target']['content']
k1=re.sub('.*?</figure>','\r\n\r\n',k1)
k1=k1.replace('</p><p>','\r\n ')
k1=k1.replace('</p>','\r\n')
k1=k1.replace('<p>','')
k1=k1.replace('<br>','')
cnt=cnt+1
a=a+k1
print('第'+str(cnt)+'个动态爬取成功')
except KeyError:
print('发生错误,此时的url为'+str(line)) file=open('D:/bbb.txt','w',encoding='gb18030',errors='ignore') #将内容写入文本,字符编码要与浏览器一致,否则会报错。
file.write(a)
file.close() getUrl(url) #参数是第一个url
getArticle()

第二个爬虫之爬取知乎用户回答和文章并将所有内容保存到txt文件中的更多相关文章

  1. 爬虫-----爬取所有国家的首都、面积 ,并保存到txt文件中

    # -*- coding:utf-8 -*- import urllib2import lxml.htmlfrom lxml import etree def main(): file = open( ...

  2. [Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

    转载自:http://blog.csdn.net/eastmount/article/details/51231852 一. 文章介绍 源码下载地址:http://download.csdn.net/ ...

  3. 利用 Scrapy 爬取知乎用户信息

    思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...

  4. Srapy 爬取知乎用户信息

    今天用scrapy框架爬取一下所有知乎用户的信息.道理很简单,找一个知乎大V(就是粉丝和关注量都很多的那种),找到他的粉丝和他关注的人的信息,然后分别再找这些人的粉丝和关注的人的信息,层层递进,这样下 ...

  5. 用python+selenium抓取微博24小时热门话题的前15个并保存到txt中

    抓取微博24小时热门话题的前15个,抓取的内容请保存至txt文件中,需要抓取排行.话题和阅读数 #coding=utf-8 from selenium import webdriver import ...

  6. 基于webmagic的爬虫小应用--爬取知乎用户信息

    听到“爬虫”,是不是第一时间想到Python/php ? 多少想玩爬虫的Java学习者就因为语言不通而止步.Java是真的不能做爬虫吗? 当然不是. 只不过python的3行代码能解决的问题,而Jav ...

  7. Scrapy爬虫笔记 - 爬取知乎

    cookie是一种本地存储机制,cookie是存储在本地的 session其实就是将用户信息用户名.密码等)加密成一串字符串,返回给浏览器,以后浏览器每次请求都带着这个sessionId 状态码一般是 ...

  8. 爬虫(十六):scrapy爬取知乎用户信息

    一:爬取思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账 ...

  9. Python 爬取生成中文词云以爬取知乎用户属性为例

    代码如下: # -*- coding:utf-8 -*- import requests import pandas as pd import time import matplotlib.pyplo ...

随机推荐

  1. [Agc030B]Tree Burning_贪心

    Tree Burning 题目链接:https://atcoder.jp/contests/agc030/tasks/agc030_b 数据范围:略. 题解: 开始以为是左右左右这样,发现过不去样例. ...

  2. PostgreSQL 修改设置数据库的默认用户以及权限.

    1. 登录PG数据库. psql -U postgres 界面效果为: [root@centos76 ~]# psql -U postgres psql (10.7) Type "help& ...

  3. javaweb关于用户是否登录全局判断,没有登录跳转到登录界面

    有这样一个需求,用户密码登录网站,在session中保留了用户的信息,但是用户很长时间没有再操作该界面,用户的session则被浏览器清除,而一些业务逻辑则是需要用到用户的信息,那么用户再执行操作后, ...

  4. 为什么要使用 SPL中的 SplQueue实现队列

    今天看php的SPL标准库部分里面涉及到数据结构其中有 SplQueue 来实现队列效果,但是我刚接触php的时候学习到的是 使用array的 array_push 和 array_pop 就可以实现 ...

  5. 基于LINUX下的进程管理问题

    什么是进程? 程序(program)放置在存储媒体中(如硬盘,光盘,软盘,磁带等)为实体文件的形态存在 进程:程序被触发后,执行者的权限与属性,程序的程序码与所需数据等都会被载入内存中,操作系统并给予 ...

  6. table html

    <html><head><title>demo-110101</title><style type="text/css"> ...

  7. android 自定义控件之NetWorkImageView 处理listview等控件中的图片加载乱序问题

    0.调用: BaseAdapter中设置方法 holder.iv.loadImage(url); adapter_xxx.xml 中 控件需要用 xxx.NetWorkImageView 1 NetW ...

  8. 错误:The following error occurred attempting to run the DNX design time process (dnx-clr-win-x86.1.0.0-rc1-final)

    其实这个错误很容易解决.设置一个startup工程即可.

  9. WinSockAPI多线程服务器

    运行效果: 程序: // TcpServer.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream&g ...

  10. Javascript的学习清单

    Javascript的学习清单 Javascript学习资源 程序员必读书籍 深入理解JavaScript系列 es6教程 jQuery中文文档 vue官网 zeptojs中文版 常用的插件与UI组件 ...