码迷,mamicode.com
首页 > 其他好文 > 详细

关于一只爬虫

时间:2015-11-28 21:25:08      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:

记一只爬虫

记一只爬虫

新建project

scrapy startproject tutorial

技术分享
这些文件主要是:

  • scrapycfg:项目配置文件,一般不需要改
  • tutorial/:项目python模块,代码将从这里导入
  • tutorial/items.py:项目items文件
  • tutorial/pipelines.py:项目管道文件
  • tutorial/settings.py:项目配置文件
  • tutorial/spiders/:放置spider的目录

定义Item

Items是将要装载机抓取的数据的容器,跟python里面的字典差不多,但它提供更多的保护,如对未定义的字段填充,以防止拼写错误。

我们通过将需要的item模块化,来控制从dmoz.org获得的站点数据,比如说站点的名字、url和网站描述。定义一下这三种属性的域,编辑一下tuto目录下的items.py

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

爬虫(Spider)

Spider是用户编写的类,用于从一个域(或域组)中抓取信息。

它们定义了用于下载URL的初步列表,如何跟踪链接,以及如何来解析这些网页内容用于提取items。

要建立一个Spider,必须为scrapy.spider.BaseSpider创建一个子类,并确定三个主要的、强制的属性:

  • name:爬虫的识别名,它必须是唯一的,在不同的爬虫中你必须定义不同的名字
  • start_urls:爬虫开始爬的一个URL列表,爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些URLS开始,其他子URL将会从这些起始URL中继承性生成
  • parse():爬虫的方法,调用时候传入从每一个URL传回的Response对象作为参数,response将会是parse方法的唯一的一个参数,这个方法负责解析返回的数据,匹配抓取的数据(解析为item)并跟踪更多的URL

在tutorial/spiders目录下,新建一个dmoz_spider.py的文件

from scrapy.spider import BaseSpider

class DmozSpider(BaseSpider):
name="dmoz"
allowed_domains=["dmoz.org"]
start_urls=[
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources"
]

def parse(self,response):
filename=response.url.split("/")[-2]
open(filename,‘wb‘).write(response.body)

爬虫运行

在终端输入下面命令:

[KANO@kelvin tutorial]$ scrapy crawl dmoz

你将会得到如下类似输出:
技术分享

提取Item

Scrapy使用一种叫做XPath selectors的机制,它基于XPath表达式。
关于XPath表达式的提取,可以使用XPath checker插件,而chrome用户则可以直接使用F12查看XPath

Selectors 有三种方法

  • path():返回selectors列表, 每一个select表示一个xpath参数表达式选择的节点.
  • extract():返回一个unicode字符串,该字符串为XPath选择器返回的数据
  • re(): 返回unicode字符串列表,字符串作为参数由正则表达式提取出来

将代码加到原代码中,

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]

def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.path(‘//fieldset/ul/li‘)
for site in sites:
title = site.path(‘a/text()‘).extract()
link = site.path(‘a/@href‘).extract()
desc = site.path(‘text()‘).extract()
print title, link

Spiders希望将其抓取的数据存放到Item对象中。为了返回我们抓取数据,spider的最终代码应当是这样:

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from tutorial.items import DmozItem

class DmozSpider(BaseSpider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]

def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.path(‘//fieldset/ul/li‘)
#sites = hxs.path(‘//ul/li‘)
items = []
for site in sites:
item = DmozItem()
item[‘title‘] = site.path(‘a/text()‘).extract()
item[‘link‘] = site.path(‘a/@href‘).extract()
item[‘desc‘] = site.path(‘text()‘).extract()
items.append(item)
return items

保存抓取的数据

保存信息的最简单的方法是通过Feed exports

scrapy crawl dmoz -o items.json -t json

关于一只爬虫

标签:

原文地址:http://www.cnblogs.com/XBlack/p/5003405.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!