爬蟲——分佈式爬蟲爬取糗事百科所有頁面的趣圖鏈接


實質上就是在多個機器上運行爬蟲文件,調用組件scrapy_redis實現共享調度器和管道,寫入redis數據庫的過程。

分佈式爬取的流程:

https://www.cnblogs.com/foremostxl/p/10095663.html#_label1

  1. 安裝scrapy-redis組件,pip install scrapy-redis

  2. redis配置文件的設置:
    bind 127.0.0.1 只允許本機鏈接,註釋掉
    protected-mode no 關閉保護模式
    打開redis終端

  3. 創建基於crawlspider的爬蟲文件
    scrapy startproject redispro
    cd redispro
    scrapy genspider -t qiubai https://www.qiushibaike.com/pic/

  4. 導入類from scrapy_redis.spiders import RedisCrawlSpider,修改繼承類class QiubaiSpider(RedisCrawlSpider):

  5. start_urls 註釋改爲redis_key,redis_key='qiubaispider',字符串qiubaispider表示調度器中隊列的名稱,基於RedisCrawlSpider。

  6. settings配置文件修改

  7. 運行:切換到爬蟲py文件所在的目錄,比之前運行項目的目錄更深,scrapy runspider xxx.py運行py文件後,

  8. 在redis客戶端放入redis_key對應的url
    lpush 調度器隊列的名稱 “起始url”
    redis客戶端發送lpush時名稱和redis_key要一致
    redis_key=‘qiubaispider’
    lpush qiubaispider https://www.qiushibeike.com/pic

  9. 結果查看:
    lrange qiubai:items

代碼:

qiubai.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapy_redis.spiders import RedisCrawlSpider
from redispro.items import RedisproItem

class QiubaiSpider(RedisCrawlSpider):
    name = 'qiubai'
    # allowed_domains = ['https://www.qiushibaike.com/pic/']
    # start_urls = ['https://www.qiushibaike.com/pic//']

    redis_key='qiubaispider'

    rules = (
        Rule(LinkExtractor(allow=r'/pic/page/\d+'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list=response.xpath('//div[@id="content-left"]/div')
        for div in div_list:
            # 相對於div_list  .// img_url
            img_url ="https:" + div.xpath('.//div[@class="thumb"]/a/img/@src').extract_first()
            item = RedisproItem()
            item['img_url'] = img_url
            yield item

items.py


import scrapy


class RedisproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    img_url=scrapy.Field()

settings.py


BOT_NAME = 'redispro'

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


# 以下是加上去的:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36'
LOG_LEVEL = 'ERROR'
LOG_FILE = 'log.txt'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False



# 使用組件管道
ITEM_PIPELINES = {
   'scrapy_redis.pipelines.RedisPipeline': 300,
}
# 去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy_redis組件的調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 是否允許暫停,某臺機器出現故障時會從暫停之前的位置開始
SCHEDULER_PERSIST = True

# 配置redis服務器,爬蟲文件在其他電腦上運行。
REDIS_HOST = redis服務端地址
REDIS_PORT = 6379
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章