分布式爬虫scrapy-redis所踩过的坑

2023-11-08

一、安装redis

因为是在CentOS系统下安装的,并且是服务器。遇到的困难有点多不过。

1.首先要下载相关依赖

首先先检查是否有c语言的编译环境,你问我问什么下载这个,我只能说它是下载安装redis的前提,就像水和鱼一样。

rpm -q gcc```
  • 如果输出版本号,则证明下载好了,否则就执行下面的命令,安装gcc,

2.然后编译redis

  • 下载你想要的redis版本注意下面的3.0.6是版本号,根据自己想要的下载版本号,解压
yum install gcc-c++
cd /usr/local/redis
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar zxvf redis-3.0.6.tar.gz
make && make install

什么?你问我没有redis文件夹怎么办,mkdir创建啊!!!

一定要先进入目录再去执行下载编译,这样下载的redis才会进入系统变量。

redis-server
redis-cli

启动服务你是下面这样的吗?
在这里插入图片描述

是的就不正常了!!你才下载好了,你会发现你可以开启服务了,但是退不出来,无法进入命令行了,变成下面的这鬼摸样了,别急,你还没配置好,慢慢来。
在这里插入图片描述
还记得你刚刚创建的redis文件夹吗?进入那里面,找到redis.conf,修改这个配置文件。

# bind 127.0.0.1
protected-mode no
daemonize yes

找到这三个并改正。

  • 首先将bind进行注释,因为如果不注释的话,你就只能本机访问了,我相信你下载肯定不只是自己访问吧。这就意味着所有ip都可以访问这个数据库,但你又问了,这会不会影响安全性能呢?答:你都是租的服务器了,就算你想让别人访问,你还有安全组规则限制的啊,你问我什么是安全组?快去百度!!
  • 将守护模式关闭,这样你才能远程读写数据库
  • 开启后台模式,你才能像我那样,而不是退不出来

保存退出,重启redis,这样,redis就配置好了,还可以设置密码,但是我懒,不想设置。

至此数据库配置成功

二、scrapy框架出现的问题

1.AttributeError: TaocheSpider object has no attribute make_requests_from_url

原因:

新版本的scrapy框架已经丢弃了这个函数的功能,但是并没有完全移除,虽然函数已经移除,但是还是在某些地方用到了这个,出现矛盾。

解决方法

自己在相对应的报错文件中重写一下这个方法
就是在

def make_requests_from_url(self,url):
	return scrapy.Request(url,dont_filter=True)

2.ValueError: unsupported format character : (0x3a) at index 9

问题:

我开起了redis的管道,将数据保存在了redis中,但是每次存储总是失败报错。

原因:

我在settings.py文件中重写了保存的方法,但是保存的写法不对导致我一直以为是源码的错误
# item存储键的设置
REDIS_ITEMS_KEY = '%(spider):items'

源码是

return self.spider % {"spider":spider.name}

太坑了,我为了这个错误差点重写了一个scrapy框架…
注意!如果你觉得你的主代码一点问题都没有,那就一定是配置文件的问题,大小写,配置环境字母不对等

三、scrapy正确的源代码

1.items.py文件

import scrapy
class MyspiderItem(scrapy.Item):
    # define the fields for your item here like:
    lazyimg = scrapy.Field()
    title = scrapy.Field()
    resisted_data = scrapy.Field()
    mileage = scrapy.Field()
    city = scrapy.Field()
    price = scrapy.Field()
    sail_price = scrapy.Field()

2.settings.py文件

# Scrapy settings for myspider project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     https://docs.scrapy.org/en/latest/topics/settings.html
#     https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#     https://docs.scrapy.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'myspider'

SPIDER_MODULES = ['myspider.spiders']
NEWSPIDER_MODULE = 'myspider.spiders'


# Crawl responsibly by identifying yourself (and your website) on the user-agent

# Obey robots.txt rules
# LOG_LEVEL = "WARNING"

# Configure maximum concurrent requests performed by Scrapy (default: 16)
#CONCURRENT_REQUESTS = 32

# Configure a delay for requests for the same website (default: 0)
# See https://docs.scrapy.org/en/latest/topics/settings.html#download-delay
# See also autothrottle settings and docs
#DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
#CONCURRENT_REQUESTS_PER_DOMAIN = 16
#CONCURRENT_REQUESTS_PER_IP = 16

# Disable cookies (enabled by default)
#COOKIES_ENABLED = False

# Disable Telnet Console (enabled by default)
#TELNETCONSOLE_ENABLED = False

# Override the default request headers:
#DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
#}

# Enable or disable spider middlewares
# See https://docs.scrapy.org/en/latest/topics/spider-middleware.html
#SPIDER_MIDDLEWARES = {
#    'myspider.middlewares.MyspiderSpiderMiddleware': 543,
#}

# Enable or disable downloader middlewares
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
#DOWNLOADER_MIDDLEWARES = {
#    'myspider.middlewares.MyspiderDownloaderMiddleware': 543,
#}

# Enable or disable extensions
# See https://docs.scrapy.org/en/latest/topics/extensions.html
#EXTENSIONS = {
#    'scrapy.extensions.telnet.TelnetConsole': None,
#}

# Configure item pipelines
# See https://docs.scrapy.org/en/latest/topics/item-pipeline.html
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'

LOG_LEVEL = 'WARNING'
LOG_FILE = './log.log'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False

# 指定管道 ,scrapy-redis组件帮我们写好
ITEM_PIPELINES = {
        "scrapy_redis.pipelines.RedisPipeline":400
}

# 指定redis
REDIS_HOST = '' # redis的服务器地址,我们现在用的是虚拟机上的回环地址
REDIS_PORT = # virtual Box转发redistribution的端口


# 去重容器类配置 作用:redis的set集合来存储请求的指纹数据,从而实现去重的持久化
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'

# 使用scrapy-redis的调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'

# 配置调度器是否需要持久化,爬虫结束的时候要不要清空redis中请求队列和指纹的set集合,要持久化设置为True
SCHEDULER_PERSIST = True



# 最大闲置时间,防止爬虫在分布式爬取的过程中关闭
# 这个仅在队列是SpiderQueue 或者 SpiderStack才会有作用,
# 也可以阻塞一段时间,当你的爬虫刚开始时(因为刚开始时,队列是空的)
SCHEDULER_IDLE_BEFORE_CLOSE = 10

# Enable and configure the AutoThrottle extension (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/autothrottle.html
#AUTOTHROTTLE_ENABLED = True
# The initial download delay
#AUTOTHROTTLE_START_DELAY = 5
# The maximum download delay to be set in case of high latencies
#AUTOTHROTTLE_MAX_DELAY = 60
# The average number of requests Scrapy should be sending in parallel to
# each remote server
#AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
# Enable showing throttling stats for every response received:
#AUTOTHROTTLE_DEBUG = False

# Enable and configure HTTP caching (disabled by default)
# See https://docs.scrapy.org/en/latest/topics/downloader-middleware.html#httpcache-middleware-settings
#HTTPCACHE_ENABLED = True
#HTTPCACHE_EXPIRATION_SECS = 0
#HTTPCACHE_DIR = 'httpcache'
#HTTPCACHE_IGNORE_HTTP_CODES = []
#HTTPCACHE_STORAGE = 'scrapy.extensions.httpcache.FilesystemCacheStorage'

3.taoche.py文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from ..items import MyspiderItem
import logging
log = logging.getLogger(__name__)
class TaocheSpider(RedisCrawlSpider):
    name = 'taoche'
    # allowed_domains = ['taoche.com'] # 不做域名限制
    # start_urls = ['http://taoche.com/'] # 起始的url应该去redis(公共调度器) 里面获取

    redis_key = 'taoche' # 回去redis(公共调度器)里面获取key为taoche的数据 taoche:[]
    # 老师,我给你找一下我改的源码在哪里,看看是那的错误吗
    rules = (
        # LinkExtractor 链接提取器,根据正则规则提取url地址
        # callback 提取出来的url地址发送请求获取响应,会把响应对象给callback指定的函数进行处理
        # follow  获取的响应页面是否再次经过rules进行提取url
        Rule(LinkExtractor(allow=r'/\?page=\d+?'),
             callback='parse_item',
             follow=True),
    )

    def parse_item(self, response):
        print("开始解析数据")
        car_list = response.xpath('//div[@id="container_base"]/ul/li')
        for car in car_list:

            lazyimg = car.xpath('./div[1]/div/a/img/@src').extract_first()
            title = car.xpath('./div[2]/a/span/text()').extract_first()
            resisted_data = car.xpath('./div[2]/p/i[1]/text()').extract_first()
            mileage = car.xpath('./div[2]/p/i[2]/text()').extract_first()
            city = car.xpath('./div[2]/p/i[3]/text()').extract_first()
            city = city.replace('\n', '')
            city = city.strip()
            price = car.xpath('./div[2]/div[1]/i[1]/text()').extract_first()
            sail_price = car.xpath('./div[2]/div[1]/i[2]/text()').extract_first()

            item = MyspiderItem()
            item['lazyimg'] = lazyimg
            item['title'] = title
            item['resisted_data'] = resisted_data
            item['mileage'] = mileage
            item['city'] = city
            item['price'] = price
            item['sail_price'] = sail_price
            log.warning(item)
            # scrapy.Request(url=function,dont_filter=True)
            yield item

4.其余文件

  1. 中间件没有用到所以就没有写
  2. 管道用的是scrapy_redis里面的,自己也就不用写
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式爬虫scrapy-redis所踩过的坑 的相关文章

  • 蟒蛇 | MySQL | AttributeError:模块“mysql.connector”没有属性“connect”

    我正在学习 python 中的一个新库 mysql 我尝试执行以下命令 import mysql connector mydb mysql connector connect host localhost user root passwd
  • 如何使用 Python 3 绕过 HTTP Error 403: Forbidden with urllib.request

    您好 不是每次都这样 但有时在尝试访问 LSE 代码时 我会收到每一个烦人的 HTTP 错误 403 禁止消息 任何人都知道我如何仅使用标准 python 模块来克服这个问题 遗憾的是没有漂亮的汤 import urllib request
  • 多处理中的动态池大小?

    有没有办法动态调整multiprocessing Pool尺寸 我正在编写一个简单的服务器进程 它会产生工作人员来处理新任务 使用multiprocessing Process对于这种情况可能更适合 因为工作人员的数量不应该是固定的 但我需
  • 反编译Python 3.9.2的PYC文件[重复]

    这个问题在这里已经有答案了 目前 我有一个 3 9 2 版本的 python 的 PYC 文件 P S 这适用于所有 3 9 及更高版本 我正在尝试反编译 PYC 文件 但它显示错误 因为 uncompyle6 或者更确切地说 新版本 de
  • 是否可以从 Julia 调用 Python 函数并返回其结果?

    我正在使用 Python 从网络上抓取数据 我想使用这些数据在 Julia 中运行计算 是否可以在 Julia 中调用该函数并返回其结果 或者我最好直接导出到 CSV 并以这种方式加载数据 绝对地 看PyCall jl https gith
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • 如何过滤 Pandas GroupBy 对象并获取 GroupBy 对象?

    当对 Pandas groupby 操作的结果执行过滤时 它返回一个数据帧 但假设我想执行进一步的分组计算 我必须再次调用 groupby 这似乎有点绕 有更惯用的方法吗 EDIT 为了说明我在说什么 我们无耻地从 Pandas 文档中窃取
  • 使用 Paramiko 进行 DSA 密钥转发?

    我正在使用 Paramiko 在远程服务器上执行 bash 脚本 在其中一些脚本中 存在与其他服务器的 ssh 连接 如果我只使用 bash 不使用 Python 我的 DSA 密钥将被第一个远程服务器上的 bash 脚本转发并使用 以连接
  • 如何确保 re.findall() 停止在正确的位置?

    这是我的代码 a import re re findall r lt title gt lt title gt a 结果是 title aaa
  • 在Python上获取字典的前x个元素

    我是Python的新手 所以我尝试用Python获取字典的前50个元素 我有一本字典 它按值降序排列 k 0 l 0 for k in len dict d l 1 if l lt 51 print dict 举个小例子 dict d m
  • 使用 for 循环创建一系列元组

    我已经搜索过 但找不到答案 尽管我确信它已经存在了 我对 python 很陌生 但我以前用其他语言做过这种事情 我正在以行形式读取数据文件 我想将每行数据存储在它自己的元组中 以便在 for 循环之外访问 tup i inLine wher
  • Spark 和 Python 使用自定义文件格式/生成器作为 RDD 的输入

    我想问一下 Spark 中输入的可能性 我可以看到从http spark apache org docs latest programming guide html http spark apache org docs latest pro
  • 查找 Pandas DF 行中的最短日期并创建新列

    我有一个包含多个日期的表 有些日期将为 NaN 我需要找到最旧的日期 所以一行可能有 DATE MODIFIED WITHDRAWN DATE SOLD DATE STATUS DATE 等 因此 对于每一行 一个或多个字段中都会有一个日期
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 在骨架图像中查找线 OpenCV python

    我有以下图片 我想找到一些线来进行一些计算 平均长度等 我尝试使用HoughLinesP 但它找不到线 我能怎么做 这是我的代码 sk skeleton mask rows cols sk shape imgOut np zeros row
  • 在Raspberry pi上升级skimage版本

    我已经使用 Raspberry Pi 2 上的 synaptic 包管理器安装了 python 包 然而 skimage 模块版本 0 6 是 synaptic 中最新的可用版本 有人可以指导我如何将其升级到0 11 因为旧版本中缺少某些功
  • 如何给URL添加变量?

    我正在尝试从网站收集数据 我有一个 Excel 文件 其中包含该网站的所有不同扩展名 F i www example com example2 我有一个脚本可以成功从网站中提取 HTML 但现在我想为所有扩展自动执行此操作 然而 当我说 s
  • Django 管理器链接

    我想知道是否有可能 如果可以的话 如何 将多个管理器链接在一起以生成受两个单独管理器影响的查询集 我将解释我正在研究的具体示例 我有多个抽象模型类 用于为其他模型提供小型的特定功能 其中两个模型是DeleteMixin 和GlobalMix
  • 如何从namedtuple实例列表创建pandas DataFrame(带有索引或多索引)?

    简单的例子 from collections import namedtuple import pandas Price namedtuple Price ticker date price a Price GE 2010 01 01 30
  • 如何获取pandas中groupby对象中的组数?

    我想知道有多少个独特的组需要执行计算 给定一个名为 groupby 的对象dfgroup 我们如何找到组的数量 简单 快速 Pandaic ngroups 较新版本的 groupby API pandas gt 0 23 提供了此 未记录的

随机推荐

  • 4.3.1 位置变化动作

    4 3 1 位置变化动作 2013 05 21 10 12 火烈鸟网络科技 人民邮电出版社 我要评论 0 字号 T T Cocos2d x高级开发教程 第4章动作 在这一章中 我们将为大家详细介绍各种动作的使用方法 读完本章后 读者将会学到
  • App Transport Security has blocked a cleartext HTTP

    问题 App Transport Security has blocked a cleartext HTTP http resource load since it is insecure Temporary exceptions can
  • linux查找含有指定字符串的文件

    1 使用find进行查找 find oracle apache tomcat 8 5 59 xml xargs grep 1521 2 使用grep查找 grep rn 搜索的内容 路径
  • linux终端Bash换成zsh后,环境变量失效的解决方案

    安装了oh my zsh后 发现node ng什么的命令都失效了 第一反映是环境变量失效 忘记了怎么配置 Search on the Internet half an hour 说多了都是泪 一直找不到解决方法 最终问了项目老大 一句话点明
  • 五.安装gitlab

    1 下载安装 gitlab ce 15 9 1 ce 0 el7 x86 64 rpm 下载安装包 wget https mirrors tuna tsinghua edu cn gitlab ce yum el7 gitlab ce 15
  • python连接oracle数据库查询

    直接上源码说明吧 如下 开头引入必须的插件 连接oracle需要导入cx Oracle coding utf8 import cx Oracle import sys os from selenium import webdriver 编码
  • C++中string如何实现字符串分割函数split()——4种方法

    如 string str1 This is a test string str2 This is a test string str2 This is a test 我们如何将以上字符串按照某种分隔符 将其分割成四个子串 其值分别为 Thi
  • 【Spring Data JPA自学笔记四】动态查询

    文章目录 JpaSpecificationExecutor接口 初见Specification类 Specification的更多功能 Specification的条件 Specification多条件查询 排序和分页 使用Sort 使用P
  • MySQL技术内幕InnoDB存储引擎 学习笔记 第五章 索引与算法

    如果索引太多 应用的性能会受到影响 每次插入都要更新索引并保存在磁盘上 增加了磁盘IO 如果索引太少 对查询性能又会产生影响 要找到一个平衡点 InnoDB支持B 树索引和哈希索引 InnoDB的哈希索引是自适应的 InnoDB会根据表的使
  • 【神经网络】(16) MobileNetV3 代码复现,网络解析,附Tensorflow完整代码

    各位同学好 今天和大家分享一下如何使用 Tensorflow 构建 MobileNetV3 轻量化网络模型 MobileNetV3 做了如下改动 1 更新了V2中的逆转残差结构 2 使用NAS搜索参数的技术 3 重新设计耗时层结构 Mobi
  • 现象:奇偶交换排序示意图,理论没整理

  • 通过bilibili_api获取bilibili弹幕+绘制词云的方法

    通过bilibili api获取bilibili弹幕 绘制词云的方法 刚接触python 随手做一些自己感兴趣的项目 看到了一个通过bilibili api三行代码获取弹幕的教程 vx公号 天作之程 jhtmtzzc 使用的是bilibil
  • 【Python】Python type()函数用途及使用方法

    python语言中的type 函数在python中是即简单又实用的一种对象数据类型查询方法 type 函数可以做什么 type 就是一个最实用又简单的查看数据类型的方法 type 是一个内建的函数 调用它就能够得到一个反回值 从而知道想要查
  • 自动装箱和拆箱、包装类空指针异常问题、包装类的缓存问题

    自动装箱和拆箱 自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转化 JDK1 5以后Java引入了自动装箱 autoboxing 和自动拆箱 unboxing 自动装箱 基本数据类型处于需要对象的环境中时 会自动转为 对象 例如
  • 条款20.对于shared_ptr但有可能空悬的指针使用weak_ptr

    对于类似std shared ptr但有可能空悬的指针使用std weak ptr 如果有一个像std shared ptr的指针但是不参与资源所有权共享的指针是很方便的 换句话说 是一个类似std shared ptr但不影响对象引用计数
  • Kubernetes 1.5安装 ansible

    此篇文件写的是在Kubernetes1 5中安装ansible 镜像制作 准备基础镜像 这里使用的是Centos6 8来安装ansible root 6ca3bdb01ed1 cat etc issue CentOS release 6 8
  • hp服务器默认从硬盘启动,怎样设置启动顺序hp台式机

    有时候要想更改我们电脑的启动顺序 是U盘启动还是硬盘启动 要怎么办呢 接下来是小编为大家收集的怎样设置启动顺序hp台式机 欢迎大家阅读 怎样设置启动顺序hp台式机 hp台式机设置启动顺序更改方法一 将u盘插入usb口 重启电脑 进入bios
  • 使用高防CDN有什么用处?

    近年来 随着互联网的快速发展 越来越多的企业开始发展互联网业务 出现了各种各样的网站和web程序 互联网改变了人们的生活习惯与消费行为 人们也是越来越依赖网络 而这些改变让互联网产业得到更加迅速发展 而随着互联网技术的发展提高 用户在访问网
  • QCombox隐藏某一项

    有事想隐藏下拉选项的某一项 而又不改变索引 可以使用如下方法 QListView view qobject cast
  • 分布式爬虫scrapy-redis所踩过的坑

    一 安装redis 因为是在CentOS系统下安装的 并且是服务器 遇到的困难有点多不过 1 首先要下载相关依赖 首先先检查是否有c语言的编译环境 你问我问什么下载这个 我只能说它是下载安装redis的前提 就像水和鱼一样 rpm q gc