路飞学城-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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值