环境需求

基础环境沿用之前的环境,只是增加了MongoDB(非关系型数据库)和PyMongo(Python 的 MongoDB 连接库),默认我认为大家都已经安装好并启动 了MongoDB 服务。

测试爬虫效果

我这里先写一个简单的爬虫,爬取用户的关注人数和粉丝数,代码如下:

import scrapy​class ZhuHuSpider(scrapy.Spider): """ 知乎爬虫 """ name = 'zhuhu' allowed_domains = ['zhihu.com'] start_urls = ['https://www.zhihu.com/people/wo-he-shui-jiu-xing/following']​ def parse(self, response): # 他关注的人数 tnum = response.css("strong.NumberBoard-itemValue::text").extract()[0] # 粉丝数 fnum = response.css("strong.NumberBoard-itemValue::text").extract()[1] print("他关注的人数为:%s" % tnum) print("他粉丝的人数为:%s" % fnum)

pychram中运行的结果如下:

出现500错误了,我们加上headers再试试,我们直接在settings.py中设置,如下:

再次执行看看结果:

这次就正常获取到我们需要的信息了

爬取分析

我们就用中本聪的主页作为分析入口吧,主页如下:

https://www.zhihu.com/people/satoshi_nakamoto/following

分析用户关注列表如下:

鼠标放到用户图像上,会显示详细信息如下:

这里要注意我用的是火狐浏览器,选择网络--XHR来获取信息

ajax技术的核心是XMLHttpRequest对象(简称XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现。XHR为向服务器发送请求和解析服务器响应提供了流畅的接口,能够以异步方式从服务器取得更多信息,意味着用户单击后,可以不必刷新页面也能取得新数据。

通过上面的请求我们可以获取的连接如下:

#用户详细信息https://www.zhihu.com/api/v4/members/li-kang-65?include=allow_message,is_followed,is_following,is_org,is_blocking,employments,answer_count,follower_count,articles_count,gender,badge[?(type=best_answerer)].topics​https://www.zhihu.com/api/v4/members/jin-xiao-94-7?include=allow_message,is_followed,is_following,is_org,is_blocking,employments,answer_count,follower_count,articles_count,gender,badge[?(type=best_answerer)].topics​#关注的人信息https://www.zhihu.com/api/v4/members/satoshi_nakamoto/followees?include=data[*].answer_count,articles_count,gender,follower_count,is_followed,is_following,badge[?(type=best_answerer)].topics&offset=0&limit=20

通过分析上面的链接可以看出

1.用户详细信息链接组成:https://www.zhihu.com/api/v4/members/{user}?include={include}

其中user是用户的url_token,include是allow_message,is_followed,is_following,is_org,is_blocking,employments,answer_count,follower_count,articles_count,gender,badge[?(type=best_answerer)].topics

2.关注人信息链接组成:https://www.zhihu.com/api/v4/members/satoshi_nakamoto/followees?include={include}&offset={offset}&limit={limit}

其中include为data[*].answer_count,articles_count,gender,follower_count,is_followed,is_following,badge[?(type=best_answerer)].topics,offset为分页偏移量,limit为每页用户数量,可以通过下图看出:

第一页

第二页

第三页

开始爬取

我们还是先写一个简易的爬虫,把功能先实现,代码如下:

import scrapy​class ZhuHuSpider(scrapy.Spider): """ 知乎爬虫 """ name = 'zhuhu' allowed_domains = ['zhihu.com'] # 用户详细信息地址 user_detail = 'https://www.zhihu.com/api/v4/members/{user}?include={include}' # 用户详细信息中的include user_include = 'allow_message,is_followed,'  'is_following,'  'is_org,is_blocking,'  'employments,'  'answer_count,'  'follower_count,'  'articles_count,'  'gender,'  'badge[?(type=best_answerer)].topics' # 关注的人地址 follow_url = 'https://www.zhihu.com/api/v4/members/{user}/followees?include={include}&offset={offset}&limit={limit}' # 关注的人include follow_include = 'data[*].answer_count,'  'articles_count,'  'gender,'  'follower_count,'  'is_followed,'  'is_following,'  'badge[?(type=best_answerer)].topics' # 初始user start_user = 'satoshi_nakamoto'​ def start_requests(self): # 这里重新定义start_requests方法,注意这里的format用法 yield scrapy.Request(self.user_detail.format(user=self.start_user, include=self.user_include), callback=self.parse_user) yield scrapy.Request(self.follow_url.format(user=self.start_user, include=self.follow_include, offset=20, limit=20), callback=self.parse_follow)​ def parse_user(self, response): print('user:%s' % response.text)​ def parse_follow(self, response): print('follow:%s' % response.text)

输出结果如下:

这里需要注意的是authorization信息一定要在headers中添加,不然会报错,authorization在headers中的形式如下:

.测试发现authorization值在一段时间内是不会发生变化的,是否永久不变还有待考证。

parse_user编写

parse_user方法用来解析用户的详细数据,存储并发现此用户的关注列表,返回给parse_follow方法来处理,用户详细存储字段如下:

为了省事我把所有字段都添加到items.py中(如果运行spider后报错,提示字段未找到,就将那个字段添加进来即可),如下:

class UserItem(scrapy.Item): """ 定义了响应报文中json的字段 """ is_followed = scrapy.Field() avatar_url_template = scrapy.Field() user_type = scrapy.Field() answer_count = scrapy.Field() is_following = scrapy.Field() url = scrapy.Field() type = scrapy.Field() url_token = scrapy.Field() id = scrapy.Field() allow_message = scrapy.Field() articles_count = scrapy.Field() is_blocking = scrapy.Field() name = scrapy.Field() headline = scrapy.Field() gender = scrapy.Field() avatar_url = scrapy.Field() follower_count = scrapy.Field() is_org = scrapy.Field() employments = scrapy.Field() badge = scrapy.Field() is_advertiser = scrapy.Field()

parse_user方法代码如下:

 def parse_user(self, response): """ 解析用户详细信息方法 :param response: 获取的内容,转化为json格式 """ # 通过json.loads方式转换为json格式 results = json.loads(response.text) # 引入item类 item = UserItem() # 通过循环判断字段是否存在,存在将结果存入items中 for field in item.fields: if field in results.keys(): item[field] = results.get(field) # 直接返回item yield item # 将获取的用户通过format方式组合成新的url,调用callback函数交给parse_follow方法解析 yield scrapy.Request(self.follows_url.format(user=results.get('url_token'), include=self.follow_include, offset=0, limit=20), callback=self.parse_follow)

parse_follow方法编写

首先也要将获取的response转换为json格式,获取关注的用户,对每一个用户继续爬取,同时也要处理分页。可以看下面两个图:

重新编写后的parse_follow方法如下:

 def parse_follow(self, response): """ 解析关注的人列表方法 """ # 格式化response results = json.loads(response.text) # 判断data是否存在,如果存在就继续调用parse_user解析用户详细信息 if 'data' in results.keys(): for result in results.get('data'): yield scrapy.Request(self.user_detail.format(user=result.get('url_token'), include=self.user_include), callback=self.parse_user) # 判断paging是否存在,如果存在并且is_end参数为False,则继续爬取下一页,如果is_end为True,说明为最后一页 if 'paging' in results.keys() and results.get('paging').get('is_end') == False: next_page = results.get('paging').get('next') yield scrapy.Request(next_page, callback=self.parse_follow)

运行爬虫后的结果如下图:

可以看到一直在获取内容。

存入mongodb

item pipeline

存储使用MongoDB,我们需要修改Item Pipeline,参照官网示例修改的代码如下:

class ZhiHuspiderPipeline(object): """ 知乎数据存入monogodb数据库类,参考官网示例 """​ collection_name = 'user'​ def __init__(self, mongo_uri, mongo_db): """ 初始化参数 :param mongo_uri:mongo uri :param mongo_db: db name """ self.mongo_uri = mongo_uri self.mongo_db = mongo_db​ @classmethod def from_crawler(cls, crawler): return cls( mongo_uri=crawler.settings.get('MONGO_URI'), mongo_db=crawler.settings.get('MONGO_DATABASE', 'items') )​ def open_spider(self, spider): # 打开连接 self.client = pymongo.MongoClient(self.mongo_uri) # db_auth因为我的mongodb设置了认证,所以需要这两步,未设置可以注释 self.db_auth = self.client.admin self.db_auth.authenticate("admin

java mongodb 返回所有field_Python爬虫框架:scrapy爬取知乎关注用户存入mongodb相关推荐

  1. yield python3 知乎_运维学python之爬虫高级篇(七)scrapy爬取知乎关注用户存入mongodb...

    首先,祝大家开工大吉! 本篇将要介绍的是从一个用户开始,通过抓关注列表和粉丝列表,实现用户的详细信息抓取并将抓取到的结果存储到 MongoDB. 1 环境需求 基础环境沿用之前的环境,只是增加了Mon ...

  2. python爬虫scrapy爬取新闻标题及链接_python爬虫框架scrapy爬取梅花网资讯信息

    原标题:python爬虫框架scrapy爬取梅花网资讯信息 一.介绍 本例子用scrapy-splash爬取梅花网(http://www.meihua.info/a/list/today)的资讯信息, ...

  3. 用 Python 爬虫框架 Scrapy 爬取心目中的女神

    From :http://www.cnblogs.com/wanghzh/p/5824181.html 本博文将带领你从入门到精通爬虫框架 Scrapy,最终具备爬取任何网页的数据的能力. 本文以校花 ...

  4. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

  5. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  6. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...

  7. Scrapy爬取知乎Python专题精华,连答主头像都给爬下来,不放过一切

    前些天写的一篇"我与Scrapy的初次相识,理论+实战入门Scrapy "都上首页推荐了,到现在浏览量还没破百,难受. 写的不好大概,不过只要有一人看,都是鼓励,一直写,一直积淀, ...

  8. Scrapy爬取知乎用户信息以及人际拓扑关系

    Scrapy爬取知乎用户信息以及人际拓扑关系 1.生成项目 scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码. 打开命令行,执行:scrapy sta ...

  9. Python 网络爬虫实战:爬取知乎回答中的全部图片

    平时逛知乎的时候,经常能看到很多很棒的图片,精美的壁纸,搞笑的表情包,有趣的截图等等,总有想全部保存下来的冲动. 于是在一个小老弟的拜托之下,我把之前的知乎爬虫改造了一下,改装成了一个可以下载知乎回答 ...

最新文章

  1. Ubuntu 中sendmail 的安装、配置与发送邮件的具体实现
  2. Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
  3. pytorch:一维线性回归(二)
  4. scrapy框架-post使用
  5. cuSPARSE库:(八)cusparseGetStream()
  6. 再次测试用OLW本地的桌面应用撰写博客园博文
  7. 对症下药,方能药到病除——如何修复drv?
  8. Android SDK的安装教程
  9. IE css hack整理
  10. linux以命令行下配置连接wlan无线网卡
  11. ETL过程中数据清洗(脏数据处理)小结
  12. 终于!疫情之下,第一批企业没能熬住面临倒闭,员工被遣散,没能等来春暖花开!
  13. 面试 增删改查用的java知识,工作3年的程序员,面试还说自己只会增删改查?这些高频面试题还不看起来!...
  14. HDU 4379 The More The Better
  15. 粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
  16. W ndows7怎么进入BlOS,windows7怎么打开bios设置CPU?
  17. 前端常见的三种缓存方式
  18. 在mac上面运行cherrytree
  19. duilib 动态多语言支持
  20. win10回收站清空了怎么恢复?解决它很简单

热门文章

  1. dbus PHP,安装dbus-python的简要教程
  2. linux7.0安装过程详解,图解红旗Linux7.0安装过程.doc
  3. cnpm能用npm install吗_指纹锁一般能用几年? 指纹锁没电了怎么办
  4. macaca使用中问题解决方法整理
  5. 记一次尴尬的git reset丢失分支故障
  6. 搭建大数据开发环境-Hadoop篇
  7. 网络、通信术语及概念
  8. rel=nofollow
  9. 实例:使用纹理对象创建Sprite对象
  10. 中国移动神州行5元卡普遍缺货