scrapy研究探索(二)——爬w3school.com.cn
2015-11-01 16:36
429 查看
文章转自:/article/1378199.html
下午被一个问题困扰了好一阵,最终使用另一种方式解决。
开始教程二,关于Scrapy安装、介绍等请移步至教程(一)(/article/1378200.html)。
在开始之前假设你已经成功安装一切所需,整怀着一腔热血想要抓取某网站。一起来have a try。
Oh,不能在准备了,直接来。
输入:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
scapy startproject w3school
以上创建项目w3school。这时会产生w3school文件夹,文件夹下文件如下:
[plain] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
scrapy.cfg
w3school/
__init__.py
items.py
pipelines.py
settings.py
spiders/
__init__.py
其中scrapy.cfg目的配置文件。主要改写的是w3school中的三个文件以及其中spiders中需要编写的爬虫。
一个一个来。
所谓Item容器就是将在网页中获取的数据结构化保存的数据结构,类似于python中字典。下面为items.py中代码。
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
#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了。
在其中主要完成数据的查重、丢弃,验证item中数据,将得到的item数据保存等工作。代码如下:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
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中加入下面一句:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
ITEM_PIPELINES = {
'w3school.pipelines.W3SchoolPipeline':300
}
爬虫编写是在spider/文件夹下编写w3cshool_spider.py。
先上整个程序在慢慢解释:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
#!/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
属性name即spider唯一名字,start_url可以理解为爬取入口。
parse()是对scrapy.Spider类的override。
scrapy使用选择器Selector并通过XPath实现数据的提取。关于XPath 推荐w3school的教程。
关于网页代码中意向信息的查找可以借助几个工具:
第一个——Firefox插件Firebug。
第二个——Firefox插件XPath。可以快速的在网页中对xpath表达式的正确性进行验证。
第三个——scrapy shell.关于其使用可以查看教程。
在这里我提取的是http://www.w3school.com.cn/xml/xml_syntax.asp网页中下图部分。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/02/2cfce9b81aaf5895eb69a2ef75bde8fc)
即“XML 基础”下所有目录结构的名字、链接和描述。使用Firebug找到次部分对应的代码块后就可以使用XPath执行信息提取。Xpath表达式如上面代码中所示。
上面还涉及到了对item中信息的编码,是为了中文信息在json文件中的正确显示。
一切就绪。进入到项目目录下,执行:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/9e12f1d3e499fc949c886e7c9e0484f9)
scrapy crawl w3school --set LOG_FILE=log
在目录下生成log和w3school_data_utf8.json文件。
查看生成的json文件:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/02/d3fc854887031b7ee4fe238ebcf23180)
OK。这就实现了针对 http://www.w3school.com.cn/xml/xml_syntax.asp中导航条部分的提取。
原创,转载注明:/article/1378199.html
关于scrapy的其它文章:
/article/1378195.html
/article/1378196.html
http://blog.csdn.net/u012150179/article/details/34441655
/article/1378199.html
/article/1378194.html
下午被一个问题困扰了好一阵,最终使用另一种方式解决。
开始教程二,关于Scrapy安装、介绍等请移步至教程(一)(/article/1378200.html)。
在开始之前假设你已经成功安装一切所需,整怀着一腔热血想要抓取某网站。一起来have a try。
1. 前期基础准备。
Oh,不能在准备了,直接来。
(1) 创建项目。
输入:[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
scapy startproject w3school
以上创建项目w3school。这时会产生w3school文件夹,文件夹下文件如下:
[plain] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
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中代码。[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
#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数据保存等工作。代码如下:[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
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中加入下面一句:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
ITEM_PIPELINES = {
'w3school.pipelines.W3SchoolPipeline':300
}
2.编写爬虫。
爬虫编写是在spider/文件夹下编写w3cshool_spider.py。先上整个程序在慢慢解释:
[python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
#!/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.执行。
一切就绪。进入到项目目录下,执行: [python] view
plaincopy
![](https://oscdn.geek-share.com/Uploads/Images/Content/201611/a7c8e286f463007e2a900848b93dd72c.png)
scrapy crawl w3school --set LOG_FILE=log
在目录下生成log和w3school_data_utf8.json文件。
查看生成的json文件:
OK。这就实现了针对 http://www.w3school.com.cn/xml/xml_syntax.asp中导航条部分的提取。
原创,转载注明:/article/1378199.html
关于scrapy的其它文章:
/article/1378195.html
/article/1378196.html
http://blog.csdn.net/u012150179/article/details/34441655
/article/1378199.html
/article/1378194.html
相关文章推荐
- XStream的例子
- sqlserver update select
- 快速排序
- Linux下用c语言实现whereis.
- soj 3636 理想的正方形(二维单调队列)
- Html+Css_ 行内元素与块级元素比较全面的区别和转换
- 移动设备尺寸规范汇总(转)
- The connection to adb is down,and a server error has occured安卓模拟器端口被占用
- How To : Modify ASM SYS password using asmcmd 11g R2 and upper
- UIScrollView 侧滑的手势冲突怎么解决?
- gitbub的使用
- JS-中查询页面开始日期和结束日期选择 检查合法性
- 查漏补缺1
- 分库分表带来的完整性和一致性问题
- 数据库分库分表(sharding)
- 解释编译结果
- (NO.00002)iOS游戏精灵战争雏形(十一)
- ios 多线程
- (NO.00002)iOS游戏精灵战争雏形(十一)
- (NO.00002)iOS游戏精灵战争雏形(十一)