最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

分布式爬蟲scrapy-redis的實(shí)戰(zhàn)踩坑記錄

 更新時(shí)間:2022年08月05日 10:39:17   作者:Indra_ran  
最近用scrapy-redis嘗試了分布式爬蟲,使用過程中也遇到了不少問題,下面這篇文章主要給大家介紹了關(guān)于分布式爬蟲scrapy-redis的實(shí)戰(zhàn)踩坑記錄,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、安裝redis

因?yàn)槭窃贑entOS系統(tǒng)下安裝的,并且是服務(wù)器。遇到的困難有點(diǎn)多不過。

1.首先要下載相關(guān)依賴

首先先檢查是否有c語言的編譯環(huán)境,你問我問什么下載這個(gè),我只能說它是下載安裝redis的前提,就像水和魚一樣。

rpm -q gcc```

如果輸出版本號(hào),則證明下載好了,否則就執(zhí)行下面的命令,安裝gcc,

2.然后編譯redis

下載你想要的redis版本注意下面的3.0.6是版本號(hào),根據(jù)自己想要的下載版本號(hào),解壓

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創(chuàng)建啊!!!

一定要先進(jìn)入目錄再去執(zhí)行下載編譯,這樣下載的redis才會(huì)進(jìn)入系統(tǒng)變量。

redis-server
redis-cli

啟動(dòng)服務(wù)你是下面這樣的嗎?

是的就不正常了??!你才下載好了,你會(huì)發(fā)現(xiàn)你可以開啟服務(wù)了,但是退不出來,無法進(jìn)入命令行了,變成下面的這鬼摸樣了,別急,你還沒配置好,慢慢來。

還記得你剛剛創(chuàng)建的redis文件夾嗎?進(jìn)入那里面,找到redis.conf,修改這個(gè)配置文件。

redis-server
redis-cli

找到這三個(gè)并改正。

  • 首先將bind進(jìn)行注釋,因?yàn)槿绻蛔⑨尩脑?,你就只能本機(jī)訪問了,我相信你下載肯定不只是自己訪問吧。這就意味著所有ip都可以訪問這個(gè)數(shù)據(jù)庫,但你又問了,這會(huì)不會(huì)影響安全性能呢?答:你都是租的服務(wù)器了,就算你想讓別人訪問,你還有安全組規(guī)則限制的啊,你問我什么是安全組?快去百度!!
  • 將守護(hù)模式關(guān)閉,這樣你才能遠(yuǎn)程讀寫數(shù)據(jù)庫
  • 開啟后臺(tái)模式,你才能像我那樣,而不是退不出來

保存退出,重啟redis,這樣,redis就配置好了,還可以設(shè)置密碼,但是我懶,不想設(shè)置。

至此數(shù)據(jù)庫配置成功

二、scrapy框架出現(xiàn)的問題

1.AttributeError: TaocheSpider object has no attribute make_requests_from_url 原因:

新版本的scrapy框架已經(jīng)丟棄了這個(gè)函數(shù)的功能,但是并沒有完全移除,雖然函數(shù)已經(jīng)移除,但是還是在某些地方用到了這個(gè),出現(xiàn)矛盾。

解決方法

自己在相對應(yīng)的報(bào)錯(cuò)文件中重寫一下這個(gè)方法
就是在

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

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

我開起了redis的管道,將數(shù)據(jù)保存在了redis中,但是每次存儲(chǔ)總是失敗報(bào)錯(cuò)。

原因:

我在settings.py文件中重寫了保存的方法,但是保存的寫法不對導(dǎo)致我一直以為是源碼的錯(cuò)誤

# item存儲(chǔ)鍵的設(shè)置
REDIS_ITEMS_KEY = '%(spider):items'

源碼是

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

太坑了,我為了這個(gè)錯(cuò)誤差點(diǎn)重寫了一個(gè)scrapy框架…

注意!如果你覺得你的主代碼一點(diǎn)問題都沒有,那就一定是配置文件的問題,大小寫,配置環(huán)境字母不對等

三、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的服務(wù)器地址,我們現(xiàn)在用的是虛擬機(jī)上的回環(huán)地址
REDIS_PORT = # virtual Box轉(zhuǎn)發(fā)redistribution的端口

# 去重容器類配置 作用:redis的set集合來存儲(chǔ)請求的指紋數(shù)據(jù),從而實(shí)現(xiàn)去重的持久化
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'

# 使用scrapy-redis的調(diào)度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'

# 配置調(diào)度器是否需要持久化,爬蟲結(jié)束的時(shí)候要不要清空redis中請求隊(duì)列和指紋的set集合,要持久化設(shè)置為True
SCHEDULER_PERSIST = True

# 最大閑置時(shí)間,防止爬蟲在分布式爬取的過程中關(guān)閉
# 這個(gè)僅在隊(duì)列是SpiderQueue 或者 SpiderStack才會(huì)有作用,
# 也可以阻塞一段時(shí)間,當(dāng)你的爬蟲剛開始時(shí)(因?yàn)閯傞_始時(shí),隊(duì)列是空的)
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應(yīng)該去redis(公共調(diào)度器) 里面獲取

    redis_key = 'taoche' # 回去redis(公共調(diào)度器)里面獲取key為taoche的數(shù)據(jù) taoche:[]
    # 老師,我給你找一下我改的源碼在哪里,看看是那的錯(cuò)誤嗎
    rules = (
        # LinkExtractor 鏈接提取器,根據(jù)正則規(guī)則提取url地址
        # callback 提取出來的url地址發(fā)送請求獲取響應(yīng),會(huì)把響應(yīng)對象給callback指定的函數(shù)進(jìn)行處理
        # follow  獲取的響應(yīng)頁面是否再次經(jīng)過rules進(jìn)行提取url
        Rule(LinkExtractor(allow=r'/\?page=\d+?'),
             callback='parse_item',
             follow=True),
    )

    def parse_item(self, response):
        print("開始解析數(shù)據(jù)")
        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.其余文件

  • 中間件沒有用到所以就沒有寫
  • 管道用的是scrapy_redis里面的,自己也就不用寫

總結(jié)

到此這篇關(guān)于分布式爬蟲scrapy-redis踩坑的文章就介紹到這了,更多相關(guān)分布式爬蟲scrapy-redis踩坑內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例

    使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例

    這篇文章主要介紹了使用Python批量處理Excel文件并轉(zhuǎn)為csv文件示例,文中通過代碼示例給大家介紹非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-12-12
  • 深入淺析Python中的迭代器

    深入淺析Python中的迭代器

    迭代器是實(shí)現(xiàn)了迭代器協(xié)議的類對象,迭代器協(xié)議規(guī)定了迭代器類必需定義__next()__方法。這篇文章主要介紹了Python中的迭代器,需要的朋友可以參考下
    2019-06-06
  • Python?切片為什么不會(huì)索引越界?

    Python?切片為什么不會(huì)索引越界?

    這篇文章主要介紹了Python?切片為什么不會(huì)索引越界?切片(slice)是?Python?中一種很有特色的特性,在正式開始之前,我們先來從關(guān)于切片的相關(guān)知識(shí)開始介紹,感興趣的小伙伴一起參考參考呀</P><P>
    2021-12-12
  • TF-IDF算法解析與Python實(shí)現(xiàn)方法詳解

    TF-IDF算法解析與Python實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了TF-IDF算法解析與Python實(shí)現(xiàn)方法詳解,文章介紹了tf-idf算法的主要思想,分享了Python實(shí)現(xiàn)tr-idf算法所必要的預(yù)處理過程,以及具體實(shí)現(xiàn)代碼等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • django 模型字段設(shè)置默認(rèn)值代碼

    django 模型字段設(shè)置默認(rèn)值代碼

    這篇文章主要介紹了django 模型字段設(shè)置默認(rèn)值代碼,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python截圖的五個(gè)方法實(shí)例總結(jié)

    Python截圖的五個(gè)方法實(shí)例總結(jié)

    學(xué)習(xí)一門語言最好的方法便是實(shí)踐,想要拿Python寫一個(gè)截圖工具,下面這篇文章主要給大家介紹了關(guān)于Python截圖的五個(gè)方法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Django數(shù)據(jù)映射(一對一,一對多,多對多)

    Django數(shù)據(jù)映射(一對一,一對多,多對多)

    本文主要介紹了Django數(shù)據(jù)映射(一對一,一對多,多對多),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法

    django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法

    今天小編就為大家分享一篇django 數(shù)據(jù)庫連接模塊解析及簡單長連接改造方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 在交互式環(huán)境中執(zhí)行Python程序過程詳解

    在交互式環(huán)境中執(zhí)行Python程序過程詳解

    這篇文章主要介紹了在交互式環(huán)境中執(zhí)行Python程序過程詳解,運(yùn)行Python腳本程序的方式有多種,目前主要的方式有:交互式環(huán)境運(yùn)行、命令行窗口運(yùn)行、開發(fā)工具上運(yùn)行等,其中在不同的操作平臺(tái)上還互不相同,需要的朋友可以參考下
    2019-07-07
  • Python操作MongoDB的教程詳解(插,查,改,排,刪)

    Python操作MongoDB的教程詳解(插,查,改,排,刪)

    MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫。是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。本文將詳細(xì)和大家聊聊Python操作MongoDB的方法,需要的可以參考一下
    2022-09-09

最新評論

望谟县| 钦州市| 惠州市| 汽车| 安溪县| 涟水县| 凤山县| 沽源县| 南安市| 全州县| 洛扎县| 阿克苏市| 钟山县| 盱眙县| 明水县| 新建县| 马鞍山市| 衡山县| 大冶市| 彭泽县| 佛山市| 高邮市| 黑河市| 民和| 华宁县| 胶南市| 育儿| 安康市| 济南市| 仪陇县| 梨树县| 凤庆县| 肇州县| 夹江县| 天台县| 兴隆县| 荥阳市| 麻阳| 汉源县| 康定县| 家居|