Scrapy提供的数据提取方法——Selector选择器,类似BeautifulSoup、pyquery以及正则表达式

Selector 使用方法

直接使用

from scrapy import Selector

body = '<html><body><head><title>Hello World</title></head></body><html>'
selector = Selector(text=body)
title = selector.xpath('//title/text()').extract_first()
print(title)

Scrapy shell

爬取官方文档:https://doc.scrapy.org/en/latest/_static/selectors-sample1.html

Selector使用时是与Scrapy结合使用的,如在Scrapy的回调函数中的参数response直接调用xpath()、css()提取数据,所以借助scrapy shell提取数据模拟scrapy请求的过程

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


关注最后的一些可进行的操作:

这个过程相当于Scrapy向URL发起了一次请求,然后传回一些可操作的变量,如request、response等

XPath 选择器

<head>
<base href = 'http://example.com/ />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='imge1.html'>Name: My image 1 <br/><img src='image1_thumb.jpg' /></a>
<a href='imge2.html'>Name: My image 2 <br/><img src='image2_thumb.jpg' /></a>
<a href='imge3.html'>Name: My image 3 <br/><img src='image3_thumb.jpg' /></a>
<a href='imge4.html'>Name: My image 4 <br/><img src='image4_thumb.jpg' /></a>
<a href='imge5.html'>Name: My image 5 <br/><img src='image5_thumb.jpg' /></a>
</div>
</body>
</html>

>>> result = response.selector.xpath('//a')

从提取的结果(a节点)中再次提取img节点:

>>> result.xpath('./img')

选择器的最前面加“.”,表示提取元素内部的数据,如果没有加点,则代表从根节点开始提取。此处我们用了./img的提取方式,则代表从a节点里提取,如果用//img,则还是从html节点中提取

以上得到的是SelectorList类型的变量,是一个由Selector对象组成的列表。所以可以用>>> result[0]单独索引某个元素

但是以上得到的内容都是列表类型,都不是真正的文本内容,为了得到文本,还需要:
>>> result.extract()

搭配XPath()表达式,可以选取节点的内部文本和属性

>>> response.xpath('//a/text()').extract()

>>> response.xpath('//a/@href').extract()

CSS选择器

  • 正则匹配

  • 总结

    Selector包括了两个常用的选择器和正则匹配,合理使用Selector可以提高数据提取效率。

Spider 用法

Spider:配置抓取网站的链接、抓取逻辑、解析逻辑

运行流程

  • Spider要做的就两件事情:
  1. 定义爬取网站的动作
  2. 分歧爬取的内容
  • 爬取过程:
  1. Request初始的URL,并设置回调函数。当Request成功时,Response生成作为参数传递给该回调函数
  2. 在回调函数内分析网页内容,返回结果由两种方式:
    • 解析到的有效结果返回字典或Item对象,可以直接保存
    • 另一种是解析得到下一个链接,可以利用此链接构造Request并设置新的回调函数
  3. 如果返回的是字典或者Item对象,我们可以通过Feed Exports等组件将结果存入文件。如果设置了Pipeline的话,我们可以使用Pipeline处理并保存
  4. 如果返回的是Request,那么执行后得到的Response会被传递到Request中定义的回调函数,再次分析生成Item

以上几步循环往复,可以完成站点的爬取

Spider类

  • name = ‘quotes’ # 爬虫的名字
  • allowed_domains = [‘quotes.toscrape.com’] # 可选配置,不在此列的链接不会被跟进爬取
  • start_urls = [‘http://quotes.toscrape.com/'] # 起始URL
  • custom_settings = # 是一个字典,专属于本Spider的配置,设置会覆盖全局设置,必须在初始化前更新,必须定义成类变量
  • crawler = # 是在pipeline.py的from_crawler() 方法设置的,代表的是本Spider类对应的Crawler对象,可以用来获取setting的信息
  • settings 全局设定
  • start_requests()用于生成初始请求,必须返回一个可迭代对象,默认使用Get方法。如果想使用Post方法,只需要重写这个方法,发送POST请求时使用FormRequest即可
  • parse() 当Response没有指定回调函数时,本方法默认被调用,负责处理Response,处理返回结果,需要返回一个包含Request和Item的可迭代对象
  • close() 释放资源