scrapy 爬取w3school

作者: 苟雨 | 来源:发表于2017-03-01 19:04 被阅读80次

    scrapy是一个从网站中提取结构化数据爬虫框架,简单易用。
    内部使用Twisted作为处理网络通信,具有异步特性。

    开始构建项目,

    scrapy start project my project
    #myproject 是项目名称
    

    构建一个框架,

    scrapy.cfg
    myproject/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...
    

    scrapy.cfg 存放的目录被认为是 项目的根目录 。该文件中包含python模块名的字段定义了项目的设置。

    定义要爬取的结构化数据

    Item 是保存爬取到的数据的容器;其使用方法和python字典类似, 并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。
    定义这个字段定义在items.py文件中,

    class W3SchoolItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
    
        title = scrapy.Field()
        link = scrapy.Field()
        desc = scrapy.Field()
    

    创建爬虫spider

    进入scrapy.cfg 所在目录,运行下面命令,

    scrapy genspider myspider
    # my spider 是爬虫的名称,可随意定制
    

    编写提取数据的逻辑

    进入到spider目录编辑刚刚创建的myspider.py文件

    import scrapy
    from scrapy.selector import Selector
    from w3school.items import W3SchoolItem
    
    class W3schoolSpiderSpider(scrapy.Spider):
        name = "w3school_spider"
        allowed_domains = ["w3school.com.cn"]
        start_urls = ["http://www.w3school.com.cn/xml/xml_syntax.asp"]
    
        def parse(self, response):
            # 选择器获取页面源码,
            sel = Selector(response)
            # 使用xparh进行筛选,选取所有div中id为navsecond的层所包含的所有div中id为course的ul中ul标签下的,li标签内容,
            sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')
    
            # 定义一个items容器
            items = []
            # site的内容包括href为链接,title为标题,
            for site in sites:
                # 成为ie一个item的字典类型
                item = W3SchoolItem()
                # 对每一个site使用xpath抽取出a标签内的text,href,title.
                title = site.xpath('a/text()').extract()
                link = site.xpath('a/@href').extract()
                desc = site.xpath('a/@title').extract()
    
                item['title'] = [t.encode('utf-8') for t in title]
                item['link'] = [l.encode('utf-8') for l in link]
                item['desc'] = [d.encode('utf-8') for d in desc]
                # 在列表中加入这个字典
                items.append(item)
    
    
            return items
    

    选择器Selector

    scrapy中可以使用xpathcsshtml中选择数据,

    XPath表达式的一些介绍:
    1.  /html/head/title: 选择HTML文档中 <head> 标签内的 <title> 元素
    2. /html/head/title/text(): 选择上面提到的 <title> 元素的文字
    3. //td: 选择所有的 <td> 元素
    4. //div[@class="mine"]: 选择所有具有 class="mine" 属性的 div 元素
    
    

    储存数据

    在pipelines.py中将取到的item储存在文件中,

    import codecs
    import json
    
    
    class W3SchoolPipeline(object):
        def __init__(self):
            self.file = codecs.open('w3school_utf-8.json','w',encoding='utf-8')
    
    
        def process_item(self, item, spider):
            line = json.dumps(dict(item)) + '\n'
    
            self.file.write(line.encode('unicode_escape'))
            print(item)
    
            return item
    
        def close_spider(self,spider):
            self.file.close()
    

    配置

    settings.py文件中加入下面代码(其实文件中已经有了只是被注释了)

    ITEM_PIPELINES = {
       'w3school.pipelines.W3SchoolPipeline': 300,
    }
    

    只差最后一步了,

    scrapy crawl myproejct
    

    等待爬取结束,打开文件就可以看到爬到的数据了!
    扫码获取源码,


    PicsArt_03-02-06.50.43.jpg

    相关文章

      网友评论

        本文标题:scrapy 爬取w3school

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