简讯 发表于 2020-2-21 17:37

【Python 爬虫教程】Scrapy 学习笔记(三)

scrapy 中选择器的用法。[🍒点击查看原文。](https://lijianxun.top/113.html)

我们选用的测试网页是 scrapy 官网推荐的测试网页,结构非常简单,但足够我们用来学习其用法。

(https://doc.scrapy.org/en/latest/_static/selectors-sample1.html)

!(https://i.loli.net/2020/02/20/ZsTtpQcSNMqkUAz.png)

我们主要使用三种选择器,读者可以根据自己的学习情况和网页结构选择使用。选择器分别是:xpath、css和re。这三种选择器实现的功能相同,所以熟悉哪个用哪个就行,语法都比较简单。

> 网页源码
```html
<html>
<head>
<base/>
<title>Example website</title>
</head>
<body>
<div id='images'>
   <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
   <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
   <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
   <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
   <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>
```

我们在scrapy shell中学习这三种选择器的用法,实时反馈抓取到的信息。

```bash
scrapy shell https://doc.scrapy.org/en/latest/_static/selectors-sample1.html
```

## 获取title

```bash
In : response.xpath('//title/text()')
Out: [<Selector xpath='//title/text()' data='Example website'>]

In : response.css('title::text')
Out: [<Selector xpath='descendant-or-self::title/text()' data='Example website'>]

In : response.xpath('//title/text()').extract_first()
Out: 'Example website'

In : response.css('title::text').extract_first()
Out: 'Example website'
```

## 获取href

```bash
In : response.xpath('//div[@id="images"]/a/@href').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

In : response.css('div a::attr(href)').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
```

还可以这么用:

```bash
In : response.xpath('//div[@id="images"]').css('img::attr("src")')
Out:
[<Selector xpath='descendant-or-self::img/@src' data='image1_thumb.jpg'>,
<Selector xpath='descendant-or-self::img/@src' data='image2_thumb.jpg'>,
<Selector xpath='descendant-or-self::img/@src' data='image3_thumb.jpg'>,
<Selector xpath='descendant-or-self::img/@src' data='image4_thumb.jpg'>,
<Selector xpath='descendant-or-self::img/@src' data='image5_thumb.jpg'>]

In : response.xpath('//div[@id="images"]').css('img::attr("src")').extract()
Out:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
```

## default

```bash
In : response.xpath('//div[@id="images"]').css('img::attr("src")').extract_first(default="None")
Out: 'image1_thumb.jpg'

In : response.xpath('//div[@id="images"]').css('img::attr("srcq")').extract_first(default="None")
Out: 'None'
```

使用default要注意只能在`extract_first`中使用。如果获取到信息,就正常显示,如果找不到内容就返回default定义的信息。

## 获取文本内容

```bash
In : response.xpath('//a/text()').extract()
Out:
['Name: My image 1 ',
'Name: My image 2 ',
'Name: My image 3 ',
'Name: My image 4 ',
'Name: My image 5 ']

In : response.css('a::text').extract()
Out:
['Name: My image 1 ',
'Name: My image 2 ',
'Name: My image 3 ',
'Name: My image 4 ',
'Name: My image 5 ']
```

## 根据属性定位

如果我们想获取属性名称包含`image`的超链接,就可以使用这种方法。

```bash
In : response.xpath('//a/@href').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']

In : response.css('a::attr(href)').extract()
Out: ['image1.html', 'image2.html', 'image3.html', 'image4.html', 'image5.html']
```

还有:

```bash
In : response.xpath('//a/img/@src').extract()
Out:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']

In : response.css('a img::attr(src)').extract()
Out:
['image1_thumb.jpg',
'image2_thumb.jpg',
'image3_thumb.jpg',
'image4_thumb.jpg',
'image5_thumb.jpg']
```

## 使用re

```bash
In : response.css('a::text').re('Name\:(.*)')
Out:
[' My image 1 ',
' My image 2 ',
' My image 3 ',
' My image 4 ',
' My image 5 ']

In : response.css('a::text').re_first('Name\:(.*)').strip()
Out: 'My image 1'
```

以上这些就是就是选择器的基本用法了,如果你熟悉 xpath,css,re 的语法,接受起来应该非常容易,只是个别语法适应scrapy就好。

在以后的爬取中要学会使用这些选择器,事半功倍。

Jale 发表于 2020-2-21 17:51

占个楼,哈哈哈哈

白晓生 发表于 2020-2-21 18:01

感谢楼主教学分享,看了前两篇学习教程真的很棒值得学习加油

梦梦梦她 发表于 2020-2-21 18:04

感谢楼主分享

27123 发表于 2020-2-21 18:22

感谢分享

DisguiseSmart 发表于 2020-2-22 10:32

感谢楼主分享!!!

fight775 发表于 2020-2-23 10:23

感谢楼主分享

meishao 发表于 2020-2-23 10:49

这个不错!

hang6210 发表于 2020-2-23 13:25

同样正要学习,感谢分享
页: [1]
查看完整版本: 【Python 爬虫教程】Scrapy 学习笔记(三)