zoukankan      html  css  js  c++  java
  • scrapy入门使用

    scrapy入门

    1. 创建一个scrapy项目
      • scrapy startporject mySpider
    2. 生产一个爬虫
      • scrapy genspider itcast "itcast.cn"
    3. 提取数据
      • 完善spider,使用xpath等方法
    4. 保存数据
      • pipeline中保存数据

    创建一个scrapy项目

    命令:scrapy startproject+<项目名字>
    scrapy startproject myspider

    使用pipeline

    从pipeline的字典形式可以看出来,pipline可以有多个,而且确实pipeline能够定义多个

    为什么需要多个pipeline:
    1. 可能会有多个spider,不同的pipeline处理不同的item内容
    2. 一个spider的内容可能要做不同的操作,比如存入不同的数据库中

    注意:
    1. pipeline的权重越小优先级越高
    2. pipeline中process_item方法名不能修改为其他的名称

    loggin 模块的使用

    • scrapy
      • settings中设置LOG_LEVEL="WANRING"
      • settings中设置LOG_FILE="./a.log" # 设置日志保存位置,设置后终端不会显示日志内容
      • import logging,实例化logger的方式在任何文件中使用logger输出

    实现翻页请求

    通过爬取腾讯招聘的页面的招聘信息,学习如何实现翻页请求
    http://hr.tencent.com/position.php

    next_page_url = response.xpath("//a[text()='下一页']/@href").extract()
    while len(next_page_url) > 0:
        yield scrapy.Request(next_page_url, callback=self.parese)
        # scrapy.Request能构建一个requests,同时指定提取数据的callback函数
    

    在setting中设置User-Agent:

    USER_AGENT = 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134'
    

    scrapy.Request知识点:

    scrapy.Request(url[, callback, method='GET', header, body, cookies, meta, dont_filter=False])
    

    注:一般文档中方括号中的参数表示可选参数
    scrapy.Request常用参数为:
    callback:指定传入的url交给哪个解析函数去处理
    meta:实现在不同的解析函数中传递数据,meta默认会携带部分信息,比如下载延迟,请求深度等
    dont_filter:让scrapy的去重不会过滤当前url.scrapy默认有url去重的功能,对需要重复请求的url有重要用途

    Scrapy深入之认识程序debug信息

    [scrapy.utils.log] INFO: Overridden setting:自己设置的setting的信息
    [scrapy.middleware] INFO: Enabled extensions extensions:启动的扩展,默认有一堆
    [scrapy.middleware] INFO: Enabled downloader extensions:启动的下载扩展,默认一堆
    [scrapy.middleware] INFO: Enabled spider extensions:启动的爬虫中间件,默认一堆
    [scrapy.middleware] INFO: Enabled pipelines extensions:启动的管道
    [scrapy.extensions.telnet] DEBUG:爬虫运行的时候能够使用telenet命令对爬虫做一些控制,比如暂停等
    [scrapy.statscollectors] INFO: Dumping Scrapy stats:爬虫结束时候的一些统计信息,比如请求响应数量等
    [scrapy.core.scraper] DEBUG: Scraped from <200 http://wz.sun0769.com/html/question/201707/340346.shtml>{'content':......} :每次yield item的时候会提示item的内容以及这个item来自的url地址
    

    Scrapy深入之scrapy shell

    Scrapy shell是一个交互终端,我们在未启动spider的情况下尝试及调式代码,也可以用来测试Xpath表达式

    使用方法:
    scrapy shell http://www.itcast.cn/channel/teacher.shtml

    response.url:当前响应的url地址
    response.request.url:当前响应对应的请求的url地址
    response.headers:响应头
    response.body:响应体,也就是html代码,默认是byte类型
    response.request.headers:当前响应的请求头

    scrapy深入之认识setting文件

    为什么需要配置文件:
    配置文件存放一些公共的变量(比如数据库的地址,账号密码等)
    方便自己和别人修改
    一般用全大写字母命名变量名 SQL_HOST = '192.168.0.1'

    scrapy深入之pipeline使用

    import json
    class JsonWritePipeline(object):
        
        def open_spider(self, spider):  # 在爬虫开启的时候执行,仅执行一次
            self.file = open(spider.settings.get("SAVE_FILE", "./temp.json"), 'w')
            
        def close_spider(self, spider):  # 在爬虫关闭的时候执行,仅执行一次
            self.file.close()
            
        def process_item(self, item, spider):
            line = json.dumps(dict(item)) + "
    "
            self.file.write(line)
            return item  # 不return的情况下,另一个权重较低的pipline就不会获取该item
    

    JsonItemExporter和JsonLinesItemExporter:

    保存json数据的时候,可以使用这个两个类,让让操作变得更简单

    1. JsonItemExporter:每次把数据添加到内存中,最后统一写入到磁盘中。存储的数据是一个满足json规则的数据。但消耗内存较大。示例代码:
    from scrapy.exporters import JsonItemExporter
    class QsbkPipeline(object):
        def __init__(self):
            self.fp = open("duanzi.json", "wb")
            self.exporter = JsonItemExporter(self.fp, ensure_ascii=False,encoding='utf-8')
            
        def open_spider(self, spider):
            print("爬虫开始了。。。")
            
        def process_item(self, item, spider):
            self.exporter.export_item(item)
            return item
            
        def close_spider(self, spider):
            self.exporter.finish_exporting()
            self.fp.close()
            print("爬虫结束了")
    
    
    1. JsonLinesItemExporter:这个是每次调用export_item的时候就把这个item存储到硬盘中。每次处理数据的时候直接存储到硬盘中,但每一个字典是一行,整个文件不是满足json格式的文件
    from scrapy.exporters import JsonLinesItemExpoprter
    class QsbkPipline(object):
        def __init__(self):
            self.fp = open("duanzi.json", 'wb')
            self.exporter = JsonLinesItemExporter(self.fp, ensure_ascii=False, encoding='utf-8')
        
         def open_spider(self, spider):
            print("爬虫开始了。。。")
            
        def process_item(self, item, spider):
            self.exporter.export_item(item)
            return item
            
        def close_spider(self, spider):
            self.fp.close()
            print("爬虫结束了")
    
  • 相关阅读:
    查看python关键字
    命令终端执行python
    Codeforces-462C. A Twisty Movement
    Codeforces-462A. A Compatible Pair
    Codeforces-446C. Pride
    Codeforces-Hello 2018C. Party Lemonade(贪心)
    Codeforces-33C. Wonderful Randomized Sum
    Codeforces-118D. Caesar's Legions(lazy dynamics)
    codeforces-73C. LionAge II
    Gym 101510C-Computer Science
  • 原文地址:https://www.cnblogs.com/colden/p/9859151.html
Copyright © 2011-2022 走看看