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

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