码迷,mamicode.com
首页 > 其他好文 > 详细

7-爬虫-

时间:2020-07-10 17:01:13      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:其他   导包   rap   desc   正则   meta   pat   tps   属性   

crawlSpider

是Spider的一个子类。自己派生出独有的方法和属性。
功能:作用全站数据爬取场景
使用:
  - 创建工程
  - cd 工程
  - 创建爬虫文件:
    - 创建一个基于CrawlSpider的爬虫文件
    - 指令:scrapy genspider -t crawl spiderName www.xxx.com
  - 执行工程

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule


class CrawlModelSpider(CrawlSpider):
    name = crawl_model
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [https://www.4567kan.com/index.php/vod/show/class/动作/id/1.html]

    # LinkExtractor叫做链接提取器
    # 作用:根据指定的规则(allow=‘正则‘)在页面中进行相关链接(url)的提取
    link = LinkExtractor(allow=r/id/1/page/\d+\.html)
    rules = (
        # Rule叫做规则解析器,链接提取器是被作用在规则解析器
        # 作用:可以接受link提取到的链接,且对链接进行请求发送,根据指定规则(callback)对请求到的数据进行数据解析
        # follow=True:可以将 链接提取器 继续作用到 链接提取器 提取到的页码 所对应的页面源码中
        Rule(link, callback=parse_item, follow=True),
    )

    def parse_item(self, response):
        print(response)

crawlspider全站数据爬取

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
import scrapy
from moviePro.items import MovieproItem


class MovieSpider(CrawlSpider):
    name = movie
    # allowed_domains = [‘www.xxx.com‘]
    start_urls = [https://www.4567kan.com/index.php/vod/show/class/动作/id/1/page/1.html]

    rules = (
        # 提取页码链接
        Rule(LinkExtractor(allow=r/id/1/page/\d+\.html), callback=parse_item, follow=False),
        # 提取详情页链接
        # Rule(LinkExtractor(allow=r‘/movie/index\d+\.html‘),callback=‘parse_detail‘,follow=False)
    )

    def parse_item(self, response):
        # 解析电影的名称
        li_list = response.xpath(/html/body/div[1]/div/div/div/div[2]/ul/li)
        for li in li_list:
            title = li.xpath(./div/a/@title).extract_first()
            detail_url = https://www.4567kan.com + li.xpath(./div/a/@href).extract_first()
            item = MovieproItem()
            item[title] = title
            yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={item: item})
   def parse_detail(self, response):
        desc = response.xpath(/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()).extract_first()
        item = response.meta[item]
        item[desc] = desc
        yield item

分布式爬虫

概念:搭建一个分布式机群,然后让每一台电脑进行联合且分布的数据爬取
原生的scrapy框架是无法实现分布式
  - 调度器无法被机群共享
  - 管道无法被共享
必须要要scrapy结合scrapy-redis组件一起实现分布式
  - scrapy-redis组件的作用:
    - 可以给scrapy提供可以被共享的管道和调度器
    - 为什么组件的名称叫做scrapy-redis
      - 爬取到的数据只能存储到redis中
环境安装
  - pip install scrapy-redis
实现流程
  - 1.新建工程(基于CrawlSpider)
  - 2.修改爬虫文件
    - 导包:from scrapy_redis.spiders import RedisCrawlSpider
    - 修改当前爬虫类的父类为RedisCrawlSpider
    - 将start_urls替换成redis_key属性,属性值为字符串,表示可以被共享的调度器队列的名称
    - 编写后序的爬虫文件相关操作
  - 3.进行setting配置文件的配置
    - 指定管道
    - 指定调度器
    - 指定redis
  - 4.对redis的配置文件进行配置
    - 56行:关闭默认绑定,#bind 127.0.0.1
    - 75行:关闭保护模式,允许其他设备有redis写入的权限,protected-mode no
  - 5.启动redis的服务端和客户端
  - 6.执行工程
  - 7.向调度器队列中扔入一个起始的url:调度器的队列是存在于redis中
    - 在redis的客户端执行如下指令:
      - lpush 调度器队列的名称 起始的url
      - 该指令一旦执行成功,则分布式机群就可以进行数据的爬取
  - 8.可以在redis中查看爬取到的数据
    - xxx:items:存储的是爬取到的数据

 

7-爬虫-

标签:其他   导包   rap   desc   正则   meta   pat   tps   属性   

原文地址:https://www.cnblogs.com/wgwg/p/13279877.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!