一个简单的分布式爬虫

下载scrapy-redis:

https://github.com/rmax/scrapy-redis

下载zip文件之后解压

建立两个批处理文件,start.bat和clear.bat
start.bat的内容为redis-server redis.windows.conf
clear.bat的内容为redis-cli flushdb
双击start.bat启动

这样就说明下好了,运行正常。

我们需要构建一个分布式爬虫系统:由一个master爬虫和slave爬虫组成,master端部署了redis数据库,master端从本地获取redis中的url,slave端通过网络连接访问master端的redis数据库,从中获取url进行爬取,而redis数据库本身的调度功能保证了master爬虫和slave爬虫不会爬取到重复的url。

新建爬虫项目,打开cmd:

scrapy startproject scrapyRedis

将src中的scrapy_redis这个文件夹复制到刚才新建的爬虫项目中。

按照scrapy-redis git上的说明,创建爬虫时,在新建的爬虫文件中粘贴这段代码到文件中

继承了RedisSpider这个类之后,爬虫爬取的数据就会首先存入redis,接下来再从redis里面读取,就相当于是一个队列,不断地往redis里面写入url,然后从redis里面读取网址。就不再有start_urls了,取而代之的是redis_key,scrapy-redis将key从list中pop出来成为请求的url地址。

引用scrapy-redis之后,写分布式爬虫就和写普通的scrapy爬虫一样,具体代码如下:

#encoding:utf-8
from scrapy_redis.spiders import RedisSpider
class MySpider(RedisSpider):
    name = ‘jobbole‘
    allowed_domains = ["blog.jobbole.com"]
    # 其实如果不设置以下语句,scrapy-redis也会默认生成一个redis-key“爬虫名+:start_urls”
    redis_key = "jobbole:start_urls"   #slave端爬虫注释掉下面的内容   start_urls = [‘http://blog.jobbole.com/all-posts/‘]

    # 收集伯乐在线所有404的url以及404页面数
    handle_httpstatus_list = [404]

    def parse(self, response):
        """
        1. 获取文章列表页中的文章url并交给scrapy下载后并进行解析
        2. 获取下一页的url并交给scrapy进行下载, 下载完成后交给parse
        """
        # 解析列表页中的所有文章url并交给scrapy下载后并进行解析
        if response.status == 404:
        self.fail_urls.append(response.url)
        self.crawler.stats.inc_value("failed_url")

        post_nodes = response.css("#archive .floated-thumb .post-thumb a")
        for post_node in post_nodes:
        image_url = post_node.css("img::attr(src)").extract_first("")
        post_url = post_node.css("::attr(href)").extract_first("")
        yield Request(url=parse.urljoin(response.url, post_url), meta={"front_image_url": image_url},
        callback=self.parse_detail)

        # 提取下一页并交给scrapy进行下载
        next_url = response.css(".next.page-numbers::attr(href)").extract_first("")
        if next_url:
        yield Request(url=parse.urljoin(response.url, post_url), callback=self.parse)

    def parse_detail(self, response):
        pass

在爬虫的settings.py中,我们需要部署一下,master爬虫和slave爬虫其他地方都差不多,唯独settings.py部署方式上有区别:

master爬虫部署,访问本地的redis数据库:

REDIS_URL = None
REDIS_HOST = ‘localhost‘
REDIS_PORT = 6379

slave爬虫部署,需要访问master端的redis数据库:

REDIS_URL = ‘redis://192.168.1.100:6379‘
REDIS_HOST = None
REDIS_PORT = None

新建一个方便pycharm运行的文件main.py

from scrapy import cmdline
cmdline.execute("scrapy crawl jobbole".split())

分别运行master,slave爬虫一个简单的分布式爬虫就做好了。

时间: 2024-10-14 06:25:28

一个简单的分布式爬虫的相关文章

python实现的一个简单的网页爬虫

学习了下python,看了一个简单的网页爬虫:http://www.cnblogs.com/fnng/p/3576154.html 自己实现了一个简单的网页爬虫,获取豆瓣的最新电影信息. 爬虫主要是获取页面,然后对页面进行解析,解析出自己所需要的信息进行进一步分析和挖掘. 首先需要学习python的正则表达式:http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html 解析的url:http://movie.douban.com/ 查看

也写一个简单的网络爬虫

引子 在cnblogs也混了许久,不过碍于平日工作太忙,一篇随笔也没有写过.最近经常感觉到自己曾经积累过的经验逐步的丢失,于是开通了博客,主要是记录一下自己在业余时间里玩的一些东西. 缘起 言归正传.某次在在某高校网站闲逛,看到了一些有趣的东西想要保存起来,但是却分散在各个页面,难以下手.使用baidu,google却有无法避免的搜索到此站点之外的内容.于是就想如果有一个爬虫,可以抓取指定域名的某些感兴趣的内容,不是很好.在网上简单搜索了一下,简单的都不满意,功能强大的又太复杂,就想自己写一个.

一个简单的多线程爬虫

   本文介绍一个简单的多线程并发爬虫,这里说的简单是指爬取的数据规模不大,单机运行,并且不使用数据库,但保证多线程下的数据的一致性,并且能让爬得正起劲的爬虫停下来,而且能保存爬取状态以备下次继续. 爬虫实现的步骤基本如下: 分析网页结构,选取自己感兴趣的部分; 建立两个Buffer,一个用于保存已经访问的URL,一个用户保存带访问的URL; 从待访问的Buffer中取出一个URL来爬取,保存这个URL中感兴趣的信息:并将这个URL加入已经访问的Buffer中,然后将这个URL中的所有外链URL

大数据之网络爬虫-一个简单的多线程爬虫

   本文介绍一个简单的多线程并发爬虫,这里说的简单是指爬取的数据规模不大,单机运行,并且不使用数据库,但保证多线程下的数据的一致性,并且能让爬得正起劲的爬虫停下来,而且能保存爬取状态以备下次继续. 爬虫实现的步骤基本如下: 分析网页结构,选取自己感兴趣的部分; 建立两个Buffer,一个用于保存已经访问的URL,一个用户保存带访问的URL; 从待访问的Buffer中取出一个URL来爬取,保存这个URL中感兴趣的信息:并将这个URL加入已经访问的Buffer中,然后将这个URL中的所有外链URL

一个简单的python爬虫,以豆瓣妹子“http://www.dbmeizi.com/category/2?p= ”为例

本想抓取网易摄影上的图,但发现查看html源代码时找不到图片的url,但firebug却能定位得到.(不知道为什么???) 目标是抓取前50页的爆乳图,代码如下: import urllib2,urllib,re,os ''' http://www.dbmeizi.com/category/2?p=% ''' def get_url_from_douban(): url_list=[] p=re.compile(r'''<img.*?src="(.+?\.jpg)''') #找出发布人的标

一个简单粗暴的爬虫 - 必应今日美图

1. 必应今日美图 当使用bing搜索时,每天都会出现一副美图. 搜索找到bing今日美图  http://bing.plmeizi.com/ 目前共47页 url格式按 http://bing.plmeizi.com/?page=* 点进去就是我们要的名称和名称 2. 开始编码 使用简单的Jsoup进行爬虫,很简单,很好理解. HrmlUtil 1 package util; 2 3 import java.io.IOException; 4 5 import org.jsoup.Jsoup;

使用redis设计一个简单的分布式锁

最近看了有关redis的一些东西,了解了redis的一下命令,就记录一下: redis中的setnx命令: 关于redis的操作命令,我们一般会使用set,get等一系列操作,数据结构也有很多,这里我们使用最简单的string来存储锁. redis下提供一个setnx命令用来将key值设为value,类似于set功能,但是它和set是有区别的,在于后面的nx,setnx是SET if Not eXists.就是:当且仅当key值不存在的时候,将该key值设置为value. 也就是说使用setnx

一个简单的scrapy爬虫抓取豆瓣刘亦菲的图片地址

一.第一步是创建一个scrapy项目 sh-3.2# scrapy startproject liuyifeiImage sh-3.2# chmod -R 777 liuyifeiImage/ 二.分析图片特征 1.解决分页url部分: 我们爬虫的start_url是"http://movie.douban.com/celebrity/1049732/photos/?type=C&start=0&sortby=vote&size=a&subtype=a"

一个简单的Python爬虫

写了一个抓taobao图片的爬虫,全是用if,for,while写的,比较简陋,入门作品. 从网页http://mm.taobao.com/json/request_top_list.htm?type=0&page=中提取taobao模特的照片. # -*- coding: cp936 -*- import urllib2 import urllib mmurl="http://mm.taobao.com/json/request_top_list.htm?type=0&page