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

知乎用户动态采取的是动态加载的方式,也就是先加载一部分的动态,要一直滑道底才会加载另一部分的动态。要爬取全部的动态,就得先获取全部的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. fcntl和flock两个系统调用的区别

    总的来说,flock函数只能锁定整个文件,无法锁定文件的某一区域.而fcntl可以利用struct flock结构体,来实现文件里部分区域锁定的操作. 附:fcntl(文件描述词操作) 相关函数 op ...

  2. mysql中的反引号``

    [1]反引号`,数字1左边的符号.tab键上面的符号. 它是为了区分MYSQL的保留字与普通字符而引入的符号. 不加反引号建的表不能包含MYSQL保留字,否则出错 如上图,很明显的,如果我们直接建立名 ...

  3. P1040 加分二叉树(区间DP)

    (点击此处查看原题) 解题思路 题目已经给出了树的中序遍历,因此我的想法是利用中序遍历的特点:若某子树的根结点为k,那么k之前的结点组成这一子树的左子树,k之后的结点组成这一子树的右子树,可以通过不断 ...

  4. Ubuntu 18.04修改默认源为国内源

    安装Ubuntu 18.04后,使用国外源太慢了,修改为国内源会快很多. 修改阿里源为Ubuntu 18.04默认的源 备份/etc/apt/sources.list 备份 cp /etc/apt/s ...

  5. Scrapy爬虫-win7下创建运行项目

    开始的时候,我只安装了python3.5,安装不了scrapy库,网上搜了一下说是scrapy不支持python3.x 然后,我就又安装了python2.7 为了,默认使用2.7,我在环境变量path ...

  6. python-gitlab 统计代码行数

    需求:根据时间段,统计各个研发提交的代码行 实现逻辑:调用原生gitlab接口太复杂,引用python-gitlab 获取commit详情,然后进行统计 ======================= ...

  7. C# 批量设置窗体中控件状态的方法

    在开发中常遇到当点击某个按钮的时候,禁用文本框或按钮的的状态,以防止误操作,下面的代码是我已批量设置指定控件中的按钮状态的代码,同理可以延伸出很多操作. /// <summary> /// ...

  8. [转载]为什么jar包中能看见源码

    [转载]为什么jar包中能看见源码 这个也是我之前发现过的一个现象,只是之前没有研究过.今天正好在知乎看见,总结一下: 对于Maven或者Gradle项目,依赖的部分会自动从远程仓库下载源码 生成的j ...

  9. 解决微信小程序Date.parse()获取时间戳IOS显示为NaN

    ios系统不支持2018-03-29这样格式的时间导致出现的这个问题, IOS只识别2018/03/09这样的格式. 上正则 //之前的var data = '2018-03-09 12:00:00' ...

  10. Oracle对字段去重查询所有字段数据

    单个字段: select distinct(a) from tableA; 多个字段,利用max()去重  SELECT  * FROM  GM_PPU_RESIDENT_NORBASE g  WHE ...