路飞学城-Python 爬虫实战密训-第 3 章

一、scrapy定义

    scrapy是一个高性能的、异步的、分布式的爬虫框架。scrapy是基于Twisted的异步来进行处理异步请求的。

架构图如下:


各组件功能:

  • scrapy Engine:引擎,整个框架的核心,用于整个系统的数据流处理,触发事物
  • schedule:调度器,用来接受引擎发过来的请求, 压入队列中, 并在引擎再次请求的时候返回. 可以想像成一个URL(抓取网页的网址或者说是链接)的优先队列, 由它来决定下一个要抓取的网址是什么, 同时去除重复的网址
  • Downloader:下载器,用于下载网页内容, 并将网页内容返回给蜘蛛(Scrapy下载器是建立在twisted这个高效的异步模型上的)
  • Spiders:爬虫,爬虫是主要干活的, 用于从特定的网页中提取自己需要的信息, 即所谓的实体(Item)。用户也可以从中提取出链接,让Scrapy继续抓取下一个页面
  • Pipeline:项目管道,负责处理爬虫从网页中抽取的实体,主要的功能是持久化实体、验证实体的有效性、清除不需要的信息。当页面被爬虫解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
  • Downloader Middlewares:下载器中间件,位于Scrapy引擎和下载器之间的框架,主要是处理Scrapy引擎与下载器之间的请求及响应。
  • Spider Middlewares:爬虫中间件,介于Scrapy引擎和爬虫之间的框架,主要工作是处理蜘蛛的响应输入和请求输出。
  • Scheduler Middewares:调度中间件,介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。

二、windows下安装scrapy

1、安装Twisted

    a、pip3 install wheel

    b、下载twisted,https://www.lfd.uci.edu/~gohlke/pythonlibs/

    c、pip3 install Twisted-xxx.whl

2、安装scrapy

    pip3 install scrapy

三、scrapy使用:

1、创建项目:

命令行运行命令:
scrapy startproject your_project_name
它会自动创建一下目录:
project_name /
    scrapy.cfg
    project_name /
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders /
            __init__.py
爬虫 1.py
爬虫2.py
             爬虫 3.py
文件说明:
  • scrapy.cfg  项目的配置信息,主要为Scrapy命令行工具提供一个基础的配置信息。(真正爬虫相关的配置信息在settings.py文件中)
  • items.py    设置数据存储模板,用于结构化数据,如:Django的Model
  • pipelines    数据处理行为,如:一般结构化的数据持久化
  • settings.py 配置文件,如:递归的层数、并发数,延迟下载等
  • spiders      爬虫目录,如:创建文件,编写爬虫规则
注意:一般创建爬虫文件时,以网站域名命名
示例、
import scrapy
from scrapy.selector import HtmlXPathSelector
from scrapy.http.request import Request
  
  
class DigSpider(scrapy.Spider):
    # 爬虫应用的名称,通过此名称启动爬虫命令,不过一般我们会把名字命名为跟域名一样
    name = "dig"
  
    # 允许的域名
    allowed_domains = ["chouti.com"]
  
    # 起始URL
    start_urls = [
        'http://dig.chouti.com/',
    ]
  
    has_request_set = {}
    # 访问起始URL并获取结果后的回调函数
    def parse(self, response):
        print(response.url)
  
        hxs = HtmlXPathSelector(response)
        page_list = hxs.select('//div[@id="dig_lcpage"]//a[re:test(@href, "/all/hot/recent/\d+")]/@href').extract()
        for page in page_list:
            page_url = 'http://dig.chouti.com%s' % page
            key = self.md5(page_url)
            if key in self.has_request_set:
                pass
            else:
                self.has_request_set[key] = page_url
                obj = Request(url=page_url, method='GET', callback=self.parse)
                yield obj	# 它会对接下来的url循环往复的去爬取
  
    @staticmethod
    def md5(val):
        import hashlib
        ha = hashlib.md5()
        ha.update(bytes(val, encoding='utf-8'))
        key = ha.hexdigest()
        return key

执行此爬虫文件,则在终端进入项目目录执行如下命令:
scrapy crawl dig --nolog
对于上述代码重要之处在于:
Request是一个封装用户请求的类,在回调函数中yield该对象表示继续访问

HtmlXpathSelector用于结构化HTML代码并提供选择器功能

scrapy其他命令:

Available commands:
  bench         Run quick benchmark test
  check         Check spider contracts
  crawl         Run a spider
  edit          Edit spider
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  list          List available spiders
  parse         Parse URL (using its spider) and print the results
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值