python 爬取数据还要下载scrapy吗_使用python scrapy爬取知乎提问信息

本文介绍如何使用Python的Scrapy框架爬取知乎问题信息,并将其保存到MySQL数据库中。内容包括选择要爬取的数据字段,如问题ID、标题、描述等,以及XPath和CSS选择器的运用。通过阅读文件中的URL列表,Scrapy Request进行遍历爬取,解析后的数据经过自定义的MysqlPipeline存储到数据库。
摘要由CSDN通过智能技术生成

前文介绍了python的scrapy爬虫框架和登录知乎的方法.

这里介绍如何爬取知乎的问题信息,并保存到mysql数据库中.

首先,看一下我要爬取哪些内容:

如下图所示,我要爬取一个问题的6个信息:

问题的id(question_id)

标题(title)

问题描述(intro)

回答个数(answer_num)

关注人数(attention_uv)

浏览次数(read_pv)

爬取结果我保存到mysql数据库中,表名为:zhihu_question

如下图中,红框里的就是上图是有人为我的穿着很轻浮,我该如何回应?问题的信息.

(回答个数,关注着和浏览次数数据不一致是因为我是在爬取文章信息之后的一段时间才抽出来时间写的文章,在这期间回答个数,关注着和浏览次数都会增长.)

爬取方法介绍

我用的是scrapy框架中自带的选择器selectors.

selectors通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。

XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。 CSS 是一门将HTML文档样式化的语言。

XPath最最直观的介绍:

例如:知乎问题页面上的标题的XPath如下:

图中红框里就是标题的XPath.(这只是一个直观的介绍,还有一些细节可以在代码中看到)

爬取代码:

爬取问题的相关信息只需要问题url即可,我这里把收集的问题url写到文件中,爬虫程序去遍历文件,然后依次爬取.

我是在登录成功知乎后的check_login这个方法里面构造的起始url,所以读文件的方法也在这里,代码如下:

def check_login(self, response):

# 验证登录成功之后构造初始问题url

file = open("/root/py_project/zhihu/zhihu/conf/start_questions.txt")

while 1:

line = file.readline()

line = line.strip('\n') #去掉最后的换行

if not line:

break

if(line[0:1] == "#"):

#如果是#开头的url, 跳过

print line

pass

else:

print("current url : " + line)

yield scrapy.Request(line,callback=self.parse_question, headers=self.headers)

file.close()

其中最重要的一行是:

yield scrapy.Request(line,callback=self.parse_question, headers=self.headers)

yield scrapy.Request 代表开始爬取一条url,如果有多个url就yield多次. 这里的次数等同于start_question.txt中非#开头的url

如下:

callback=self.parse_question 是请求url地址后,返回的response的回调处理函数,也是整个爬取过程中最核心的代码.

如下:

def parse_question(self,response):

item = QuestionItem()

url = response.url

questionid=url[url.rindex("/")+1:]

item['questionid']=questionid

item['title']=response.selector.xpath('//*[@class="QuestionHeader-title"]/text()')[0].extract()

descarr=response.selector.xpath('//span[@itemprop="text"]/text()')

if len(descarr) > 0:

item['desc']=descarr[0].extract()

else:

item['desc']="-"

item['answer_num']=response.selector.xpath('//*[@id="QuestionAnswers-answers"]/div/div/div[1]/h4/span/text()[1]')[0].extract().replace(',','')

item['attention_uv']=response.selector.xpath('//strong[@class="NumberBoard-itemValue"]/text()')[0].extract().replace(',','')

item['read_pv']=response.selector.xpath('//strong[@class="NumberBoard-itemValue"]/text()')[1].extract().replace(',','')

yield item

其中主要代码是用selectors.xpath选取我们需要的问题信息(注意:这里的路径并不一定与 chrome的debug模式中复制的xpath一致,直接复制的xpath一般不太能用,自己看html代码结构写的),

获取到问题的信息之后放到item.py中定义好的QuestionItem对象中,然后yield 对象 , 会把对象传递到配置的pipelines中.

pipelines一般是在配置文件中配置,

因为这里爬取问题只保存到mysql数据库,并不下载图片,(而爬取答案需要下载图片)所以各自在在爬虫程序中定义的pipelines,如下:

custom_settings = {

'ITEM_PIPELINES' : {

'zhihu.mysqlpipelines.MysqlPipeline': 5

#'scrapy.pipelines.images.ImagesPipeline': 1,#这个是scrapy自带的图片下载pipelines

}

}

以上是爬取知乎问题的整个大致过程.

后文介绍爬取收藏夹下的回答 和 问题下的回答(包括内容和图片).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 模拟虫抓取知乎用户信息以及人际拓扑关系,使用scrapy虫框架,数据存储使用mongo数据库。   本地运行请注意:虫依赖mongo和rabbitmq,因此这两个服务必须正常运行和配置。为了加快下载效率,图片下载是异步任务,因此在启动虫进程执行需要启动异步worker,启动方式是进入zhihu_spider/zhihu目录后执行下面命令:   celery -A zhihu.tools.async worker --loglevel=info   虫项目部署:   进入zhihu_spider后执行```docker-compose up``` ,进入container后和本地运行方法相同,依次启动mongo、rabbitmq、异步任务、虫进程即可。   其它需要说明的问题:   虫框架从start\_requests开始执行,此部分会提交知乎主页的访问请求给引擎,并设置回调函数为post_login.   post\_login解析主页获取\_xsrf保存为成员变量中,并提交登陆的POST请求,设置回调函数为after\_login.   after\_login拿到登陆后的cookie,提交一个start\_url的GET请求给虫引擎,设置回调函数parse\_people.   parse\_people解析个人主页,一次提交关注人和粉丝列表页面到虫引擎,回调函数是parse\_follow, 并把解析好的个人数据提交虫引擎写入mongo。   parse\_follow会解析用户列表,同时把动态的人员列表POST请求发送只引擎,回调函数是parse\_post\_follow,把解析好的用户主页链接请求也发送到引擎,人员关系写入mongo。   parse\_post\_follow单纯解析用户列表,提交用户主页请求至引擎。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值