利用Scrapy抓取知乎用户信息

最近在学习Scrapy框架,利用框架可以快速完成爬虫的配置,简化编写工作,相对比较方便。
我是通过崔庆才大佬的《网络爬虫开发实战》一书学习的scrapy,书的内容很赞!
依着书里的思路写了一个抓取知乎用户信息的爬虫 (包含姓名、签名、点赞、关注、回答、提问等等)

在这里插入图片描述
以B站的知乎账号为例,主要抓取的信息有:
名称、签名、获得赞数、关注者人数、TA关注人数、回答数、提问数、文章数、专栏数、想法数

爬虫目录结构如下:
文件目录

首先改写 item.py
定义各个字段

import scrapy
class ZhihuItem(scrapy.Item):
    name = scrapy.Field()       #名字
    sign = scrapy.Field()       #签名
    answer = scrapy.Field()     #回答
    question = scrapy.Field()   #提问
    article = scrapy.Field()    #文章
    col = scrapy.Field()        #专栏
    think = scrapy.Field()      #想法
    follow = scrapy.Field()     #TA关注
    followed = scrapy.Field()   #关注TA
    like = scrapy.Field()       #点赞

然后是spider:

 def parse(self, response):
        name = response.xpath('//*[@id="ProfileHeader"]/div/div[2]/div/div[2]/div[1]/h1/span[1]/text()').extract()[0]
        sign = response.xpath('//*[@id="ProfileHeader"]//*[contains(@class,"RichText ztext Pro")]/text()').extract()[0]
        #获取赞同次数,得到一个数组,第1位为数字
        like = response.xpath('//*[@id="root"]/div/main/div/div[2]/div[2]/div[1]/div[2]/div/div[@class="IconGraf"]/text()').extract()[1]
        #获取TA关注的人数
        follow = response.xpath('//*[@id="root"]/div/main/div/div[2]/div[2]/div[2]/div/a[1]/div/strong/text()').extract()[0]
        #获取关注TA的人数
        followed = response.xpath('//*[@id="root"]/div/main/div/div[2]/div[2]/div[2]/div/a[2]/div/strong/text()').extract()[0]
        #获取回答、提问、文章、专栏、想法的数量
        items = response.css('ul[role="tablist"]')
        for i in items:
            item = ZhihuItem()
            item['name'] = name
            item['sign'] = sign
            item['like'] = like
            item['follow'] = follow
            item['followed'] = followed
            item['answer'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[2]/a/span/text()').extract()[0]
            item['question'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[3]/a/span/text()').extract()[0]
            item['article'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[4]/a/span/text()').extract()[0]
            item['col'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[5]/a/span/text()').extract()[0]
            item['think'] = i.xpath('//*[@id="ProfileMain"]/div[1]/ul/li[6]/a/span/text()').extract()[0]
            yield item

这里需要注意xpath选择器的写法。

我是使用chrome浏览器调试工具直接获取 xpath,获取元素都是绝对定位

但是知乎普通用户认证用户,其显示信息的元素位置并不完全相同,所以对于某些元素的获取就需要使用模糊查询进行定位

然后在setting文件进行相关配置:

  1. 设置 ROBOTSTXT_OBEY 为 False,否则会返回状态码301
  2. 设置 COOKIES_ENABLED 为 True
  3. 设置header相关信息
ROBOTSTXT_OBEY  = False  
COOKIES_ENABLED = True
DEFAULT_REQUEST_HEADERS = {
  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
  'Accept-Language': 'zh-CN,zh;q=0.9,en',
  'cookie': '',
  'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36',
  'referer': 'https://www.zhihu.com/'
}

下面是抓取结果:
在这里插入图片描述

蹩脚的英文应该马马虎虎能看得懂 QAQ

数据库使用的是MongoDB,相关代码和书上一样就不贴啦。

主要是为了熟悉一下scrapy框架的初步使用,所以只对统计的数目进行爬取保存,具体的内容要等以后再来尝试。

如果有大佬看到的话,希望能指点指点小菜鸟呀。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值