专栏首页UrlteamScrapy-笔记一 入门项目 爬虫抓取w3c网站

Scrapy-笔记一 入门项目 爬虫抓取w3c网站

学习自:http://blog.csdn.net/u012150179/article/details/32911511

入门项目建议仔细学习

关于环境配置请看:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/install.html

1.创建项目:

	scrapy crawl w3school

2.在items.py中定义Item容器

所谓Item容器就是将在网页中获取的数据结构化保存的数据结构,类似于Python中字典。下面为items.py中代码。

from scrapy.item import Item,Field  
  
class W3schoolItem(Item):  
    title = Field()  
    link = Field()  
    desc = Field()

定义了自己的W3schoolItem类,它继承自scrapy的Item(这里没有显示定义W3schoolItem的__init__()方法,也正因为如此,python也会为你自动调用基类的__init__(),否则必须显式在子类的__init__()中调用基类__init__())。之后声明W3schoolItem中元素并使用Field定义。

3.在pipelines.py中编写W3schoolPipeline

实现对item的处理。

在其中主要完成数据的查重、丢弃,验证item中数据,将得到的item数据保存等工作。代码如下:

# -*- coding: utf-8 -*-
 
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
 
import json  
import codecs  
  
class W3SchoolPipeline(object):  
    def __init__(self):  
        #初始化打开json记录文件数据
        #定义编码为utf-8
        self.file = codecs.open('w3school_data_utf8.json', 'wb', encoding='utf-8')  
  
    def process_item(self, item, spider):  
        line = json.dumps(dict(item)) + '\n'  
        # print line  
        
        self.file.write(line.decode("unicode_escape"))  
        return item  
        #返回类型必须要是item类型

其中的process_item方法是必须调用的用来处理item,并且返回值必须为Item类的对象,或者是抛出DropItem异常。并且上述方法将得到的item实现解码,以便正常显示中文,最终保存到json文件中。

注意:在编写完pipeline后,为了能够启动它,必须将其加入到ITEM_PIPLINES配置中,即在settings.py中加入下面一句:

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

4.爬虫主代码

spider/文件夹下编写w3cshool_spider.py

#!/usr/bin/python
# -*- coding:utf-8 -*-
 
from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy import log
 
from w3school.items import W3schoolItem
 
 
class W3schoolSpider(Spider):
    """爬取w3school标签"""
    #log.start("log",loglevel='INFO')
    #name为必须,需要在启动项目时制定
    name = "w3school"
    allowed_domains = ["w3school.com.cn"]
    #制定url列表,一般放置url根路口
    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)
 
            #记录
            log.msg("Appending item...",level='INFO')
 
 
        log.msg("Append done.",level='INFO')
        return items

(1)需要注意的是编写的spider必须继承自scrapy的Spider类。

属性name即spider唯一名字,start_url可以理解为爬取入口。

(2)parse方法。

parse()是对scrapy.Spider类的override。

(3)网页中的数据提取机制。

scrapy使用选择器Selector并通过XPath实现数据的提取。关于XPath 推荐w3school的教程。

(4)在parse方法中还使用到了log功能实现信息记录。

使用log.mes()函数即可。

5.最终结果:

提取的是http://www.w3school.com.cn/xml/xml_syntax.asp网页中下图部分。

即“XML 基础”下所有目录结构的名字、链接和描述。使用Firebug找到次部分对应的代码块后就可以使用XPath执行信息提取。Xpath表达式如上面代码中所示。

上面还涉及到了对item中信息的编码,是为了中文信息在json文件中的正确显示。

6.运行项目

scrapy crawl w3school

运行 vim w3school_data_utf8.json

即可看到

7.审查元素

一般使用谷歌浏览器,然后在页面右击选择审查||检查,或者f12可以看到页面的源代码,可以进行xpath的筛选

原创文章,转载请注明: 转载自URl-team

本文链接地址: Scrapy-笔记一 入门项目 爬虫抓取w3c网站

  1. Scrapy-笔记二 中文处理以及保存中文数据
  2. Scrapy笔记三 自动多网页爬取-本wordpress博客所有文章
  3. Scrapy笔记四 自动爬取网页之使用CrawlSpider
  4. Scrapy笔记五 爬取妹子图网的图片 详细解析
  5. Scrapy笔记零 环境搭建与五大组件架构
  6. 基于百度IP定位的网站访问来源分析的python实战项目–实践笔记二–调百度地图将经纬信息可视化呈现

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【PAT甲级】Sign In and Sign Out

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • Python“爬”房,带你看最真实的房价!

    人人都说买房难买房难,付完首付付月供,小N身边也有不少朋友在为这个问题烦恼。 A在深圳 ? 姓名:小宇 年龄:25岁 买房难题:工资只有4500,买了房=...

    腾讯NEXT学位
  • 腾讯智启学堂走进校园 玉龙中学编程课引专家团观摩

    ? 2019年11月7日,由南方科技大学、香港大学的专家学者们组成的人工智能教育应用考察团在深圳市龙华区玉龙中学,观摩了一场别开生面的编程课,并对龙华区的青少...

    腾讯智慧教育
  • 中文编程为什么没有发展起来?

    我是雪易网的开发者玩蛇的胖纸,当你看到这封信的时候,我想我已经离开易语言界很久了。

    玩蛇的胖纸
  • #000 Python 入门第一题通过扩展,学到了更多的知识

    创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    韩旭051
  • 【PAT甲级】Linked List Sorting

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk
  • async/await 原理及执行顺序分析

    之前写了篇文章《这一次,彻底理解Promise原理》,剖析了Promise的相关原理。我们都知道,Promise解决了回调地狱的问题,但是如果遇到复杂的业务,代...

    桃翁
  • PHP函数之日期时间函数date()详解

    format 必需。规定时间戳的格式。 timestamp 可选。规定时间戳。默认是当前的日期和时间。

    乄浪漫经典
  • 数据分析最有用的 Top 50 Matplotlib 图(附完整的Python代码)(上)

    50个Matplotlib图的汇编,在数据分析和可视化中最有用。此列表允许您使用Python的Matplotlib和Seaborn库选择要显示的可视化对象。

    小草AI
  • 【PAT乙级】Wifi密码

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    喜欢ctrl的cxk

扫码关注云+社区

领取腾讯云代金券