上文介绍了爬取知乎问题信息的整个过程,这里介绍下爬取问题下所有答案的内容和图片,大致过程相同,部分核心代码不同.

爬取一个问题的所有内容流程大致如下:

  • 一个问题url
  • 请求url,获取问题下的答案个数(我不需要,因为之前获取问题信息的时候保存了问题的回答个数)
  • 通过答案的接口去获取答案(如果一次获取5个答案,总计100个答案,需要计算的出访问20次答案接口)[答案的接口地址如下图所示]
  • 答案接口返回的内容保存到mysql
  • 提取内容中的图片地址,保存到本地

爬取代码:

从mysql库中查到question的id, 然后直接访问 答案接口 去获取数据.

  1. answer_template="https://www.zhihu.com/api/v4/questions/%s/answers?include=data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_
  2. comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp;data[*].mark_infos[*].url;dat
  3. a[*].author.follower_count,badge[?(type=best_answerer)].topics&limit=5&offset=%s&sort_by=default"
  4. def check_login(self, response):
  5. #从mysql中读取question的信息,来进行爬取
  6. db = MySQLdb.connect("localhost", "root", "", "crawl", charset='utf8' )
  7. cursor = db.cursor()
  8. selectsql="select questionid,answer_num from zhihu_question where id in ( 251,138,93,233,96,293,47,24,288,151,120,311,214,33) ;"
  9. try:
  10. cursor.execute(selectsql)
  11. results = cursor.fetchall()
  12. for row in results:
  13. questionid = row[0]
  14. answer_num = row[1]
  15. fornum = answer_num/5 #计算需要访问答案接口的次数
  16. print("questionid : "+ str(questionid)+" answer_Num: "+str(answer_num))
  17. for i in range(fornum+1):
  18. answer_url = self.answer_template % (str(questionid), str(i*5))
  19. yield scrapy.Request(answer_url,callback=self.parse_answer, headers=self.headers)
  20. except Exception as e:
  21. print(e)
  22. db.close()

解析response

parser_anser解析接口里的内容,这里就比较方便了, 因为是json格式的
代码如下:

  1. def parse_answer(self,response):
  2. #测试时把返回结果写到本地, 然后写pythonmain方法测试,测试方法都在test_code目录下
  3. #temfn= str(random.randint(0,100))
  4. #f = open("/var/www/html/scrapy/answer/"+temfn,'wb')
  5. #f.write(response.body)
  6. #f.write("------")
  7. #f.close()
  8. res=json.loads(response.text)
  9. #print (res)
  10. data=res['data']
  11. # 一次返回多个(默认5个)答案, 需要遍历
  12. for od in data:
  13. #print(od)
  14. item = AnswerItem()
  15. item['answer_id']=str(od['id']) # answer id
  16. item['question_id']=str(od['question']['id'])
  17. item['question_title']=od['question']['title']
  18. item['author_url_token']=od['author']['url_token']
  19. item['author_name']=od['author']['name']
  20. item['voteup_count']=str(od['voteup_count'])
  21. item['comment_count']=str(od["comment_count"])
  22. item['content']=od['content']
  23. yield item
  24. testh = etree.HTML(od['content'])
  25. itemimg = MyImageItem()
  26. itemimg['question_answer_id'] = str(od['question']['id'])+"/"+str(od['id'])
  27. itemimg['image_urls']=testh.xpath("//img/@data-original")
  28. yield itemimg

成果展示

爬取了4w+个答案和12G图片(个人服务器只有12G空间了~)

爬取收藏夹下的答案内容和图片:

爬取收藏夹下的回答的流程和爬取问题下回答基本流程一样,区别在于:

  1. 问题的start_urls为多个,收藏夹是一个一个爬取
  2. 问题页面上找到了内容接口,返回json.方便. 收藏夹页面没有找到接口(我没有找到),我是访问每页,然后解析的html.

构造每页的起始地址:

解析html核心代码:

python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片的更多相关文章

  1. 使用python scrapy爬取知乎提问信息

    前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...

  2. 一个简单的python爬虫,爬取知乎

    一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...

  3. scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)

      python版本  python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...

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

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

  5. scrapy爬取知乎某个问题下的所有图片

    前言: 1.仅仅是想下载图片,别人上传的图片也是没有版权的,下载来可以自己欣赏做手机背景但不商用 2.由于爬虫周期的问题,这个代码写于2019.02.13 1.关于知乎爬虫 网上能访问到的理论上都能爬 ...

  6. python scrapy爬取HBS 汉堡南美航运公司柜号信息

    下面分享个scrapy的例子 利用scrapy爬取HBS 船公司柜号信息 1.前期准备 查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询 https://www.hamburg ...

  7. Python——Scrapy爬取链家网站所有房源信息

    用scrapy爬取链家全国以上房源分类的信息: 路径: items.py # -*- coding: utf-8 -*- # Define here the models for your scrap ...

  8. scrapy爬取知乎问答

    登陆 参考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time impor ...

  9. Python scrapy爬取带验证码的列表数据

    首先所需要的环境:(我用的是Python2的,可以选择python3,具体遇到的问题自行解决,目前我这边几百万的数据量爬取) 环境: Python 2.7.10 Scrapy Scrapy 1.5.0 ...

随机推荐

  1. php手撸轻量级开发(二)框架加载

    先上图,有图有真相 1. 加载index文件 index文件是整个项目的唯一入口,任何请求进入项目都是走的index,只是带的参数不一样,然后再在index文件里加载其他文件,相当于把其他文件整个复制 ...

  2. K均值聚类

    聚类(cluster)与分类的不同之处在于, 分类算法训练过程中样本所属的分类是已知的属监督学习. 而聚类算法不需要带有分类的训练数据,而是根据样本特征的相似性将其分为几类,又称为无监督分类. K均值 ...

  3. 手动部署LNMT(Nginx+Tomcat)并实现Nginx反向代理Tomcat

    一.什么是Tomcat? 在弄清楚Tomcat之前要先了解什么是J2EE:从整体上讲,J2EE 是使用 Java 技术开发企业级应用的工业标准,它是 Java 技术不断适应和促进企业级应用过程中的产物 ...

  4. Java Generator

    以前我以为只有Python才会有generator,看来当时的我才年轻,后来认真研读<Thinking in Java>之后大有感悟,原来Java亦有generator,故做一次记录分享. ...

  5. ServerSocket和Socket

    前言 用ServerSocket和Socket做了个Server.Client通信的demo,以及学习下在这个demo过程中用到java.net.java.io包下几个常用的类. Server imp ...

  6. Hyperledger Fabric密码模块系列之BCCSP(四)

    前面说过要找时间介绍一下bccsp包下面的工厂factory,so here it is. 通过factory目前可以获得两类BCCSP实例,一个是上文说的sw,还有一个是通过pkcs11实现的. B ...

  7. .net core Identity集成IdentityServer4 (1)基本操作

    一. 新建asp.net core identity项目 新建项目->asp.net core web应用程序-> web应用程序(模型视图控制器)&更改身份验证为个人. 新建一个 ...

  8. Oracle入门《Oracle介绍》第一章1-1

    1.Oracle 简介 a.对象关系型的数据库管理系统 (ORDBMS) b.在管理信息系统.企业数据处理.因特网及电子商务等领域使用非常广泛 c.在数据安全性与数据完整性控制方面性能优越 d.跨操作 ...

  9. MVC和WebForm区别

    WebForm的理解 1. WebForm概念 ASP.NETWebform提供了一个类似于Winform的事件响应GUI模型(event-drivenGUI),隐藏了HTTP.HTML.JavaSc ...

  10. C#实现接口IHttpModule完成统一的权限验证

    测试代码如下: using System; using System.Collections.Generic; using System.Text; using System.Collections; ...