scrapy研究探索(二)——爬w3school.com.cn
下午被一个问题困扰了好一阵。终于使用还有一种方式解决。
開始教程二。关于Scrapy安装、介绍等请移步至教程(一)(http://blog.csdn.net/u012150179/article/details/32343635)。
在開始之前如果你已经安装成功一切所需,整怀着一腔热血想要抓取某站点。
一起来have a try。
1. 前期基础准备。
Oh,不能在准备了,直接来。
(1) 创建项目。
输入:
scapy startproject w3school
以上创建项目w3school。这时会产生w3school目录,目录下文件例如以下:
scrapy.cfg
w3school/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
当中scrapy.cfg目的配置文件。主要改写的是w3school中的三个文件以及当中spiders中须要编写的爬虫。
一个一个来。
(2) 在items.py中定义Item容器。也就是编写items.py内容。
所谓Item容器就是将在网页中获取的数据结构化保存的数据结构,类似于python中字典。以下为items.py中代码。
#project: w3school
#file : items.py
#author : younghz
#brief : define W3schoolItem. 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定义。到此items.py就OK了。
(3) 在pipelines.py中编写W3schoolPipeline实现对item的处理。
在当中主要完毕数据的查重、丢弃,验证item中数据。将得到的item数据保存等工作。代码例如以下:
import json
import codecs class W3SchoolPipeline(object):
def __init__(self):
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
当中的process_item方法是必须调用的用来处理item,而且返回值必须为Item类的对象。或者是抛出DropItem异常。而且上述方法将得到的item实现解码,以便正常显示中文。终于保存到json文件里。
注意:在编写完pipeline后。为了可以启动它,必须将其增加到ITEM_PIPLINES配置中,即在settings.py中增加以下一句:
ITEM_PIPELINES = {
'w3school.pipelines.W3SchoolPipeline':300
}
2.编写爬虫。
爬虫编写是在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 = "w3school"
allowed_domains = ["w3school.com.cn"]
start_urls = [
"http://www.w3school.com.cn/xml/xml_syntax.asp"
] def parse(self, response): sel = Selector(response)
sites = sel.xpath('//div[@id="navsecond"]/div[@id="course"]/ul[1]/li')
items = [] for site in sites:
item = W3schoolItem() 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的教程。
小工具:
关于网页代码中意向信息的查找能够借助几个工具:
第一个——Firefox插件Firebug。
第二个——Firefox插件XPath。能够高速的在网页中对xpath表达式的正确性进行验证。
第三个——scrapy shell.关于其使用能够查看教程。
分析:
在这里我提取的是http://www.w3school.com.cn/xml/xml_syntax.asp网页中下图部分。
即“XML 基础”下全部文件夹结构的名字、链接和描写叙述。
使用Firebug找到次部分相应的代码块后就能够使用XPath运行信息提取。Xpath表达式如上面代码中所看到的。
上面还涉及到了对item中信息的编码,是为了中文信息在json文件里的正确显示。
(4)在parse方法中还使用到了log功能实现信息记录。使用log.mes()函数就可以。
3.运行。
一切就绪。
进入到项目文件夹下,运行:
scrapy crawl w3school --set LOG_FILE=log
在文件夹下生成log和w3school_data_utf8.json文件。
查看生成的json文件:
OK。这就实现了针对 http://www.w3school.com.cn/xml/xml_syntax.asp中导航条部分的提取。
原创,转载注明:http://blog.csdn.net/u012150179/article/details/32911511
关于scrapy的其他文章:
http://blog.csdn.net/u012150179/article/details/34913315
http://blog.csdn.net/u012150179/article/details/34486677
http://blog.csdn.net/u012150179/article/details/34441655
scrapy研究探索(二)——爬w3school.com.cn的更多相关文章
- Scrapy研究探索(六)——自己主动爬取网页之II(CrawlSpider)
原创,转载注明:http://blog.csdn.net/u012150179/article/details/34913315 一.目的. 在教程(二)(http://blog.csdn.net/u ...
- Scrapy研究探索(三)——Scrapy核心架构与代码执行分析
学习曲线总是这样,简单样例"浅尝".在从理论+实践慢慢攻破.理论永远是基础,切记"勿在浮沙筑高台". 一. 核心架构 关于核心架构.在官方文档中阐述的非常清晰, ...
- Scrapy研究和探索(五岁以下儿童)——爬行自己主动多页(抢别人博客所有文章)
首先.在教程(二)(http://blog.csdn.net/u012150179/article/details/32911511)中,研究的是爬取单个网页的方法.在教程(三)(http://blo ...
- Python爬虫框架Scrapy实例(二)
目标任务:使用Scrapy框架爬取新浪网导航页所有大类.小类.小类里的子链接.以及子链接页面的新闻内容,最后保存到本地. 大类小类如下图所示: 点击国内这个小类,进入页面后效果如下图(部分截图): 查 ...
- 关于ADMM的研究(二)
关于ADMM的研究(二) 4. Consensus and Sharing 本节讲述的两个优化问题,是非常常见的优化问题,也非常重要,我认为是ADMM算法通往并行和分布式计算的一个途径:consens ...
- Scrapy爬虫框架之爬取校花网图片
Scrapy Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设 ...
- 爬虫框架Scrapy之案例二
新浪网分类资讯爬虫 爬取新浪网导航页所有下所有大类.小类.小类里的子链接,以及子链接页面的新闻内容. 效果演示图: items.py import scrapy import sys reload(s ...
- scrapy框架(二)
scrapy框架(二) 一.scrapy 选择器 概述: Scrapy提供基于lxml库的解析机制,它们被称为选择器. 因为,它们“选择”由XPath或CSS表达式指定的HTML文档的某部分. Sca ...
- 【转载】python3安装scrapy之windows32位爬坑
python3安装scrapy之windows32位爬坑 原创 2016年11月06日 01:38:08 标签: scrapy / windows / python / 开源框架 / 网络爬虫 早 ...
随机推荐
- 使用CSStickyHeaderFlowLayout实现头部固定的CollectionView
近期流行的一种界面效果,是瀑布流的header固定,也叫sticky header或者parallax.对于UITableView,能够比較方便地让table header固定,可是对于UIColle ...
- 去哪网实习总结:JavaWeb中文传參乱码问题的解决(JavaWeb)
本来是以做数据挖掘的目的进去哪网的.结构却成了系统开发... 只是还是比較认真的做了三个月.老师非常认同我的工作态度和成果... 实习立即就要结束了,总结一下几点之前没有注意过的变成习惯和问题,分享给 ...
- DNS递归查询和迭代查询的差别
转载地址:http://blog.csdn.net/wuchuanpingstone/article/details/6720723 递归查询和迭代查询的差别 (1)递归查询 递归查询是一种DNS s ...
- 读配置文件能够保持顺序的 Java Properties 类
序 前几天,公司项目中有一个需求是读取配置文件的.并且最好可以保证载入到内存中的顺序可以和配置文件里的顺序一致,可是.假设使用 jdk 中提供的 Properties 类的话,读取配置文件后.载入到内 ...
- Regexp-Utils:身份证号校验
ylbtech-Regexp-Utils:身份证号校验 1.返回顶部 1.方法 var idCardNoUtil = { /*省,直辖市代码表*/ provinceAndCitys: { 11: &q ...
- BZOJ 3624 并查集 (Kruskal)
思路: 先把所有能加上的水泥路都加上 判断哪些是必加的鹅卵石路 再重新做一遍最小生成树 加上必加的鹅卵石路 一直加鹅卵石路 判一下是不是=k 最后加上水泥路就好了 //By SiriusRen #in ...
- Spark RDD概念学习系列之如何创建Pair RDD
不多说,直接上干货! 创建Pair RDD Python语言 pairs = lines.map(lambda x: (x.split(], x)) scala语言 val pairs = line ...
- 爬虫概念与编程学习之如何爬取视频网站页面(用HttpClient)(二)
先看,前一期博客,理清好思路. 爬虫概念与编程学习之如何爬取网页源代码(一) 不多说,直接上代码. 编写代码 运行 <!DOCTYPE html><html><head& ...
- 欢迎来到SQL学院
给学习SQL的同学的福利@ http://sqlschool.modeanalytics.com/ 第一部分 学习SQL 本教程是专为那些想用数据回答问题的人们而设计的.从很大程度上讲,SQL是数据分 ...
- Java高级——交通灯管理系统
本方法模拟了现实生活中的交通信号灯的情况 1.先构建Road类,此类可以创建12个方向的路 代码如下: package com.springtie.traffic; import java.util. ...