scrapy知乎爬虫mysql存储项目_Scrapy爬虫框架第八讲【项目实战篇:知乎用户信息抓取】--本文参考静觅博主所写...

思路分析:

(1)选定起始人(即选择关注数和粉丝数较多的人--大V)

(2)获取该大V的个人信息

(3)获取关注列表用户信息

(4)获取粉丝列表用户信息

(5)重复(2)(3)(4)步实现全知乎用户爬取

实战演练:

(1)、创建项目:scrapy startproject zhijutest

(2)、创建爬虫:cd zhihutest -----scrapy genspider  zhihu www.zhihu.com

(3)、选取起始人(这里我选择了以下用户)

0f38fe6cf70a0abe16c62f77201ab717.png

我们可以看到他关注的人和关注他的人,这些内容是我们(3)(4)步需要获取的

(3)、更改settings.py

0269a40801bb9980d8cf72d2f400a894.png

代码分析:这里我们设置了不遵守robots协议

robots协议:网络爬虫协议,它用来告诉用户那些内容可以爬取,那些内容禁止爬取,一般我们运行爬虫项目,首先会访问网站的robots.txt页面,它告诉爬虫那些是你可以获取的内容,这里我们为了方便,即不遵守robots协议。

c72043994cf331c9e51a5442601290db.png

代码分析:这里我们设置了User-Agent和authorization字段(这是知乎对请求头的限制了,即反爬),而这里我们通过设置模拟了在没有登陆的前提下伪装成浏览器去请求知乎

(4)、页面初步分析

右击鼠标打开chrome开发者工具选项,并选中如下箭头所指,将鼠标放在黄色标记上,我们可以发现右侧加载出了一个ajax请求

d37860b670d22f4fb6714269d33539b1.png

单击该ajax请求,得到如下页面:我们可以看见黄色部分为每位用户的详细信息的url,它包含多个参数用来存储信息

cf4fa08961b60ee24cde712c85b89c79.png

此时再将页面下滑可以看到如下信息:

7c084c0f09ce8ffb7c5ff8741b8200b2.png

该字段为上面参数的字段详情(Query String Parameters,英文好的小伙伴应该一眼发现)

(5)、更改items.py

承接上面将页面点击左侧并翻页,可以看出右侧出现了新的Ajax请求:followees:......这就是他关注者信息,通过点击Preview我们获取了网页源代码,可以发现包含了每一页的用户信息,小伙伴们可以核对下,发现信息能匹配上,我们可以从中发现每页包含20条他的关注者信息,而黑框部分就是包含每一位用户详细信息的参数,我们通过它们来定义item.py(即爬什么???)

b7c029e5341184f39b66e88d742c7286.png

修改items.py如下:

65399604ed4b7e174de165885da0e558.png

(6)、更改zhihu.py

第一步:模块导入

1 #-*- coding: utf-8 -*-

2 importjson3

4 importscrapy5

6 from ..items importUserItem7

8

9 classZhihuSpider(scrapy.Spider):10 name = 'zhihu'

11 allowed_domains = ['zhihu.com']12 start_urls = ['http://zhihu.com/']13

14 #设定起始爬取人,这里我们通过观察发现与url_token字段有关

15 start_user = 'zhouyuan'

16

17 #选取起始爬取人的页面详情信息,这里我们传入了user和include参数方便对不同的用户进行爬取

18 user_url = 'https://www.zhihu.com/api/v4/members/{user}?include={include}'

19 #用户详情参数即包含在include后面的字段

20 user_query = 'allow_message,is_followed,is_following,is_org,is_blocking,employments,answer_count,follower_count,articles_count,gender,badge[?(type=best_answerer)].topics'

21

22 #这是他的关注者的url,这里包含了每位他的关注者的url,同样我们传入了user和include参数方便对不同用户进行爬取

23 follows_url = 'https://www.zhihu.com/api/v4/members/{user}/followees?include={include}&offset={offset}&limit={limit}'

24 #他的每位关注者详情参数,即包含在include后面的字段

25 follows_query = 'data[*].answer_count,articles_count,gender,follower_count,is_followed,is_following,badge[?(type=best_answerer)].topics'

26

27 #这是他的粉丝的url,这里包含了每位他的关注者的url,同样我们传入了user和include参数方便对不同用户进行爬取

28 followers_url = 'https://www.zhihu.com/api/v4/members/{user}/followees?include={include}&offset={offset}&limit={limit}'

29 #他的每位粉丝的详情参数,即包含在include后面的字段

30 followers_query = 'data[*].answer_count,articles_count,gender,follower_count,is_followed,is_following,badge[?(type=best_answerer)].topics'

31

32 #重新定义起始爬取点的url

33 defstart_requests(self):34 #这里我们传入了将选定的大V的详情页面的url,并指定了解析函数parseUser

35 yield scrapy.Request(self.user_url.format(user=self.start_user, include=self.user_query), callback=self.parseUser)36 #这里我们传入了将选定的大V他的关注者的详情页面的url,并指定了解析函数parseFollows

37 yield scrapy.Request(self.follows_url.format(user=self.start_user, include=self.follows_query, offset=0, limit=20), callback=self.parseFollows)38 #这里我们传入了将选定的大V的粉丝的详情页面的url,并指定了解析函数parseFollowers

39 yield scrapy.Request(self.followers_url.format(user=self.start_user, include=self.followers_query, offset=0, limit=20), callback=self.parseFollowers)40

41 #爬取每一位用户详情的页面解析函数

42 defparseUser(self, response):43 #这里页面上是json字符串类型我们使用json.loads()方法将其变为文本字符串格式

44 result =json.loads(response.text)45 item =UserItem()46

47 #这里我们遍历了items.py中定义的字段并判断每位用户的详情页中的keys是否包含该字段,如包含则获取

48 for field initem.fields:49 if field inresult.keys():50 item[field] =result.get(field)51 yielditem52 #定义回调函数,爬取他的关注者与粉丝的详细信息,实现层层迭代

53 yield scrapy.Request(self.follows_url.format(user=result.get('url_token'), include=self.follows_query, offset=0, limit=20), callback=self.parseFollows)54 yield scrapy.Request(self.followers_url.format(user=result.get('url_token'), include=self.followers_query, offset=0, limit=20), callback=self.parseFollowers)55

56 #他的关注者的页面解析函数

57 defparseFollows(self, response):58 results =json.loads(response.text)59 #判断data标签下是否含有获取的文本字段的keys

60 if 'data' inresults.keys():61 for result in results.get('data'):62 yield scrapy.Request(self.user_url.format(user=result.get('url_token'), include=self.user_query), callback=self.parseUser)63 #判断页面是否翻到了最后

64 if 'paging' in results.keys() and results.get('paging').get('is_end') ==False:65 next_page = results.get('paging').get('next')66 yield scrapy.Request(next_page, callback=self.parseFollows)67

68 #他的粉丝的页面解析函数

69 defparseFollowers(self, response):70 results =json.loads(response.text)71

72 if 'data' inresults.keys():73 for result in results.get('data'):74 yield scrapy.Request(self.user_url.format(user=result.get('url_token'), include=self.user_query), callback=self.parseUser)75

76 if 'paging' in results.keys() and results.get('paging').get('is_end') ==False:77 next_page = results.get('paging').get('next')78 yield scrapy.Request(next_page, callback=self.parseFollowers)

a744c8c1385de41d741fc875a9d335b3.png

我们可以看到当我们翻到了最后is_end字段变为了True,而next字段就是下一个页面的url

(7)、运行下程序,可以看见已经在爬取了

92ebe0137cbcf67fbddce0af1acede8b.png

(8)、将结果存入Mongodb数据库

重写pipelines.py

1 importpymongo2

3 classMongoPipeline(object):4

5 collection_name = 'user'

6

7 def __init__(self, mongo_uri, mongo_db):8 self.mongo_uri =mongo_uri9 self.mongo_db =mongo_db10

11 @classmethod12 deffrom_crawler(cls, crawler):13 returncls(14 mongo_uri=crawler.settings.get('MONGO_URI'),15 mongo_db=crawler.settings.get('MONGO_DATABASE')16 )17

18 defopen_spider(self, spider):19 self.client =pymongo.MongoClient(self.mongo_uri)20 self.db =self.client[self.mongo_db]21

22 defclose_spider(self, spider):23 self.client.close()24

25 defprocess_item(self, item, spider):26 self.db['user'].update({'url_token' :item['url_token']},{'$set':item},True)

代码分析:

我们创建了名为user的集合

重写了__init__方法指定了数据库的链接地址和数据库名称

并修改了工厂类函数(具体参见上讲ITEM PIPLELIEN用法)

打开数据库并插入数据并以url_token字段对重复数据执行了更新操作

最后我们关闭了数据库

再配置下settings.py

5c7351944e54f8edc310a99f25fea792.png

bf139a6cef98aac581ef5e627d2418fd.png

再次运行程序,可以看见我们的数据就到了数据库了

098200450cda4a235f8995c6f55337a6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262375.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kali下生成web端后门

很多时候在***测试时选择web***害怕用的别人的马带有后门,这样自己的辛苦就要被别人不劳而获,很多时候我们都想拥有自己的马,那么这个时候你就应该使用kail来生成一个自己独特密码的web***了。Kali Linux自带有好几个web***生成工具&#xff…

素性测试的Miller-Rabin算法完全解析 (C语言实现、Python实现)

因为文中存在公式&#xff0c;只能用图片方式上传了&#xff01; 以下为C语言源代码&#xff1a; #include <stdio.h> typedef long long unsigned LLU; typedef int BOOL; #define TRUE 1 #define FALSE 0 BOOL isPrime(LLU n) { //这是传统的方法&#xff0c;用于与…

MongoDB源码阅读之ReplSet源码分析

1. ReplSet源码结构 rs_config.h replSet间同步设置的工具类 rs_member.h 心跳检测类和replSet成员状态的定义 rs_sync.h 同步数据类 rs.h 定义了几乎所有replSet相关的类&#xff08;Member:replSet中的节点成员&#xff0c; GhostSync&#xff1a;备份同步类&#xff0c;Rep…

C# 字符串性能

Written By Dr Herbie [2] Translated By Allen Lee Introduction 你在代码中处理字符串的方法可能会对性能产生令人吃惊的影响。程序中需要考虑两个由于使用字符串而产生的问题&#xff1a;临时字符串变量的使用和字符串连接。Background1.String是引用类型&#xff0c;在堆上…

手把手教你部署VSAN见证虚拟设备 (Cormac)

译者注&#xff1a;本文翻译自Cormac的博客&#xff0c;并未严格地逐字逐句的直译&#xff0c;如有谬误&#xff0c;万望见谅。原文见此http://cormachogan.com/2015/09/14/step-by-step-deployment-of-the-vsan-witness-appliance/现在开始在之前的帖子中我曾经介绍过见证虚拟…

PyCharm编程环境的中英文字体分别设置的好处多----一石三鸟地解决中文字体不一致、英文字体不涵盖中文字符、编程字体实用性兼顾美观性的三个问题

在编程环境&#xff08;例如Python的PyCharm&#xff09;中&#xff0c;我们希望编程环境的字体具有如下特性&#xff1a; &#xff08;1&#xff09;字体覆盖中文和英文字符。 &#xff08;2&#xff09;等宽字体&#xff0c;并且是TrueType字体&#xff0c;方便辨识代码中缩…

WordPress博客系统的安全

随着计算机网络的流行&#xff0c;越来越多的人开始创建自己的博客&#xff0c;论起博客系统&#xff0c;全球用的最多的博客系统就是wordpress&#xff08;以下简称WP&#xff09;。但是如果用过WP的人都应该知道&#xff0c;WP的站点想要做的好看&#xff0c;插件是必不可少的…

mysql为什么行数据库_关系数据表中的行称为什么?

在一个二维表中&#xff0c;水平方向的行称为元组&#xff0c;每一行是一个元组&#xff1b;元组对应表中的一个具体记录。数据元组也称为记录。一个数据表中的每一个记录均有一个惟一的编号(记录号)。一个记录也就是数据表中的一行。元组(tuple)是关系数据库中的基本概念&…

maven安装以及eclipse配置maven

http://jingyan.baidu.com/article/295430f136e8e00c7e0050b9.html 必须先下载并安装JDK&#xff0c;配置JDK的环境变量JAVA_HOME&#xff0c;否则maven将无法使用 eclipse安装maven插件后必须重新定位maven到本地maven目录 如下定位&#xff1a; 为了使得Eclipse中安装的Maven…

JS 问题集锦

【1】js页面跳转 和 js打开新窗口方法 第一种&#xff1a;<script language"javascript" type"text/javascript">window.location.href"http://www.xlfun.com/login.php?backurl"window.location.href; </script>第二种&#xff1a…

重温Observer模式--热水器·改(转载)

引言 在 C#中的委托和事件 一文的后半部分&#xff0c;我向大家讲述了Observer(观察者)模式&#xff0c;并使用委托和事件实现了这个模式。实际上&#xff0c;不使用委托和事件&#xff0c;一样可以实现Observer模式。在本文中&#xff0c;我将使用GOF的经典方式&#xff0c;再…

龙图 VP 李翀:数据化运营及云计算下的运维

文 | 龙图 VP 李翀原文地址&#xff1a;当游戏遇上大数据和云计算——谈数据化运营及云计算下的运维龙图做了8年的游戏&#xff0c;真正快速发展起来是在移动互联网这个时代。随着刀塔快速的扩张&#xff0c;我们在各个领域都遇到了非常多的之前没有想到过的状态。发现云计算其…

鼠标移动时,光标相对于对象的位置

鼠标在一个物体上移动时&#xff0c;能够计算出光标相对于任何其它对象的相对位置。 Code<Grid x:Name"LayoutRoot" Background"White"> <Grid HorizontalAlignment"Left" VerticalAlignment"Top" Name"grid1&q…

怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...

干货预警&#xff1a;所有文章都会首发于我的公众号【甜姨的奇妙冒险】&#xff0c;欢迎watch。一、来历&#xff1a;力扣从3月开始开启了每日一题打卡活动&#xff0c;于是跟风加入了打卡大军&#xff0c;这两天写评论、发题解&#xff0c;没想到反响还不错&#xff0c;收到了…

.NET平台下WEB应用程序的部署(安装数据库和自动配置)

.NET平台下WEB应用程序的部署(安装数据库和自动配置)李洪根在.NET平台下&#xff0c;部署 Web 解决方案是比较方便的。我们可以利用Visual Studio.NET 2003添加一个WEB安装项目&#xff0c;在部署的“文件系统编辑器”中添加项目的主输出和内容文件&#xff0c;非常简易地完成安…

苹果原壁纸高清_全面屏壁纸高清 | 电影经典台词截图高清

iPhonex手机壁纸高清(苹果xs壁纸&#xff0c;苹果xr壁纸&#xff0c;iPhone11壁纸&#xff0c;安卓全屏壁纸)火影壁纸高清&#xff0c;经典电影台词截图拼接壁纸&#xff0c;电影《去他妈的世界》壁纸&#xff0c;欧美电影截图加上经典台词&#xff0c;2020好看的手机壁纸&…

python字符串切片用法_详解Python字符串切片

在python中,我们定义好一个字符串,如下所示。 在python中定义个字符串然后把它赋值给一个变量。 我们可以通过下标访问单个的字符,跟所有的语言一样,下标从0开始(==,我自己都觉得写的好脑残了) 这个时候呢,我们可以通过切片的方式来截取出我们定义的字符串的一部分。 使用…

azkaban config: nodes:_关于Nordic SDK的sdk.config.h

使用MDK对Nordic SDK开发&#xff0c;离不开sdk.config.h。请看以下两个视图&#xff1a;Text Editor视图Configuration Wiard视图咋一看挺神奇的&#xff0c;配置视图话&#xff0c;方便。具体实现和规则就不一一介绍了&#xff0c;网页搜“MDK中Configuration Wiard的使用”。…

SilverLight开发系列第1步:搭建开发环境

来自 http://www.cnblogs.com/kaima/archive/2008/08/17/1269637.html 在缺乏SilverLight中文教程的今天&#xff0c;新人要入门不容易&#xff0c;所以我根据自己阅读英文原档和实践经验&#xff0c;总结一个系列。首先介绍的是开发环境的搭建。 个人强烈推荐安装英文版的开发…