初试scrapy编写twitter爬虫

这篇文章记录的是我研究整个问题的思路,最终做出来的东西在1.4.2节


第一步要做的当然是生成一个新project

scrapy startproject twitterProject
我计划用这个爬虫做的第一件事就是抓取twitter上希拉里的推文以及她的关注。所以新建一个spider

scrapy genspider hillary https://twitter.com/HillaryClinton

本文首先参考 https://github.com/yall/scrapy-twitter 中的代码进行学习


1.登陆

twitter是不能直接访问的,所有内容都必须在注册账号并登陆后才能查看。所以写twitter爬虫的第一步就是实现用scrapy登陆并返回url。
根据 https://github.com/yall/scrapy-twitter 中的说明,需要先在settings中设置 API credentials 并且把TwitterDownloaderMiddleware加入到settings中。
根据这个github上的说明,settings中的设置如下:
DOWNLOADER_MIDDLEWARES = { 
    'scrapy_twitter.TwitterDownloaderMiddleware': 10,
}
TWITTER_CONSUMER_KEY        = 'xxxx'
TWITTER_CONSUMER_SECRET     = 'xxxx'
TWITTER_ACCESS_TOKEN_KEY    = 'xxxx'
TWITTER_ACCESS_TOKEN_SECRET = 'xxxx'
那么首先应该弄清CONSUMER_KEY 到 ACCESS_TOKEN_SECRET 这四个变量是做什么的。
想起原来没看完的Web Scraping with Python上有关于twitter API的内容,再捡起来看看。

1.1 twitter api

登陆twitter之后打开twitter的developer site:apps.twitter.com
Create一个新的App。起名叫ScrapingXYZ。输入description及web site 后就进入了编辑应用的界面。
在Keys and Access Tokens下应该就能找到我们想要的四个变量。
果然,CONSUMER_KEY 和 CONSUMER_SECRET就在这页选项卡的开头,而TOKEN_KEY和TOKEN_SECRET需要点击一下页面最下方的generate My Access Token and Token Secret按钮来生成。

1.2 user Timeline example

这篇github文章中给出地第一个spider例子用于抓取一个用户时间线上的所有推文。
下面分析一下这个spider的代码。
其代码如下:(源码可以在此处获得:https://github.com/yall/scrapy-twitter)

scrapy_twitter.py:

# coding:utf-8

from scrapy import log
from scrapy.http import Request, Response

import twitter


class TwitterUserTimelineRequest(Request):

    def __init__(self, *args, **kwargs):
        self.screen_name = kwargs.pop('screen_name', None)
        self.count = kwargs.pop('count', None)
        self.max_id = kwargs.pop('max_id', None)
        super(TwitterUserTimelineRequest, self).__init__('http://twitter.com',
                                                         dont_filter=True,
                                                         **kwargs)


class TwitterStreamFilterRequest(Request):

    def __init__(self, *args, **kwargs):
        self.track = kwargs.pop('track', None)
        super(TwitterStreamFilterRequest, self).__init__('http://twitter.com',
                                                         dont_filter=True,
                                                         **kwargs)


class TwitterResponse(Response):

    def __init__(self, *args, **kwargs):
        self.tweets = kwargs.pop('tweets', None)
        super(TwitterResponse, self).__init__('http://twitter.com',
                                              *args,
                                              **kwargs)


class TwitterDownloaderMiddleware(object):

    def __init__(self,
                 consumer_key, consumer_secret,
                 access_token_key, access_token_secret):
        self.api = twitter.Api(consumer_key=consumer_key,
                               consumer_secret=consumer_secret,
                               access_token_key=access_token_key,
                               access_token_secret=access_token_secret)
        log.msg('Using creds [CONSUMER KEY: %s, ACCESS TOKEN KEY: %s]' %
                (consumer_key, access_token_key),
                level=log.INFO)

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings
        consumer_key = settings['TWITTER_CONSUMER_KEY']
        consumer_secret = settings['TWITTER_CONSUMER_SECRET']
        access_token_key = settings['TWITTER_ACCESS_TOKEN_KEY']
        access_token_secret = settings['TWITTER_ACCESS_TOKEN_SECRET']
        return cls(consumer_key,
                   consumer_secret,
                   access_token_key,
                   access_token_secret)

    def process_request(self, request, spider):

        if isinstance(request, TwitterUserTimelineRequest):
            tweets = self.api.GetUserTimeline(screen_name=request.screen_name,
                                              count=request.count,
                                              max_id=request.max_id)
            return TwitterResponse(tweets=[tweet.AsDict() for tweet in tweets])

        if isinstance(request, TwitterStreamFilterRequest):
            tweets = self.api.GetStreamFilter(track=request.track)
            return TwitterResponse(tweets=tweets)

    def process_response(self, request, response, spider):
        return response


f
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值