python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片
上文介绍了爬取知乎问题信息的整个过程,这里介绍下爬取问题下所有答案的内容和图片,大致过程相同,部分核心代码不同.
爬取一个问题的所有内容流程大致如下:
- 一个问题url
- 请求url,获取问题下的答案个数(我不需要,因为之前获取问题信息的时候保存了问题的回答个数)
- 通过答案的接口去获取答案(如果一次获取5个答案,总计100个答案,需要计算的出访问20次答案接口)[答案的接口地址如下图所示]
- 答案接口返回的内容保存到mysql
- 提取内容中的图片地址,保存到本地

爬取代码:
从mysql库中查到question的id, 然后直接访问 答案接口 去获取数据.
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_
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
a[*].author.follower_count,badge[?(type=best_answerer)].topics&limit=5&offset=%s&sort_by=default"
def check_login(self, response):
#从mysql中读取question的信息,来进行爬取
db = MySQLdb.connect("localhost", "root", "", "crawl", charset='utf8' )
cursor = db.cursor()
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) ;"
try:
cursor.execute(selectsql)
results = cursor.fetchall()
for row in results:
questionid = row[0]
answer_num = row[1]
fornum = answer_num/5 #计算需要访问答案接口的次数
print("questionid : "+ str(questionid)+" answer_Num: "+str(answer_num))
for i in range(fornum+1):
answer_url = self.answer_template % (str(questionid), str(i*5))
yield scrapy.Request(answer_url,callback=self.parse_answer, headers=self.headers)
except Exception as e:
print(e)
db.close()
解析response
parser_anser解析接口里的内容,这里就比较方便了, 因为是json格式的
代码如下:
def parse_answer(self,response):
#测试时把返回结果写到本地, 然后写pythonmain方法测试,测试方法都在test_code目录下
#temfn= str(random.randint(0,100))
#f = open("/var/www/html/scrapy/answer/"+temfn,'wb')
#f.write(response.body)
#f.write("------")
#f.close()
res=json.loads(response.text)
#print (res)
data=res['data']
# 一次返回多个(默认5个)答案, 需要遍历
for od in data:
#print(od)
item = AnswerItem()
item['answer_id']=str(od['id']) # answer id
item['question_id']=str(od['question']['id'])
item['question_title']=od['question']['title']
item['author_url_token']=od['author']['url_token']
item['author_name']=od['author']['name']
item['voteup_count']=str(od['voteup_count'])
item['comment_count']=str(od["comment_count"])
item['content']=od['content']
yield item
testh = etree.HTML(od['content'])
itemimg = MyImageItem()
itemimg['question_answer_id'] = str(od['question']['id'])+"/"+str(od['id'])
itemimg['image_urls']=testh.xpath("//img/@data-original")
yield itemimg
成果展示
爬取了4w+个答案和12G图片(个人服务器只有12G空间了~)


爬取收藏夹下的答案内容和图片:
爬取收藏夹下的回答的流程和爬取问题下回答基本流程一样,区别在于:
- 问题的start_urls为多个,收藏夹是一个一个爬取
- 问题页面上找到了内容接口,返回json.方便. 收藏夹页面没有找到接口(我没有找到),我是访问每页,然后解析的html.
构造每页的起始地址:

解析html核心代码:

python scrapy爬取知乎问题和收藏夹下所有答案的内容和图片的更多相关文章
- 使用python scrapy爬取知乎提问信息
前文介绍了python的scrapy爬虫框架和登录知乎的方法. 这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中. 首先,看一下我要爬取哪些内容: 如下图所示,我要爬取一个问题的6个信息: ...
- 一个简单的python爬虫,爬取知乎
一个简单的python爬虫,爬取知乎 主要实现 爬取一个收藏夹 里 所有问题答案下的 图片 文字信息暂未收录,可自行实现,比图片更简单 具体代码里有详细注释,请自行阅读 项目源码: # -*- cod ...
- scrapy 爬取知乎问题、答案 ,并异步写入数据库(mysql)
python版本 python2.7 爬取知乎流程: 一 .分析 在访问知乎首页的时候(https://www.zhihu.com),在没有登录的情况下,会进行重定向到(https://www. ...
- 利用 Scrapy 爬取知乎用户信息
思路:通过获取知乎某个大V的关注列表和被关注列表,查看该大V和其关注用户和被关注用户的详细信息,然后通过层层递归调用,实现获取关注用户和被关注用户的关注列表和被关注列表,最终实现获取大量用户信息. 一 ...
- scrapy爬取知乎某个问题下的所有图片
前言: 1.仅仅是想下载图片,别人上传的图片也是没有版权的,下载来可以自己欣赏做手机背景但不商用 2.由于爬虫周期的问题,这个代码写于2019.02.13 1.关于知乎爬虫 网上能访问到的理论上都能爬 ...
- python scrapy爬取HBS 汉堡南美航运公司柜号信息
下面分享个scrapy的例子 利用scrapy爬取HBS 船公司柜号信息 1.前期准备 查询提单号下的柜号有哪些,主要是在下面的网站上,输入提单号,然后点击查询 https://www.hamburg ...
- Python——Scrapy爬取链家网站所有房源信息
用scrapy爬取链家全国以上房源分类的信息: 路径: items.py # -*- coding: utf-8 -*- # Define here the models for your scrap ...
- scrapy爬取知乎问答
登陆 参考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time impor ...
- Python scrapy爬取带验证码的列表数据
首先所需要的环境:(我用的是Python2的,可以选择python3,具体遇到的问题自行解决,目前我这边几百万的数据量爬取) 环境: Python 2.7.10 Scrapy Scrapy 1.5.0 ...
随机推荐
- 深度学习论文翻译解析(一):YOLOv3: An Incremental Improvement
论文标题: YOLOv3: An Incremental Improvement 论文作者: Joseph Redmon Ali Farhadi YOLO官网:YOLO: Real-Time Obje ...
- asp.net MVC 5 Scaffolding多层架构代码生成向导开源项目(邀请你的参与)
Visual Studio.net 2013 asp.net MVC 5 Scaffolding代码生成向导开源项目 提高开发效率,规范代码编写,最好的方式就是使用简单的设计模式(MVC , Repo ...
- spring boot(一):Hello World
前言 作为程序员,不管是.net程序员还是java程序员其实从骨子里都不太喜欢各种配置文件的,记得刚开始学java SSH时动不动就装B,来看看我的配置多不多,又是从.net开始写java的程序员提起 ...
- 【SQL】小心在循环中声明变量——浅析SQL变量作用域
本文适用:T-SQL(SQL Server) 先看这个语句: --跑3圈 BEGIN --每圈都定义一个表变量,并插入一行 DECLARE @t TABLE(Col INT PRIMARY KEY) ...
- [日常] Go语言圣经-字节切片与字符串
1.一个字符串是一个不可改变的字节序列2.文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列3.内置的len函数可以返回一个字符串中的字节数目4.第i个字节并不一定是字符串的第 ...
- 【Java】模拟Sping,实现其IOC和AOP核心(二)
接着上一篇,在上一篇完成了有关IOC的注解实现,这一篇用XML的方式实现IOC,并且完成AOP. 简易的IOC框图 注解的方式实现了左边的分支,那么就剩下右边的XML分支: XmlContext:这个 ...
- Java static 语句块
总结前一天学习,参考原文http://www.cnblogs.com/dolphin0520/p/3799052.html1: 对Static有了进一步的认识 这个地方重点是初始化各个变量顺序, ...
- JavaScript的值传递和引用传递
译者按: 程序员应该知道递归,但是你真的知道是怎么回事么? 原文: All About Recursion, PTC, TCO and STC in JavaScript 译者: Fundebug 为 ...
- Linux 系统性能分析工具 sar
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以 从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用 ...
- 前端周报:前端面试题及答案总结;JavaScript参数传递的深入理解
1.2017前端面试题及答案总结 |掘金技术征文 "金三银四,金九银十",用来形容求职最好的几个月.但是随着行业的饱和,初中级前端er就业形势不容乐观. 行业状态不可控,我们能做的 ...