scrapy

作者: 一只小青蛙 | 来源:发表于2018-11-01 19:03 被阅读21次

miss美人镇贴
  1. 安装 pip install scrapy

  1. 框架结构:

    引擎:
    负责信号数据的传递,起协调作用。 (自动实现)

    调度器
    会将request对象储存在任务队列中,引擎会从任务队列里提取任务,交给下载器。 (框架实现)

    spider爬虫文件:
    通过起始url发起request请求,解析响应结果,1. 提取新的url,2. 提取数据。 (手动实现)

    下载器
    接受引擎传递过来的请求,发起请求获取响应,最终将响应结果通过中间件引擎提交spider爬虫文件。 (框架实现)

    管道文件:
    将spider爬虫文件yeilditem数据,做过滤持久化。 (手动实现)

    下载中间件
    自定义下载组件(请求结果响应结果都会经过中间件)。 (特殊需求手动实现)

    spider爬虫中间件
    可以自定义requset请求,过滤response请求。 (特殊需求手动实现)

    还有代理中间件,cookie中间件,User-Agent中间件,selenium中间件等


1.0如何写一个项目呢?

创建项目:scrapy startproject 项目名称
创建爬虫文件:
1. 进入爬虫文件夹下
2. scrapy genspider 爬虫名称 域

Spider
    |- scrapy.cfg                        项目部署文件
    |- Spider                     该项目的python模块,可以在这里加入代码
        |- __init__.py                 
        |- items.py                       主要是将爬取的非结构性的数据源提取结构性数据
        |- middlewares.py          
        |- pipelines.py                  将爬取的数据进行持久化存储
        |-  __pycache__  
        |-  settings.py                  配置文件
        |-  spiders                       放置spider代码的目录
            |-  __init__.py 
            |-  __pycache__

1.1创建爬虫模块

import scrapy
class Spider(scrapy.Spider):                       #创建的Spider是继承scrapy.Spider类
    name = "Spider"                                      #爬虫的名称(必须是项目里面唯一的)
    allowed_domain = ["xxx.com"]                #允许的域名(就是这个爬虫爬取链接的范围)
    start_urls = ["http://xxx.com/xxx/xxx"]     #开始爬取的链接
    
    def parse(self, response):                     
        pass

内部框架的py文件以及作用:

  1. spider文件夹下存放爬虫文件
  2. item.py :根据目标网站,定义需要的字段
  3. pipeline:做数据的过滤和持久化
  4. middleware:中间件
  5. settings.py:设置文件,在里面做User-Agent的配置,Headlers,激活管道文件等等
  6. scrapy.cfg:配置文件,一般情况下,作部署时会用到它

1.2框架的操作步骤,很简单哟

step1:

分析目标网站,根据要提取的目标数据在items.py中创建字段

step2:

(1)在爬虫文件中设置目标url
(2)解析请求成功的响应结果,提取目标数据,赋值给item,提取url继续发起请求

step3:

(1)setting下激活管道
(2)在管道文件中做数据的过滤和持久化


2.1图片下载:

    第一种: 正常的发起请求,正常的获取二进制文件,保存
    第二种: 自定义图片管道,继承自ImagePipeline.py
       重写方法:

            def get_media_request,item,spider...
                # 获取图片地址,发起请求

            def item_completed(self,results,spider,item...)
                # 在results结果中,根据图片下载状态,获取图片本地路径
                # 将获取的路径赋值给item,然后将item返回给其他管道

2.2scrapy shell 交互是终端的使用

 1. scrapy shell "http://hr.tencent.com/position.php?&start=0#a"       进入网站
 2. view(response)         查看响应
 3. response.css('td.l.square a::text')       查看a标签的文本信息
 4. response.css('td.l.square a::text').extract()        查看a标签的文本信息 只看文本
 5. response.css('td.l.square a::attr(href)').extract()           查看a标签的href属性

2.3scrapy.Spider

    customer_settings:
        def star_requests():
            # 根据起始url,发起请求
        def parse(self,response):
            # 得到响应的回调函数

2.4选择对象有四个基本的方法

  • xpath(query):传入XPath表达式查询,返回该表达式所对应的所有节点的选择器列表列表
  • css(查询):传入CSS表达式查询,返回该表达式所对应的所有节点的选择器列表列表
  • extract():序列化该节点为Unicode字符串并返回列表列表。
  • re(正则表达式):根据传入的正则表达式对数据进行提取,返回的Unicode字符串列表.regex可以是一个已编译的正则,也可以是一个将为re.compile(正则表达式)编译为正则表达式的字符串。

2.5 item

Scrapy提供Item类。 Item对象是用于收集所抓取的数据的简单容器。它们提供了一个类似字典的 API,具有用于声明其可用字段的方便的语法
在items.py文件输入

class SpiderItem(scrapt.Item):
    url = scrapy.Field()
    time = scrapy.Field()
    title = scrapy.Field()
    content = scrapy.Field()
如果需要扩展的话,这样的方法扩展
class newSpiderItem(SpiderItem):
    xxx = scrapy.Field()

2.6 Item Pipeline

当item在Spider中被传递后,它将会传递到Item PipeLine,利用Item PipeLine来进行数据保存

先上示例代码:
from scrapy.exceptions import DropItem
class SpiderPipeline(object):
    def __init__(self):
        self.file = open('xxx.html','w')
    def process_item(self,item,spider):
        if item['title']:
            file = (dict(item)) + "\n"
            self.file.write(file)
            return item
        else:
            raise DropItem("没有找到标题"+title)

    class 自定义管道(object):


        def __init__(self):
            # 可以在这里设置参数(比如,创建数据库连接,打开文件等)

        def open_spider(self,spider):
            # 爬虫开启的时候会调用,可选方法

        @classmethod
        def from_crawler(cls,crawler):
            # crawler:包含了爬虫的核心组件
            # 可以获取setting的一些设置参数
            return cls(...)

        def process_item(self,item.spider):
            # 所有yield中的item都会经过这个方法
            # 在这里做数据持久化(PyMySQL,PyMongo)

            多个item时处理方法1 :
                if isinstance(item,类名):   # 类名不需要加引号
                    # 根据不同的item,做不同的判断
                elif isinstance(item,类名):   # 类名不需要加引号  
            多个item时处理方法2 :
                1. 在item对应的类中,定义一个方法,返回sql语句和要插入的数据
                2. 使用item调用这个方法,得到sql语句和要插入的数据
                3. 执行插入语句

            return item    # 如果要将item传递给下一个管道,必须要将item return 回去

        def close_spider(self.spider):
            # 爬虫结束时调用
            # 在这里关闭数据库链接,关闭文件等

之后在setting.py的ITEM_PIPELINES中进行激活

ITEM_PIPELINES = {
       'Spider.pipelines.spiderPipeline':299}

process_item()方法可以用来判断是来自于哪个爬虫,item是被爬取对象,spider是爬取该item的Spider

Dropitem是一个错误捕获

299是判断运行顺序,范围为0~1000,数字越低优先级越高


通用爬虫

通过下面的命令可以快速创建 CrawlSpider模板 的代码:

scrapy genspider -t crawl 爬虫文件 域名

LinkExtractor的参数:

allow:
    一般跟一个正则表达式 表示提取url                     重用!!!

deny: 
    同样是者正则表达式,符合表达式的链接(优先级比allow高)

allowed_domains: 
    必须在我设置的域名下提取链接

deny_domains:
    不会在deny_domains设置的域名下提取链接

restrict_xpath:
    提取链接的时候,通过xpath语法定位到某些标签,提取标签下符合规则的链接          重用!!!

attrs:
    可以指定要提取标签的某些属性

restrict_css: 
    提取链接的时候,通过css语法定位到某些标签,提取标签下符合规则的链接           重用!!!

相关文章

  • 简单 Scrapy 使用小结

    Scrapy 安装Scrapy pip install scrapy Scrapy Doc 查看Scrapy的文档...

  • scrapy框架

    一、scrapy简介 二、scrapy原理 三、scrapy工作流程 四、scrapy框架的创建 五、scrapy...

  • Scrapy笔记

    Scrapy笔记 安装scrapy框架: 安装scrapy:通过pip install scrapy即可安装。 如...

  • scrapy笔记

    1 scrapy的运行原理 参考:Learning Scrapy笔记(三)- Scrapy基础Scrapy爬虫入门...

  • Scrapy基础(一): 安装和使用

    安装 新建scrapy项目 目录 scrapy模板 使用pycharm调试scrapy执行流程 scrapy 终端...

  • python爬虫13:scrapy

    scrapy的结构 scrapy的工作原理 scrapy的用法

  • Scrapy笔记

    Scrapy笔记 pip 指定源安装模块 创建Scrapy项目 创建Scrapy爬虫程序 启动Scrapy爬虫 在...

  • PyCharm运行和调试Scrapy

    前言: PyCharm运行和调试Scrapy,首先需要安装Scrapy,安装Scrapy请点链接Scrapy的安装...

  • 11- Scrapy-Redis分布式

    Scrapy和Scrapy-Redis的区别 安装Scrapy-Redis Scrapy-Redis介绍 提供了下...

  • scrapy框架基本使用

    scrapy基本介绍 scrapy VS requests Mac安装 conda install scrapy ...

网友评论

      本文标题:scrapy

      本文链接:https://www.haomeiwen.com/subject/rltfxqtx.html