使用下面的命令使用scrapy shell 并提取网页内容

1
scrapy shell 'http://quotes.toscrape.com/page/1/'

一、 css选择器(返回的是一个数组)

  1. response.css(‘title’)
    [<Selector xpath='descendant-or-self::title' data='<title>Quotes to Scrape</title>'>]
  2. response.css(‘title’).extact() # 返回一个数组
    ['<title>Quotes to Scrape</title>']
  3. response.css(‘title’).extract_first() # 提取数组里面的字符串
    '<title>Quotes to Scrape</title>'
  4. response.css(‘title’)[0].extract() # 作用和3一致,当数组为空,会报数组下标异常
    '<title>Quotes to Scrape</title>'
  5. response.css(‘title::text’).extract() # 提取title标签下的内容
    ['Quotes to Scrape']

二、 命令行工具

Scrapy是要通过scrapy命令行工具控制的,在这里被称为“Scrapy工具”。
查看所有可用的命令
scrapy -h
有两种类型的命令,分为全局命令和仅限于项目的命令
全局命令

  • startproject
  • genspider
  • settings
  • runspider
  • shell
  • fetch
  • view
  • version

仅限于项目的命令

  • crawl
  • check
  • list
  • edit
  • parse
  • bench

genspider
选择创建的模板

scrapy genspider -l

scrapy genspider test test

scrapy genspider -t crawl scrapyorg scrapy.org

三、xpath选择器(返回selectorList)

打开链接,并进入Scrapy shell

1
scrapy shell 'https://doc.scrapy.org/en/latest/_static/selectors-sample1.html'

  1. 提取title信息

    1
    2
    response.xpath('//title/text()')
    Out[4]: [<Selector xpath='//title/text()' data='Example website'>]
  2. 获取图片目录信息

    1
    2
    3
    4
    5
    6
    7
    response.xpath('//img/@src').extract()
    Out[10]:
    ['image1_thumb.jpg',
    'image2_thumb.jpg',
    'image3_thumb.jpg',
    'image4_thumb.jpg',
    'image5_thumb.jpg']
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
response.xpath('//a[contains(@href, "image")]/@href').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']

response.css('a[href*=image]::attr(href)').extract()
[u'image1.html',
u'image2.html',
u'image3.html',
u'image4.html',
u'image5.html']

response.xpath('//a[contains(@href, "image")]/img/@src').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']

response.css('a[href*=image] img::attr(src)').extract()
[u'image1_thumb.jpg',
u'image2_thumb.jpg',
u'image3_thumb.jpg',
u'image4_thumb.jpg',
u'image5_thumb.jpg']

Selector也有.re()使用正则表达式提取数据的方法。但是,与使用.xpath()或 .css()方法不同,.re()返回unicode字符串的列表。所以你不能构建嵌套.re()调用。

1
2
3
4
5
6
response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
[u'My image 1',
u'My image 2',
u'My image 3',
u'My image 4',
u'My image 5']

.re_first()获取数组的第一个元素

1
2
response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
u'My image 1'