zoukankan      html  css  js  c++  java
  • scrapy 中文官网学习

    scrapy 中文官网学习:

    官网测试网址:
    	http://lab.scrapyd.cn/  
    

    项目:

    scrapy startproject mingyan
    
    创建py 文件:
    	1. 定义类,继承scrapy.Spider类
         2. 定义一个蜘蛛名,name=“”
         3.定义我们需要爬取的网址
         4.继承scrapy的一个方法:start_requests(self),这个方法的作用就是通过上面定义的链接去爬取页面
    
    

    实例:

    import scrapy
    
    class mingyan(scrapy.Spider):
        name = "mingyan2" # 定义蜘蛛名
         def start_requests(self): # 由此方法通过下面链接爬取页面
            
                # 定义爬取的链接
                urls = [
                    'http://lab.scrapyd.cn/page/1/',
                    'http://lab.scrapyd.cn/page/2/',
                ]
                for url in urls:
                    yield scrapy.Request(url=url, callback=self.parse)
                    
           def parse(self, response):
            	'''
            	scrapy运行的流程:
                    1、定义链接;
                    2、通过链接爬取(下载)页面;
                    3、定义规则,然后提取数据 '''
                
                page = response.url.split("/")[-2]     
                filename = 'mingyan-%s.html' % page    
                with open(filename, 'wb') as f:    
                    f.write(response.body)             
                self.log('保存文件: %s' % filename)     # 打印日志
    
    --》 scrapy crawl  mingyan2 --nolog   # 执行 (不打印)
    

    scrapy shell:

    测试业面数据提取:
    	scrapy shell + 页面
    	scrapy shell http://lab.scrapyd.cn
        	
        输入提取条件:
        	response.css('title')、
        返回结果:
        	[<Selector xpath='descendant-or-self::title' data='<title>爬虫实验室 - S
    CRAPY中文网提供</title>'>]
    

    css提取工具:

     response.css('title').extract()
     -->['<title>爬虫实验室 - SCRAPY中文网提供</title>']
    
    >>>  response.css('title').extract()[0]
     '<title>爬虫实验室 - SCRAPY中文网提供</title>'
        
    >>>  response.css('title').extract_first()
     '<title>爬虫实验室 - SCRAPY中文网提供</title>'
        
    extract() 这么一个函数你就提取到了我们标签的一个列表
    		 在后面添加:[0],那代表提取这个列表中的第一个元素
    extract_first()就代表提取第一个元素,和我们的:[0],一样的效果,只是更简洁些
    
    >>> response.css('title::text').extract_first()
    '爬虫实验室 - SCRAPY中文网提供'
    
    title后面加上了 ::text ,这代表提取标签里面的数据
    --> response.css('title::text').extract_first()
    

    css 提取实战:

    import scrapy
    
    
    class itemSpider(scrapy.Spider):
        name = 'itemSpider'
        start_urls = ['http://lab.scrapyd.cn']
    
        def parse(self, response):
            mingyan = response.css('div.quote')[0]
    
            text = mingyan.css('.text::text').extract_first()  # 提取名言
            autor = mingyan.css('.author::text').extract_first()  # 提取作者
            tags = mingyan.css('.tags .tag::text').extract()  # 提取标签
            tags = ','.join(tags)  # 数组转换为字符串
    
            fileName = '%s-语录.txt' % autor  # 爬取的内容存入文件,文件名为:作者-语录.txt
            f = open(fileName, "a+")  # 追加写入文件
            f.write(text)  # 写入名言内容
            f.write('
    ')  # 换行
            f.write('标签:'+tags)  # 写入标签
            f.close()  # 关闭文件操作
    
    import scrapy
    
    class itemSpider(scrapy.Spider):
    
        name = 'listSpider'
    
        start_urls = ['http://lab.scrapyd.cn']
    
        def parse(self, response):
            mingyan = response.css('div.quote')  # 提取首页所有名言,保存至变量mingyan
    
            for v in mingyan:  # 循环获取每一条名言里面的:名言内容、作者、标签
    
                text = v.css('.text::text').extract_first()  # 提取名言
                autor = v.css('.author::text').extract_first()  # 提取作者
                tags = v.css('.tags .tag::text').extract()  # 提取标签
                tags = ','.join(tags)  # 数组转换为字符串
    
                """
                接下来进行写文件操作,每个名人的名言储存在一个txt文档里面
                """
                fileName = '%s-语录.txt' % autor  # 定义文件名,如:木心-语录.txt
    
                with open(fileName, "a+") as f:  # 不同人的名言保存在不同的txt文档,“a+”以追加的形式
                    f.write(text)
                    f.write('
    ')  # ‘
    ’ 表示换行
                    f.write('标签:' + tags)
                    f.write('
    -------
    ')
                    f.close()
    

    翻页:

    next_page = response.css('li.next a::attr(href)').extract_first()  
            if next_page is not None: 
                next_page = response.urljoin(next_page)
                yield scrapy.Request(next_page, callback=self.parse)
    

    指定参数爬取:

     def start_requests(self):
            url = 'http://lab.scrapyd.cn/'
            tag = getattr(self, 'tag', None)  # 获取tag值,也就是爬取时传过来的参数
            if tag is not None: 
                url = url + 'tag/' + tag  # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
            yield scrapy.Request(url, self.parse)  
    
    爬取标签:爱情
    scrapy crawl argsSpider -a tag=爱情
    
    scrapy crawl argsSpider -a tag=励志
    
    import scrapy
    
    class ArgsspiderSpider(scrapy.Spider):
    
        name = "argsSpider"
    
        def start_requests(self):
            url = 'http://lab.scrapyd.cn/'
            tag = getattr(self, 'tag', None)  # 获取tag值,也就是爬取时传过来的参数
            if tag is not None:  
                url = url + 'tag/' + tag  # 构造url若tag=爱情,url= "http://lab.scrapyd.cn/tag/爱情"
            yield scrapy.Request(url, self.parse)  
    
        def parse(self, response):
            mingyan = response.css('div.quote')
            for v in mingyan:
                text = v.css('.text::text').extract_first()
                tags = v.css('.tags .tag::text').extract()
                tags = ','.join(tags)
                fileName = '%s-语录.txt' % tags
                with open(fileName, "a+") as f:
                    f.write(text)
                    f.write('
    ')
                    f.write('标签:' + tags)
                    f.write('
    -------
    ')
                    f.close()
            next_page = response.css('li.next a::attr(href)').extract_first()
            if next_page is not None:
                next_page = response.urljoin(next_page)
                yield scrapy.Request(next_page, callback=self.parse)
    

    xpath 提取:

    /	从根节点选取。
    //	从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
    .	选取当前节点。
    ..	选取当前节点的父节点。
    @	选取属性
    
    包含HTML标签的所有文字内容提取:string()
    response.xpath("string(//div[@class='post-content'])").extract()
    
    string(要提取内容的标签),这样的话就能把数据都提取出来了,而且都合成为一条
    
    /bookstore/book[last()]	选取属于 bookstore 子元素的最后一个 book 元素。
    
    /bookstore/book[price>35.00]	选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00
    
    查看scrapy版本,用法:
    	scrapy version
        
    
  • 相关阅读:
    EasyNVR内网摄像机接入网关+EasyNVS云端管理平台,组件起一套轻量级类似于企业级萤石云的解决方案
    EasyNVR摄像机无插件直播安装使用错误原因解析
    网络摄像机进行互联网视频直播录像方案的选择,EasyNVS or EasyCloud or EasyGBS?
    EasyNVR对接EasyCloud视频云平台进行云端录像
    RTSP安防摄像机(海康大华宇视等)如何推送到RTMP流媒体服务器进行直播
    普通摄像机也能做互联网HLS(m3u8)、RTMP、HTTP-FLV直播?是的,采用基于GBT28181协议的EasyGBS流媒体服务
    对EasyDarwin开源项目2018的思考与2019发展的规划:继续站在巨人的肩膀引入更多巨人
    EasyNVR智能云终端接入AI视频智能分析功能,用户可自定义接入自己的分析算法
    如何自己实现一套EasyNVR这样的无插件流媒体服务器
    宇视4G设备采用GB/T28181协议成功接入EasyGBS国标流媒体平台的设置流程
  • 原文地址:https://www.cnblogs.com/shaozheng/p/12792859.html
Copyright © 2011-2022 走看看