Scrapy爬取知乎用户信息以及人际拓扑关系

Scrapy爬取知乎用户信息以及人际拓扑关系

1.生成项目

scrapy提供一个工具来生成项目,生成的项目中预置了一些文件,用户需要在这些文件中添加自己的代码。 打开命令行,执行:scrapy startproject tutorial,生成的项目类似下面的结构

tutorial/  
   scrapy.cfg  
   tutorial/  
    __init__.py  
       items.py  
       pipelines.py  
       settings.py  
       spiders/  
           __init__.py   

2.源码分析

2.1文件成员介绍

####2.1.1 items.py
类需要继承 scrapy.Item,爬取的主要目标就是从非结构性的数据源提取结构性数据,例如网页。 Scrapy提供Item类来满足这样的需求。 该项目中定义了在爬取元素构造的知乎用户属性和知乎用户关系两大块Item,为爬取后的数据转化为结构性数据,同时,也为后面的持久化做准备. ####2.1.2 pipelines.py :当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。

每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。

以下是item pipeline的一些典型应用:

  • 清理HTML数据
  • 验证爬取的数据(检查item包含某些字段)
  • 查重(并丢弃)
  • 将爬取结果保存到数据库中 编写你自己的item pipeline 编写你自己的item pipeline很简单,每个item pipeline组件是一个独立的Python类,同时必须实现以下方法:

process_item(self, item, spider) 每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象, 或是抛出 DropItem 异常,被丢弃的item将不会被之后的pipeline组件所处理。
该项目中就在该类中实现把数据持久化到mango数据库中

参数: item (Item 对象) – 被爬取的item spider (Spider 对象) – 爬取该item的spider

import os

from pymongo import MongoClient
from zhihu.settings import MONGO_URI, PROJECT_DIR
from zhihu.items import ZhihuPeopleItem, ZhihuRelationItem
from zhihu.tools.async import download_pic


class ZhihuPipeline(object):
    """
    存储数据
    """
    def __init__(self, mongo_uri, mongo_db, image_dir):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
        self.image_dir = image_dir
        self.client = None
        self.db= None
    def process_item(self, item, spider):
        """
        处理item
        """
        if isinstance(item, ZhihuPeopleItem):
            self._process_people(item)
        elif isinstance(item, ZhihuRelationItem):
            self._process_relation(item)
        return item

####2.1.3 settings.py
配置文件,提供爬虫系统参数的可配置化
####2.1.4 spiders 这个是一个包,可以定制自己的爬虫代码.如ZhihuSipder这个类就是知乎爬虫的启动类.

2.2 技术要点

####2.2.1 CrawlSpider
这里采用CrawlSpider,这个继承了Spider的且,非常适合做全站数据爬取的类.

class ZhihuSipder(CrawlSpider):
    name = "zhihu"
    allowed_domains = ["www.zhihu.com"]
    start_url = "https://www.zhihu.com/people/hua-zi-xu-95"

简析上面的三个参数: 1.name:这个参数是每个自定义爬虫必须要有的,唯一辨别你的自定义爬虫,name当然也是使用命令启动爬虫的一个决定因素.启动命令:scrapy crawl zhihu,其中的zhihu就是name属性. 2.allowed_domains:链接中必须包含的域名. 3.start_url:爬虫的入口地址,这里就是以我本人的知乎主页为入口. ####2.2.2 FormRequest做登陆模块

from scrapy.http import Request, FormRequest
    def post_login(self, response):
        """
        解析登陆页面,发送登陆表单
        """
        self.xsrf = Selector(response).xpath(
            '//input[@name="_xsrf"]/@value'
        ).extract()[0]
        return [FormRequest(
            'https://www.zhihu.com/login/email',
            method='POST',
            meta={'cookiejar': response.meta['cookiejar']},
            formdata={
                '_xsrf': self.xsrf,
                'email': 'xxxxxxxxx',
                'password': 'xxxxxxxxx',
                'remember_me': 'true'},
            callback=self.after_login
        )]

####2.2.3 Requests and Responses Scrapy使用 Request 和 Response 对象爬取web站点。

一般来说,Request 对象在spiders中被生成并且最终传递到 下载器(Downloader),下载器对其进行处理并返回一个 Response 对象, Response 对象还会返回到生成request的spider中。

所有 Request and Response 的子类都会实现一些在基类中非必要的 功能。它们会在 Request subclasses 和 Response subclasses 两部分进行详细的说明。 下面是Request构造函数

class Request(object_ref):
    def __init__(self, url, callback=None, method='GET', headers=None, body=None,
                 cookies=None, meta=None, encoding='utf-8', priority=0,
                 dont_filter=False, errback=None):
        self._encoding = encoding  # this one has to be set first
        self.method = str(method).upper()
        self._set_url(url)
        self._set_body(body)
        assert isinstance(priority, int), "Request priority not an integer: %r" % priority
       self.priority = priority
        assert callback or not errback, "Cannot use errback without a callback"
        self.callback = callback
        self.errback = errback
        self.cookies = cookies or {}
        self.headers = Headers(headers or {}, encoding=encoding)
        self.dont_filter = dont_filter
        self._meta = dict(meta) if meta else None

特别注意:参数:dont_filter
dont_filter(boolean) – indicates that this request should not be filtered by the scheduler. This is used when you want to perform an identical request multiple times, to ignore the duplicates filter. Use it with care, or you will get into crawling loops. Default to False.
解释:scrapy url去重 Request对象参数的dont_filter=False,默认就是false 如程序所示,默认就是要进行url去重
show code:

    def enqueue_request(self, request):
    //核心判断 注意  not 取否
        if not request.dont_filter and self.df.request_seen(request):
            self.df.log(request, self.spider)
            return False
        dqok = self._dqpush(request)
        if dqok:
            self.stats.inc_value('scheduler/enqueued/disk', spider=self.spider)
        else:
            self._mqpush(request)
            self.stats.inc_value('scheduler/enqueued/memory', spider=self.spider)
        self.stats.inc_value('scheduler/enqueued', spider=self.spider)
        return True

ps: scrapy 中判断重复内容的方法(RFPDupeFilter)

3 源码地址

github地址 该目录下的知乎爬虫项目,即可下载源码.

4 每日推荐

linux下命令窗口分配显示一遍查看使用说明,一般敲代码. 软件名: tmux
效果图: 效果图

转载于:https://my.oschina.net/u/2523402/blog/752345

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值