Python爬虫从入门到入狱之爬取知乎用户信息

news2024/12/25 9:23:17

items中的代码主要是我们要爬取的字段的定义

class UserItem(scrapy.Item):
    id \= Field()
    name \= Field()
    account\_status \= Field()
    allow\_message\= Field()
    answer\_count \= Field()
    articles\_count \= Field()
    avatar\_hue \= Field()
    avatar\_url \= Field()
    avatar\_url\_template \= Field()
    badge \= Field()
    business \= Field()
    employments \= Field()
    columns\_count \= Field()
    commercial\_question\_count \= Field()
    cover\_url \= Field()
    description \= Field()
    educations \= Field()
    favorite\_count \= Field()
    favorited\_count \= Field()
    follower\_count \= Field()
    following\_columns\_count \= Field()
    following\_favlists\_count \= Field()
    following\_question\_count \= Field()
    following\_topic\_count \= Field()
    gender \= Field()
    headline \= Field()
    hosted\_live\_count \= Field()
    is\_active \= Field()
    is\_bind\_sina \= Field()
    is\_blocked \= Field()
    is\_advertiser \= Field()
    is\_blocking \= Field()
    is\_followed \= Field()
    is\_following \= Field()
    is\_force\_renamed \= Field()
    is\_privacy\_protected \= Field()
    locations \= Field()
    is\_org \= Field()
    type \= Field()
    url \= Field()
    url\_token \= Field()
    user\_type \= Field()
    logs\_count \= Field()
    marked\_answers\_count \= Field()
    marked\_answers\_text \= Field()
    message\_thread\_token \= Field()
    mutual\_followees\_count \= Field()
    participated\_live\_count \= Field()
    pins\_count \= Field()
    question\_count \= Field()
    show\_sina\_weibo \= Field()
    thank\_from\_count \= Field()
    thank\_to\_count \= Field()
    thanked\_count \= Field()
    type \= Field()
    vote\_from\_count \= Field()
    vote\_to\_count \= Field()
    voteup\_count \= Field()

这些字段的是在用户详细信息里找到的,如下图所示,这里一共有58个字段,可以详细研究每个字段代表的意思:


关于spiders中爬虫文件zhihu.py中的主要代码

这段代码是非常重要的,主要的处理逻辑其实都是在这里

class ZhihuSpider(scrapy.Spider):
    name \= "zhihu"
    allowed\_domains \= \["www.zhihu.com"\]
    start\_urls \= \['http://www.zhihu.com/'\]
    #这里定义一个start\_user存储我们找的大V账号
    start\_user = "excited-vczh"

    #这里把查询的参数单独存储为user\_query,user\_url存储的为查询用户信息的url地址
    user\_url = "https://www.zhihu.com/api/v4/members/{user}?include={include}"
    user\_query \= "locations,employments,gender,educations,business,voteup\_count,thanked\_Count,follower\_count,following\_count,cover\_url,following\_topic\_count,following\_question\_count,following\_favlists\_count,following\_columns\_count,avatar\_hue,answer\_count,articles\_count,pins\_count,question\_count,columns\_count,commercial\_question\_count,favorite\_count,favorited\_count,logs\_count,marked\_answers\_count,marked\_answers\_text,message\_thread\_token,account\_status,is\_active,is\_bind\_phone,is\_force\_renamed,is\_bind\_sina,is\_privacy\_protected,sina\_weibo\_url,sina\_weibo\_name,show\_sina\_weibo,is\_blocking,is\_blocked,is\_following,is\_followed,mutual\_followees\_count,vote\_to\_count,vote\_from\_count,thank\_to\_count,thank\_from\_count,thanked\_count,description,hosted\_live\_count,participated\_live\_count,allow\_message,industry\_category,org\_name,org\_homepage,badge\[?(type=best\_answerer)\].topics"

    #follows\_url存储的为关注列表的url地址,fllows\_query存储的为查询参数。这里涉及到offset和limit是关于翻页的参数,0,20表示第一页
    follows\_url = "https://www.zhihu.com/api/v4/members/{user}/followees?include={include}&offset={offset}&limit={limit}"
    follows\_query \= "data%5B\*%5D.answer\_count%2Carticles\_count%2Cgender%2Cfollower\_count%2Cis\_followed%2Cis\_following%2Cbadge%5B%3F(type%3Dbest\_answerer)%5D.topics"

    #followers\_url是获取粉丝列表信息的url地址,followers\_query存储的为查询参数。
    followers\_url = "https://www.zhihu.com/api/v4/members/{user}/followers?include={include}&offset={offset}&limit={limit}"
    followers\_query \= "data%5B\*%5D.answer\_count%2Carticles\_count%2Cgender%2Cfollower\_count%2Cis\_followed%2Cis\_following%2Cbadge%5B%3F(type%3Dbest\_answerer)%5D.topics"

    def start\_requests(self):
        '''
        这里重写了start\_requests方法,分别请求了用户查询的url和关注列表的查询以及粉丝列表信息查询
        :return:
        '''
        yield Request(self.user\_url.format(user=self.start\_user,include=self.user\_query),callback=self.parse\_user)
        yield Request(self.follows\_url.format(user=self.start\_user,include=self.follows\_query,offset=0,limit=20),callback=self.parse\_follows)
        yield Request(self.followers\_url.format(user=self.start\_user,include=self.followers\_query,offset=0,limit=20),callback=self.parse\_followers)

    def parse\_user(self, response):
        '''
        因为返回的是json格式的数据,所以这里直接通过json.loads获取结果
        :param response:
        :return:
        '''
        result \= json.loads(response.text)
        item \= UserItem()
        #这里循环判断获取的字段是否在自己定义的字段中,然后进行赋值
        for field in item.fields:
            if field in result.keys():
                item\[field\] \= result.get(field)

        #这里在返回item的同时返回Request请求,继续递归拿关注用户信息的用户获取他们的关注列表
        yield item
        yield Request(self.follows\_url.format(user = result.get("url\_token"),include=self.follows\_query,offset=0,limit=20),callback=self.parse\_follows)
        yield Request(self.followers\_url.format(user = result.get("url\_token"),include=self.followers\_query,offset=0,limit=20),callback=self.parse\_followers)




    def parse\_follows(self, response):
        '''
        用户关注列表的解析,这里返回的也是json数据 这里有两个字段data和page,其中page是分页信息
        :param response:
        :return:
        '''
        results \= json.loads(response.text)

        if 'data' in results.keys():
            for result in results.get('data'):
                yield Request(self.user\_url.format(user = result.get("url\_token"),include=self.user\_query),callback=self.parse\_user)

        #这里判断page是否存在并且判断page里的参数is\_end判断是否为False,如果为False表示不是最后一页,否则则是最后一页
        if 'page' in results.keys() and results.get('is\_end') == False:
            next\_page \= results.get('paging').get("next")
            #获取下一页的地址然后通过yield继续返回Request请求,继续请求自己再次获取下页中的信息
            yield Request(next\_page,self.parse\_follows)

    def parse\_followers(self, response):
        '''
        这里其实和关乎列表的处理方法是一样的
        用户粉丝列表的解析,这里返回的也是json数据 这里有两个字段data和page,其中page是分页信息
        :param response:
        :return:
        '''
        results \= json.loads(response.text)

        if 'data' in results.keys():
            for result in results.get('data'):
                yield Request(self.user\_url.format(user = result.get("url\_token"),include=self.user\_query),callback=self.parse\_user)

        #这里判断page是否存在并且判断page里的参数is\_end判断是否为False,如果为False表示不是最后一页,否则则是最后一页
        if 'page' in results.keys() and results.get('is\_end') == False:
            next\_page \= results.get('paging').get("next")
            #获取下一页的地址然后通过yield继续返回Request请求,继续请求自己再次获取下页中的信息
            yield Request(next\_page,self.parse\_followers)

上述的代码的主要逻辑用下图分析表示:

关于上图的一个简单描述:
1. 当重写start_requests,一会有三个yield,分别的回调函数调用了parse_user,parse_follows,parse_followers,这是第一次会分别获取我们所选取的大V的信息以及关注列表信息和粉丝列表信息
2. 而parse分别会再次回调parse_follows和parse_followers信息,分别递归获取每个用户的关注列表信息和分析列表信息
3. parse_follows获取关注列表里的每个用户的信息回调了parse_user,并进行翻页获取回调了自己parse_follows
4. parse_followers获取粉丝列表里的每个用户的信息回调了parse_user,并进行翻页获取回调了自己parse_followers

通过上面的步骤实现所有用户信息的爬取,最后是关于数据的存储

关于数据存储到mongodb

这里主要是item中的数据存储到mongodb数据库中,这里主要的一个用法是就是插入的时候进行了一个去重检测

class MongoPipeline(object):

    def \_\_init\_\_(self, mongo\_uri, mongo\_db):
        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)
        self.db \= self.client\[self.mongo\_db\]

    def close\_spider(self, spider):
        self.client.close()

    def process\_item(self, item, spider):
        #这里通过mongodb进行了一个去重的操作,每次更新插入数据之前都会进行查询,判断要插入的url\_token是否已经存在,如果不存在再进行数据插入,否则放弃数据
        self.db\['user'\].update({'url\_token':item\["url\_token"\]},{'$set':item},True)
        return item
        仅作项目练习,切勿商用!!!

由于文章篇幅有限,文档资料内容较多,需要这些文档的朋友,可以加小助手微信免费获取,【保证100%免费】,中国人不骗中国人。
请添加图片描述
全套Python学习资料分享:
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。在这里插入图片描述
在这里插入图片描述
二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,还有环境配置的教程,给大家节省了很多时间。
在这里插入图片描述
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
在这里插入图片描述
四、入门学习视频全套
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
在这里插入图片描述
在这里插入图片描述
五、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述
在这里插入图片描述
好了今天的分享就到这里了

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

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

相关文章

C#——堆栈和队列详情

堆栈和队列 堆栈 堆栈类表示一个后进先出的对象集合,当需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。 关键字: Stack stack常用属性 : 属性 描述Count获取堆栈中包含的…

Qt项目天气预报(5) - 根据JSON刷新天气信息+城市匹配

刷新当天天气 我们使用如下api接入,当然需要自己去 易客云天气API免费天气API接口|天气预报接口|全球天气API接口|气象预警|空气质量 (tianqiapi.com)注册后生成自己的对应id才可以使用 //专业天气v61 http://v1.yiketianqi.com/api?unescape1&versionv61&…

如何将图片旋转任意角度?这四种方法轻松将图片旋转至任意角度!

如何将图片旋转任意角度?当我们涉及到图片时,常常会面临角度不佳的挑战,这一问题可能会给我们带来一系列不便,让我们深入探讨这些挑战,并探寻解决之道,首先,错误的角度可能导致视觉失真&#xf…

Selenium、chromedriver安装配置

Selenium、chromedriver安装配置 一、Selenium简介二、Selenium安装三、ChromeDriver的安装3.1 查看浏览器版本3.2 下载ChromeDriver3.3 环境变量配置一、Selenium简介 Selenium是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的点击、下拉等操作。对于一些JS动态渲染…

WordPress CDN是什么?CDN有什么作用?

您想让您的网站加载速度更快吗? 网站所有者希望网站加载速度快,内容丰富,功能强大,吸引用户。然而,添加这些功能可能会降低网站速度,难以快速向全球用户提供内容。 这就是为什么许多WordPress网站使用 CDN…

ElementUI table的设置成Excel表格效果

实现效果代码最重要的部分 <el-table:data"Commision"border:row-style"{height: 0}":cell-style"{padding: 0 ,lineHeight: 0}":header-cell-style"{padding: 0,height: 0,ineHeight: 0}"><el-col :span"11">&…

【学习笔记】数据结构(三)

栈和队列 文章目录 栈和队列3.1 栈 - Stack3.1.1 抽象数据类型栈的定义3.1.2 栈的表示和实现 3.2 栈的应用举例3.2.1 数制转换3.2.2 括号匹配的检验3.2.3 迷宫求解3.2.4 表达式求值 - 波兰、逆波兰3.2.5 反转一个字符串或者反转一个链表 3.3 栈与递归的实现3.4 队列 - Queue3.4…

畜牧机械5G智能制造工厂物联数字孪生平台,推进制造业数字化转型

畜牧机械5G智能制造工厂物联数字孪生平台&#xff0c;推进制造业数字化转型。畜牧机械5G智能制造工厂物联数字孪生平台&#xff0c;是近年来制造业数字化转型的杰出代表。工业物联数字孪生平台平台集成了物联网、大数据、云计算和人工智能等先进技术&#xff0c;通过高速、低延…

MES工业一体机的自动化控制技术

MES工业一体机是一种集成了物料管理、生产计划、设备管理、质量控制等功能于一身的智能化生产设备。其自动化控制技术是指通过计算机自动控制系统&#xff0c;实现对生产过程中各种参数的监测、调整和控制&#xff0c;从而提高生产效率、降低生产成本和提高产品质量的一种技术手…

Appium+python自动化(二十三)- 真假美猴王Monkeyrunner与Monkey傻傻的分不清楚(超详解)

简介 看《西游记》第五十七回&#xff0c;说是“六耳猕猴”化作孙悟空的摸样&#xff0c;伤了唐僧&#xff0c;后又和孙悟空大打出手…… 这位假孙悟空&#xff0c;实力不用多说了吧&#xff0c;和真孙悟空一般无二&#xff0c;大战孙悟空&#xff0c;闹到上天入地下海。 在唐僧…

【ai】李沐 动手深度学学v2 环境安装:anaconda3、pycharm、d2

cuda-toolkit cuda_12.5.0_windows_network.exe 官方课程网站 第二版资源下载release版本 pycharm版本 李沐 【动手学深度学习v2 PyTorch版】 课程笔记 CUDA 选择11, 实际下载 12.5.0

扫描电镜工作时镜筒内的一般真空度要求

扫描电镜&#xff08;Scanning Electron Microscope, SEM&#xff09;是一种强大的表面分析工具&#xff0c;它依赖于高度真空的环境来实现高质量的电子成像。在这篇文章中&#xff0c;我们将探讨扫描电镜在工作时所需的一般真空度要求&#xff0c;以及这些要求对成像质量的影响…

【最佳实践】Eslint 配置、使用技巧、代码检查的过程、肝这一篇就够了!

大家好&#xff0c;我是DX3906 目录 Eslint 配置 文件配置 .eslintrc.js 或者eslint.config.mjs 文件 eslintrc 总配置参考文档&#xff0c;按需使用&#xff1a; 在vscode中使用eslint插件 配置.eslintignore 文件 在setting中搜所eslint 代码检查的过程通常如下【面试…

基于java+springboot+vue实现的社团管理系统(文末源码+Lw)270

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

革新校园环境:轻空间打造上海六十中学多功能气膜馆

在现代教育环境中&#xff0c;舒适、环保和多功能的建筑越来越受到重视。上海六十中学多功能气膜馆的建设正如火如荼地进行中&#xff0c;这个项目由轻空间&#xff08;江苏&#xff09;膜科技有限公司全力打造&#xff0c;将为学校师生带来全新的活动体验。 项目进展 自项目启…

Kotlin设计模式:深入解析Facade模式

Kotlin设计模式&#xff1a;深入解析Facade模式 在软件开发中&#xff0c;随着系统复杂度的增加&#xff0c;管理和使用多个相关接口变得越来越困难。这时候&#xff0c;Facade模式&#xff08;外观模式&#xff09;就显得尤为重要。本文将深入探讨Kotlin中的Facade模式&#…

史上最全涵盖在线离线nginx安装手册(含国产信创环境下麒麟V10)

下载安装包略 下载地址&#xff1a;http://nginx.org/download/nginx-版本.tar.gz 配合下载资源食用更佳 https://download.csdn.net/download/ProGram_BlackCat/89480431 安装 tar -zxvf nginx-1.16.1.tar.gz && cd nginx-1.16.1# 创建安装目录(默认路径↓) mkdir /u…

创建App

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Django项目中&#xff0c;推荐使用App来完成不同模块的任务&#xff0c;通过执行如下命令可以启用一个应用程序。 python manage.py startapp app…

读AI新生:破解人机共存密码笔记11智能爆炸

1. 大猩猩问题 1.1. 大约1000万年前&#xff0c;现代大猩猩的祖先创造了进化出现代人类的遗传谱系 1.1.1. 它们的物种基本上没有未来&#xff0c;除了我们屈尊所允许它们拥有的未来 1.1.2. 我们不希望在超级智能机器面前处于类似的地位 1.2. 大猩猩问题就是人类是否能在一个…

LoadBalance 负载均衡

什么是负载均衡 负载均衡(Load Balance&#xff0c;简称 LB),是⾼并发,⾼可⽤系统必不可少的关键组件. 当服务流量增⼤时,通常会采⽤增加机器的⽅式进⾏扩容,负载均衡就是⽤来在多个机器或者其他资源中,按照⼀定的规则合理分配负载. 负载均衡的⼀些实现 服务多机部署时,开发⼈…