龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > python编程 >

零基础写python爬虫之使用Scrapy框架编写爬虫(5)

时间:2014-11-08 02:36来源:网络整理 作者:网络 点击:
分享到:
注意,我们从scrapy.selector中导入了Selector类,并且实例化了一个新的Selector对象。这样我们就可以像Shell中一样操作xpath了。 我们来试着输入一下命令运行爬

注意,我们从scrapy.selector中导入了Selector类,并且实例化了一个新的Selector对象。这样我们就可以像Shell中一样操作xpath了。
我们来试着输入一下命令运行爬虫(在tutorial根目录里面):

复制代码 代码如下:

scrapy crawl dmoz

运行结果如下:

果然,成功的抓到了所有的标题。但是好像不太对啊,怎么Top,Python这种导航栏也抓取出来了呢?
我们只需要红圈中的内容:

看来是我们的xpath语句有点问题,没有仅仅把我们需要的项目名称抓取出来,也抓了一些无辜的但是xpath语法相同的元素。
审查元素我们发现我们需要的<ul>具有class='directory-url'的属性,
那么只要把xpath语句改成sel.xpath('//ul[@class="directory-url"]/li')即可
将xpath语句做如下调整:

复制代码 代码如下:

from scrapy.spider import Spider 
from scrapy.selector import Selector 
 
class DmozSpider(Spider): 
    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): 
        sel = Selector(response) 
        sites = sel.xpath('//ul[@class="directory-url"]/li') 
        for site in sites: 
            title = site.xpath('a/text()').extract() 
            link = site.xpath('a/@href').extract() 
            desc = site.xpath('text()').extract() 
            print title 

成功抓出了所有的标题,绝对没有滥杀无辜:

3.5使用Item
接下来我们来看一看如何使用Item。
前面我们说过,Item 对象是自定义的python字典,可以使用标准字典语法获取某个属性的值:

复制代码 代码如下:

>>> item = DmozItem() 
>>> item['title'] = 'Example title' 
>>> item['title'] 
'Example title' 

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

复制代码 代码如下:

from scrapy.spider import Spider 
from scrapy.selector import Selector 
 
from tutorial.items import DmozItem 
 
class DmozSpider(Spider): 
    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): 
        sel = Selector(response) 
        sites = sel.xpath('//ul[@class="directory-url"]/li') 
        items = [] 
        for site in sites: 
            item = DmozItem() 
            item['title'] = site.xpath('a/text()').extract() 
            item['link'] = site.xpath('a/@href').extract() 
            item['desc'] = site.xpath('text()').extract() 
            items.append(item) 
        return items 

精彩图集

赞助商链接