zoukankan      html  css  js  c++  java
  • 1scrapy框架使用-入门,创建项目,生成爬虫,编写爬虫,使用pipeline,使用log,

    ####

    安装scrapy

    安装:pip install scrapy

    ####

    创建scrapy项目

    进入你要创建项目的目录下来,在命令窗口,输入命令:scrapy startproject scrapy_demo1

     

    ###

    生成一个爬虫,

    进入爬虫项目的根目录,然后执行命令,scrapy genspider spider1 baidu.com

    注意最后有一个域名,这个就是你要爬取的网站的域名,

    为什么要生成爬虫的时候给一个域名,因为防止爬取的时候爬到别的网站上去了,

    #####

    项目目录解释

    上面的操作结果

    ######

    解释这个目录结构

    1,spider就是写爬虫的

    2,iterms,定义了字段

    3,middlewares,中间件

    4,pipeline,就是处理保存数据的

    5,setting就是配置文件,

    6,scrapy.cfg,这是文件指定了配置文件的位置,

    ####

    编写第一个爬虫

    import scrapy
    
    
    class Spider1Spider(scrapy.Spider):
        name = 'spider1'
        allowed_domains = ['sina.com.cn']
        start_urls = ['https://news.sina.com.cn/']
    
        def parse(self, response):
            print(response.text)
    
    
    if __name__ == '__main__':
        from scrapy import cmdline
        cmdline.execute("scrapy crawl spider1 --nolog".split())

    ##

    注意,使用response的方法和requests是一样的,

    #### 

    运行爬虫

    命令:

    scrapy crawl itcast 后面跟的是爬虫的名字

    scrapy crawl 爬虫名字 --nolog

    会打印很多的日志,可以把日志关闭,在setting文件里面,加上这一句:LOG_LEVEL = "WARNING"

    启动爬虫run.py

    from scrapy import cmdline
    cmdline.execute("scrapy crawl lagou".split())

    ####

    爬虫内部方法的使用:

    import scrapy
    
    
    class Spider1Spider(scrapy.Spider):
        name = 'spider1'
        allowed_domains = ['sina.com.cn']
        start_urls = ['https://news.sina.com.cn/']
    
        def parse(self, response):
            # print(response.text)
            # print(dir(response))
    
            # print(dir(response.xpath('//div[@id = "syncad_1"]//a/text()')))
            # print(response.xpath('//div[@id = "syncad_1"]//a/text()'))  # 这是返回一个选择器列表
            # print(response.xpath('//div[@id = "syncad_1"]//a/text()').extract())   # 这是返回一个列表
            # print(response.xpath('//div[@id = "syncad_1"]//a/text()').extract_first())  # 这是返回列表的第一个值,
            # print(response.xpath('//div[@id = "syncad_1"]//a/text()').get())
            ret = response.xpath('//div[@id = "syncad_1"]//a')
            for i in ret:
                # print(i.xpath('./text()').extract_first())
                # print(i.attrib['href'])
                # print(i.xpath('./@href').extract_first())
                yield {
                    "text": i.xpath('./text()').extract_first(),
                    "href": i.xpath('./@href').extract_first()
                }
    
    
    
    if __name__ == '__main__':
        from scrapy import cmdline
        cmdline.execute("scrapy crawl spider1 --nolog".split())

    ####

    1,yield item  ---这个yield一定要是一个requests,或者baseitem,或者字典,或者none,不能是一个列表,现在就是返回的一个字典

    2,把item传递到pipeline里面,使用yield,使用生成器,减少内存占用

    3,注意,这个parse方法不能动,

    ####

    开启pipeline,处理数据

    开启pipeline,爬虫里面的yield item才可以传递到pipeline里面

    settings里面设置打开

    ITEM_PIPELINES = {
       'myspider.pipelines.MyspiderPipeline': 300,  后面的这个值是权重,有多个时候,先经过权重低的,
      'myspider.pipelines.MyspiderPipeline1': 301, }

    1,可以有多个处理的pipeline

    2,权重值越小,优先级越高,

    3,如果有多个pipeline,必须要都加入setting里面,

    ###

     对应的pipeline

    class ScrapyDemo1Pipeline:
        def process_item(self, item, spider):
            print(item)
            item["hello"] = "world"
            print(dir(spider))
            print(spider.name)
            print("--------")
            return item
    
    class MyspiderPipeline1:
        def process_item(self, item, spider):
            print(item)
            return item

    ###

    1,这个process_item 方法的名字不能动,必须要这个名字,这是专门来接收spider返回的内容的,

    2,这个return一定要有,因为需要传递到后面一个process里面,

    3,记住,这个pipeline是所有的爬虫公用的,那怎么区分这个进来的爬虫,可以使用spider.name来识别,

    ####

    logging使用

    首先是在setting中设置使用log

    scrapy中使用logging
    
    #settings中设置
    LOG_LEVEL=“WARNING”
    LOG_FILE="./a.log"  #设置日志保存的位置,设置会后终端不会显示日志内容

    然后可以使用一个logger文件封装,这样是使用一个单例模式,不会每次都生成一个logger,

    普通项目中使用logging
    具体参数信息:https://www.cnblogs.com/bjdxy/archive/2013/04/12/3016820.html
    
    #a.py文件
    
    import logging
    #level: 设置日志级别,默认为logging.WARNING
    logging.basicConfig(level=logging.INFO,
                        format=
                            #日志的时间
                            '%(asctime)s'
                            #日志级别名称 : 当前行号
                            ' %(levelname)s [%(filename)s : %(lineno)d ]'
                            #日志信息
                            ' : %(message)s'
                            #指定时间格式
                            , datefmt='[%Y/%m/%d %H:%M:%S]')
    #实例化logging,显示当前运行文件的名字,不写不会显示运行文件的目录
    logging=logging.getLogger(__name__)
    
    if __name__ == '__main__':
        #日志级别打印信息
        logging.info("this is a info log")


    b.py文件使用a.py文件的logging(日志)
    #b.py文件 from a import logging #导入a.py中的实例logging if __name__ == '__main__': #warning级别大于info也可以打印,debug级别小于info,不可以打印 logger.warning("this is log b")
    日志级别: debug   
    #调试 info     #正常信息 warning  #警告 error   #错误 如果设置日志级别为info,warning级别比info大,warning也可以打印,debug比info小不可以打印 如果设置日志级别为warning,info和debug都比warning小,不可以打印

     ####

    ####

  • 相关阅读:
    二维码登录网页版微信的实现方式分析
    扒取网站内容(后台方法和前台方法的两种实现)
    网站基本架构模式以及优化方案
    JS 日期对象在浏览器间的若干差异
    Web Farm 和Web Garden
    邓白氏申请和查询
    Xcode 真机调试报错:This application's application-identifier entitleme
    libc++abi.dylib`__cxa_throw: 使用[AVAudioPlayer play]会产生__cxa_throw异常
    ios 瀑布流的那些事情
    ios UIImage 圆形图片剪切方案
  • 原文地址:https://www.cnblogs.com/andy0816/p/15055686.html
Copyright © 2011-2022 走看看