scrapy 爬取w3school

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

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

《scrapy 爬取w3school》 PicsArt_03-02-06.50.43.jpg

    原文作者:苟雨
    原文地址: https://www.jianshu.com/p/37a9392c98dc
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞