分布式爬虫scrapy+redis入门

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 利用分布式爬虫scrapy+redis爬取伯乐在线网站,网站网址:http://blog.jobbole.com/all-posts/后文中详情写了整个工程的流程,即时是新手按照指导走也能使程序成功运行。

利用分布式爬虫scrapy+redis爬取伯乐在线网站,网站网址:http://blog.jobbole.com/all-posts/
后文中详情写了整个工程的流程,即时是新手按照指导走也能使程序成功运行。

1.下载64位redis软件

软件很小,4M,下载链接: https://pan.baidu.com/s/14mjeLoYJ_aFA91jq2oe2-g 密码: 4nex
下载后解压,文件夹内下图所示:

img_4729a0841e1ac7f69b5ee9fe5c6bea19.png
redis文件夹.png

2.开启redis服务

在资源管理器的路径中输入cmd,并按Enter进入命令行。
这一步的作用是cmd打开时就在此目录下。

img_1b060c7ad68e99179a749d0db7738eb7.png
image.png

进入命令行后,输入命令: redis-server redis.windows.conf
img_477fe7cf6d4387cc5d1ff27549d14859.png
输入命令.png

命令运行结果如下图所示:
img_b805c5bb50523fa9e6adf77461e28f71.png
命令运行结果.png

在之后的操作步骤中,都需要 保持此cmd不被关闭
只有开启数据库服务,才能访问数据库,这是 软件行业人员的常识

3.安装scrapy-redis库

安装scrapy、lxml等库的时候容易出现没法从网上安装twisted库的错误,解决方案是从将twisted库下载到本地后,用命令进行安装。
twisted库下载链接: https://pan.baidu.com/s/1BiCc0HRpGnh-O2wk0ySKtw 密码: y9gq
注意:此链接下载的版本适用于win64系统下的Python3.6版本!!如果你的Python版本不同,请在浏览器中访问此网站:https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted,网站如下图所示:

img_cf0ba7f0907e82303c899991a2e06a6b.png
twisted下载网址.png

你可以根据自己的操作系统和python版本来 下载需要的版本
在桌面新建一个Scrapy-redis文件,并放入下载好的后缀名为whl的文件。
img_753a4b7f852502e7cfcf25f45dcad491.png
新建文件夹.png

在资源管理器的路径中输入cmd,并按Enter进入命令行。
这一步的作用是cmd打开时就在此目录下。
img_10d483a1cb552c4fcf7255a019d0d5ac.png
进入cmd.png

进入命令行后,输入命令: pip install Twisted-18.7.0-cp36-cp36m-win_amd64.whl
img_af942100e551d420926b7d82ab73ebe8.png
命令行安装twisted库.png

安装成功则继续输入命令: pip install scrapy-redis
按照经验来说,应该不会再出现错误。能够安装成功才继续往下进行,否则自行在网上查找解决方案。

4.创建scrapy-redis工程

还是在桌面的Scrapy-redis文件夹中打开cmd
在cmd中输入命令并运行:scrapy startproject RedisTest

img_b71a529116f6bb81be6f3a21f3f81c17.png
新建工程命令.png

进入爬虫工程目录命令: cd RedisTest,运行结果如下图所示:
从图中可以看出cmd所在的 目录不同
img_d12ba99596b70c6d42fee89ba1c84371.png
进入爬虫工程目录命令.png

新建爬虫文件命令: scrapy genspider article blog.jobbole.com,运行结果如下图所示:
img_bb07b29a40b562a290e87e974ff55e88.png
新建爬虫文件命令.png

5.在Pycharm中导入工程

Pycharm安装包下载链接: https://pan.baidu.com/s/1RyxEri8pZSd-osrwl5DJ7Q 密码: 3hm8
导入工程的按钮位置如下图所示:

img_7780f97f572e9b214068cd2386f6b5a9.png
image.png

选中工程文件夹,然后点击OK,如下图所示:
img_a80cebf418c0eed3edf851cdfba9419f.png
image.png

工程文件夹的结构如下图所示:
img_3013b841fe9f6c7f81d68ef5f1002146.png
image.png

6.编辑items.py文件

爬取1个字段 :title,数据类型为scrapy.Field对象

import scrapy
from scrapy import Field

class RedistestItem(scrapy.Item):
    title = Field()

7.编辑article.py文件

作为入门的教程,代码示例应该去繁就简,下面一段代码仅仅只有13行。
两种框架的区别:
1.在scrapy框架中,爬虫类继承scrapy.Spider;而在scrapy-redis框架中,爬虫类继承scrapy_redis.spiders.RedisSpider。
2.scrapy-redis框架的爬虫类中没有start_urls属性,取而代之的是redis_key属性。

from scrapy_redis.spiders import RedisSpider
from ..items import RedistestItem

class ArticleSpider(RedisSpider):
    name = 'article'
    redis_key = "bole_urls"

    def parse(self, response):
        article_list = response.xpath("//div[@class='post floated-thumb']")
        for article in article_list:
            item = RedistestItem()
            item['title'] = article.xpath("div[@class='post-meta']/p[1]/a/@title").extract_first()
            yield item

8.编辑pipelines.py文件

getConn函数用来连接数据库
代码中16-22行是Pipeline类的初始化,可以不写在___init___中,本文作者习惯这么写,主要作用是删除之前存在的article表和创建新表。

class RedistestPipeline(object):
    def process_item(self, item, spider):
        with open("article.txt",'a') as file:
            file.write("title%s\n"%item['title'])
        return item

9.编辑settings.py文件

下面代码的第5-9行是redis的相关设置,因为是从本地的redis上提取键值对,所以REDIS_HOST为127.0.0.1
如果是从公网上的redis服务器中提取键值对,则换成服务器的ip就可以。

BOT_NAME = 'RedisTest'
SPIDER_MODULES = ['RedisTest.spiders']
NEWSPIDER_MODULE = 'RedisTest.spiders'

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379

ROBOTSTXT_OBEY = False
ITEM_PIPELINES = {
   'RedisTest.pipelines.RedistestPipeline': 300,
}

10.运行爬虫

在爬虫工程文件夹中打开cmd,输入命令:scrapy crawl article
下图中划红线的部分是要求读者检查是否处于爬虫工程文件夹中

img_9ba9da19c9d5bef952d95aae278a8555.png
运行爬虫.png

运行上图所示命令后,爬虫会等待redis服务器中的队列,如果队列中有新的值入队,爬虫会把该值取出,作为爬取网页的url链接。
让新值进入队列的命令: lpush {} {}
第一个大括号替换为第7步article.py文件中第6行redis_key变量的值,第二个大括号替换为需要爬取网页的url链接。
命令示例: lpush bole_urls http://blog.jobbole.com/all-posts/
如下图所示:
img_ee79af889fc8f7e9d06ade959197032d.png
lpush命令.png

读者运行时可以从爬虫运行的cmd中看到动态的效果,产生的txt文件如下图所示:
img_ea2825e2ce1983fff944b251c92a8079.png
txt文件结果.png

提示

因为只是入门教程,主要作用是帮助新手理清思路,如果要爬取更多字段可以自行修改。
按照教程的顺序认真完成每一步,可以避免踩坑。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
NoSQL Java Redis
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
Redis分布式锁在高并发场景下是重要的技术手段,但其实现过程中常遇到五大深坑:**原子性问题**、**连接耗尽问题**、**锁过期问题**、**锁失效问题**以及**锁分段问题**。这些问题不仅影响系统的稳定性和性能,还可能导致数据不一致。尼恩在实际项目中总结了这些坑,并提供了详细的解决方案,包括使用Lua脚本保证原子性、设置合理的锁过期时间和使用看门狗机制、以及通过锁分段提升性能。这些经验和技巧对面试和实际开发都有很大帮助,值得深入学习和实践。
太惨痛: Redis 分布式锁 5个大坑,又大又深, 如何才能 避开 ?
|
1月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
113 6
|
23天前
|
存储 NoSQL Java
使用lock4j-redis-template-spring-boot-starter实现redis分布式锁
通过使用 `lock4j-redis-template-spring-boot-starter`,我们可以轻松实现 Redis 分布式锁,从而解决分布式系统中多个实例并发访问共享资源的问题。合理配置和使用分布式锁,可以有效提高系统的稳定性和数据的一致性。希望本文对你在实际项目中使用 Redis 分布式锁有所帮助。
66 5
|
26天前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
57 8
|
29天前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。
|
1月前
|
NoSQL Redis
Redis分布式锁如何实现 ?
Redis分布式锁通过SETNX指令实现,确保仅在键不存在时设置值。此机制用于控制多个线程对共享资源的访问,避免并发冲突。然而,实际应用中需解决死锁、锁超时、归一化、可重入及阻塞等问题,以确保系统的稳定性和可靠性。解决方案包括设置锁超时、引入Watch Dog机制、使用ThreadLocal绑定加解锁操作、实现计数器支持可重入锁以及采用自旋锁思想处理阻塞请求。
59 16
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
43 5
|
1月前
|
数据采集 存储 XML
Python爬虫定义入门知识
Python爬虫是用于自动化抓取互联网数据的程序。其基本概念包括爬虫、请求、响应和解析。常用库有Requests、BeautifulSoup、Scrapy和Selenium。工作流程包括发送请求、接收响应、解析数据和存储数据。注意事项包括遵守Robots协议、避免过度请求、处理异常和确保数据合法性。Python爬虫强大而灵活,但使用时需遵守法律法规。
|
1月前
|
数据采集 前端开发 中间件
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第26天】Python是一种强大的编程语言,在数据抓取和网络爬虫领域应用广泛。Scrapy作为高效灵活的爬虫框架,为开发者提供了强大的工具集。本文通过实战案例,详细解析Scrapy框架的应用与技巧,并附上示例代码。文章介绍了Scrapy的基本概念、创建项目、编写简单爬虫、高级特性和技巧等内容。
90 4
|
1月前
|
数据采集 中间件 API
在Scrapy爬虫中应用Crawlera进行反爬虫策略
在Scrapy爬虫中应用Crawlera进行反爬虫策略