Scrapy(Ⅱ):基本使用与选择器

ONE:Scrapy的基本格式

import scrapy

class newhand(scrapy.Spider):  # 需要继承scrapy.Spider类

    name = "myscrapy"  # 定义爬虫名

    def start_requests(self):  # 由此方法通过下面链接爬取页面

        urls = [
            '',  #定义需要爬取的链接
        ]

        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)  # 爬取到的页面交给parse方法处理

    def parse(self, response):
    	//将页面保存下来
        page = response.url.split("/")[-2]
        filename = 'newhand-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('保存文件: %s' % filename)

运行该scrapy

scrapy crawl myscrapy

运行myscrapy,start_requests方法会返回scrapy.Request对象,每接收到一个,就会初始化一个self:response对象,调用parse方法去处理

TWO:可以将url定义为scrapy的一个属性

import scrapy

class simplify(scrapy.Spider):  # 需要继承scrapy.Spider类

    name = "myscrapy2"  # 定义爬虫名

	#scrapy的url属性
    start_urls = [
        '',
    ]

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'simplify-%s.html' % page
        with open(filename, 'wb') as f:
            f.write(response.body)
        self.log('保存文件: %s' % filename)

THREE:数据提取

基本思路: 打开scrapy shell,当shell载入后,获得一个shell变量response,在response.selector属性上绑定了一个selector。由于使用普遍,于是,scrapy定义了两个快捷方式:response.xpath( ) 和 response.css( ),也可以结合正则表达式来使用选择器。

css选择器

1.简单三函数介绍

# 假设提取head中的title标签
<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>


# 先shell一个链接
scrapy shell http://lab.scrapyed.cn

# 第一个函数:提取到selector的一个列表,同时说明css选择器底层是xpath
In [1]: response.css('title')
Out[1]: [<Selector xpath='descendant-or-self::title' data='<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'>]


# 加上::text提取标签的内容
In [8]: response.css('title::text')
Out[8]: [<Selector xpath='descendant-or-self::title/text()' data='SCRAPY爬虫实验室 - SCRAPY中文网提供'>]


# 第二个函数,提取data中全部title的标签,这里只有一个title
In [2]: response.css('title').extract()
Out[2]: ['<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>']

In [7]: response.css('title::text').extract()
Out[7]: ['SCRAPY爬虫实验室 - SCRAPY中文网提供']

# 第三个函数,只要标签,不需要列表
In [3]: response.css('title').extract()[0]
Out[3]: '<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'
In [4]: response.css('title').extract_first()
Out[4]: '<title>SCRAPY爬虫实验室 - SCRAPY中文网提供</title>'
# 提取标签文本
In [5]: response.css('title::text').extract_first()
Out[5]: 'SCRAPY爬虫实验室 - SCRAPY中文网提供'
In [6]: response.css('title::text').extract()[0]
Out[6]: 'SCRAPY爬虫实验室 - SCRAPY中文网提供'

2.提取标签的属性值和指定标签

# 提取标签的属性值(标签名::attr(属性名)),例如a标签中herf的url值
In [13]: response.css("a::attr(href)").extract()
Out[13]: 
['http://lab.scrapyd.cn/',
 'http://lab.scrapyd.cn/archives/57.html',
 'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
 'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
 'http://lab.scrapyd.cn/archives/55.html',
 'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
 'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
 'http://lab.scrapyd.cn/archives/29.html',
# 后面。。。。。省略,爬出了页面中所有a标签的href

选择器
#  .class:限定为class为class中的属性
#  #id:限定为id为id中的属性
#  *:选择所有元素
#  p:选择<p>标签中的属性   
#  div,p:选择<div>和<p>中的属性
#  div p:选择<div>中<p>的属性

In [14]: response.css(".page-navigator a::attr(href)").extract()
Out[14]: 
['http://lab.scrapyd.cn/page/1/',
 'http://lab.scrapyd.cn/page/2/',
 'http://lab.scrapyd.cn/page/3/',
 'http://lab.scrapyd.cn/page/4/',
 'http://lab.scrapyd.cn/page/6/',
 'http://lab.scrapyd.cn/page/2/']


<ol class="page-navigator">
  <li class="current"><a href="http://lab.scrapyd.cn/page/1/">1</a></li>
  <li><a href="http://lab.scrapyd.cn/page/2/">2</a></li>
  <li><a href="http://lab.scrapyd.cn/page/3/">3</a></li>
  <li><a href="http://lab.scrapyd.cn/page/4/">4</a></li>
</ol>

xpath提取

  • 提取属性@
  • 提取限定//
  • 谓语:
  • [@class=“name”]// @href 提取class为name的元素的herf
  • //text() 提取标签里面的内容
    如://title//text() 表示提取title里面的内容
    • xpath().extract( ) 提取全部列表
    • xpath().extract_first( ) 提取列表里的第一个
# 首先shell链接
scrapy shell http://lab.scrapyd.cn

#爬取的页面代码
<ul class="tags-list">
        <li><a style="color:rgb(192,54,
           114)" href="http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/">
         人生</a></li>
        <li><a style="color:rgb(80,179,
           23)" href="http://lab.scrapyd.cn/tag/%E5%8A%B1%E5%BF%97/">
         励志</a></li>
        <li><a style="color:rgb(131,251,
           100)" href="http://lab.scrapyd.cn/tag/%E7%88%B1%E6%83%85/">
         爱情</a></li>
        <li><a style="color:rgb(90,248,
           118)" href="http://lab.scrapyd.cn/tag/%E7%8E%8B%E5%B0%94%E5%BE%B7/">
         王尔德</a></li>
        <li><a style="color:rgb(124,180,
           244)" href="http://lab.scrapyd.cn/tag/%E6%99%BA%E6%85%A7/">
         智慧</a></li>
        <li><a style="color:rgb(173,191,
           87)" href="http://lab.scrapyd.cn/tag/%E6%B3%B0%E6%88%88%E5%B0%94/">
         泰戈尔</a></li>
        <li><a style="color:rgb(115,79,
           86)" href="http://lab.scrapyd.cn/tag/%E7%BB%9D%E4%B8%96%E5%A5%BD%E8%AF%8D/">
         绝世好词</a></li>
        <li><a style="color:rgb(168,8,
           174)" href="http://lab.scrapyd.cn/tag/%E6%9C%A8%E5%BF%83/">
         木心</a></li>
        <li><a style="color:rgb(71,171,
           23)" href="http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/">
         艺术</a></li>
        <li><a style="color:rgb(195,179,
           141)" href="http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/">
         名画</a></li>
        <li><a style="color:rgb(147,54,
           6)" href="http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/">
         生活</a></li>
        <li><a style="color:rgb(51,222,
           115)" href="http://lab.scrapyd.cn/tag/%E8%AF%8D/"></a></li>
     	<li><a href="http://lab.scrapyd.cn">返回首页</a></li>
<li><a href="http://bbs.scrapyd.cn" target="_blank">SCRAPY中文社区</a></li>
	<li><a href="http://www.scrapyd.cn" target="_blank">SCRAPY中文网</a></li>
</ul>	


# 爬取属性href
In [6]: response.xpath("//ul[@class='tags-list']//@href")
Out[6]: 
[<Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E4%B
A%BA%E7%9'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E5%8
A%B1%E5%B'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%8
8%B1%E6%8'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%8
E%8B%E5%B'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E6%9
9%BA%E6%8'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E6%B
3%B0%E6%8'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%B
B%9D%E4%B'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E6%9
C%A8%E5%B'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E8%8
9%BA%E6%9'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E5%9
0%8D%E7%9'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E7%9
4%9F%E6%B'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn/tag/%E8%A
F%8D/'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://lab.scrapyd.cn'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://bbs.scrapyd.cn'>,
 <Selector xpath="//ul[@class='tags-list']//@href" data='http://www.scrapyd.cn'>]



In [7]: response.xpath("//ul[@class='tags-list']//@href").extract()
Out[7]: 
['http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/',
 'http://lab.scrapyd.cn/tag/%E5%8A%B1%E5%BF%97/',
 'http://lab.scrapyd.cn/tag/%E7%88%B1%E6%83%85/',
 'http://lab.scrapyd.cn/tag/%E7%8E%8B%E5%B0%94%E5%BE%B7/',
 'http://lab.scrapyd.cn/tag/%E6%99%BA%E6%85%A7/',
 'http://lab.scrapyd.cn/tag/%E6%B3%B0%E6%88%88%E5%B0%94/',
 'http://lab.scrapyd.cn/tag/%E7%BB%9D%E4%B8%96%E5%A5%BD%E8%AF%8D/',
 'http://lab.scrapyd.cn/tag/%E6%9C%A8%E5%BF%83/',
 'http://lab.scrapyd.cn/tag/%E8%89%BA%E6%9C%AF/',
 'http://lab.scrapyd.cn/tag/%E5%90%8D%E7%94%BB/',
 'http://lab.scrapyd.cn/tag/%E7%94%9F%E6%B4%BB/',
 'http://lab.scrapyd.cn/tag/%E8%AF%8D/',
 'http://lab.scrapyd.cn',
 'http://bbs.scrapyd.cn',
 'http://www.scrapyd.cn']



In [8]: response.xpath("//ul[@class='tags-list']//@href").extract()[0]
Out[8]: 'http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/'



In [9]: response.xpath("//ul[@class='tags-list']//@href").extract_first()
Out[9]: 'http://lab.scrapyd.cn/tag/%E4%BA%BA%E7%94%9F/'


 # 爬取a标签的文字
In [13]: response.xpath("//ul[@class='tags-list']//a//text()")
Out[13]: 
[<Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         人生'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         励志'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         爱情'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         王尔德'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         智慧'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         泰戈尔'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         绝世好词'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         木心'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         艺术'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         名画'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         生活'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='\r\n         词'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='返回首页'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='SCRAPY中文社区'>,
 <Selector xpath="//ul[@class='tags-list']//a//text()" data='SCRAPY中文网'>]



In [14]: response.xpath("//ul[@class='tags-list']//a//text()").extract()
Out[14]: 
['\r\n         人生',
 '\r\n         励志',
 '\r\n         爱情',
 '\r\n         王尔德',
 '\r\n         智慧',
 '\r\n         泰戈尔',
 '\r\n         绝世好词',
 '\r\n         木心',
 '\r\n         艺术',
 '\r\n         名画',
 '\r\n         生活',
 '\r\n         词',
 '返回首页',
 'SCRAPY中文社区',
 'SCRAPY中文网']



In [15]: response.xpath("//ul[@class='tags-list']//a//text()").extract()[0]
Out[15]: '\r\n         人生'



In [16]: response.xpath("//ul[@class='tags-list']//a//text()").extract_first()
Out[16]: '\r\n         人生'



正则表达式(结合xpath或者css)

response.css().re()
response.xpath().re()

正则表达式可以参考前面编译原理词法分析的博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值