mywang88css
2018-12-16html
Scrapy 框架是一个经典的 Python 爬虫框架。python
Scrapy 框架中的 Selector 类提供了多种 html/xml 节点选择器的方法,例如:css 选择器、xpath 选择器、re 选择器等。web
使用 scrapy.Selector 类的好处之一,就是不须要再导入(import)其它工具包,例如 lxml 等,直接调用选择器,并输入对应语法便可。框架
在开发和测试中,有时咱们须要单独使用 Scrapy 框架的 Selector 类的方法,而不是建立一个完整的 Scrapy 项目,由于建立一个项目须要好多步骤。例如,当咱们只须要发送一个 get 请求,而后解析响应体(html 代码),那么咱们明显更倾向于使用 requests 库的 get 方法,而不是使用 Scrapy 框架(建立一个项目,建立一个爬虫,建立 start_request 方法,建立 parse 方法,在命令行模式下启动爬虫,初始化各类设置,加载各类中间件,等等等等)。scrapy
笔者就遇到了这样的需求:svg
不启动 Scrapy 框架,在程序中单独使用 scrapy.Selector 类函数
这样作还有一个好处,那就是这样开发出的解析函数能够直接用在已有的 Scrapy 框架项目中,而不须要额外导入其它依赖。工具
实现方法能够归纳成一句话:测试
用要解析的 html 代码,建立一个 scrapy.Selector 类的实例。
代码以下:
import scrapy # 这是一段 html 代码 html = ''' <html> <body> <h1>这是标题</h1> <p>这是第一段</p> <p>这是第二段</p> </body> </html> ''' # 建立一个 Selector 类的实例,将 html 赋值给类属性 text sel = scrapy.Selector(text=html) # 调用 Selector 类的 css 方法,即 css 选择器 words = sel.css('p::text').extract() print(words)
运行结果:
[‘这是第一段’, ‘这是第二段’]
这样,就在不建立也不启动 Scrapy 项目的情形下调用了 Selector 类的选择器方法。
实际应用场景是这样的:
import requests import scrapy # 这是百度新闻主页 url = 'https://news.baidu.com/' res = requests.get(url=url) html = res.text sel = scrapy.Selector(text=html) # 解析抓取“热点要闻” words = sel.css('div[id="pane-news"] a::text').extract() for word in words: print(word)
运行结果篇幅较大,涉及词汇较多,有时效性,所以就不展现了。
须要补充的是,用来解析的 css 选择器也有时效性,网站随时会重构。
总之,没有启动 Scrapy 项目,用了 Selector 选择器。
没什么好总结的,既然折腾测试了俩小时,就写个帖子水一发…
实际状况是最近要给一个新闻采集的 Scrapy 爬虫项目写一个通用型的新闻内容解析函数,须要频繁地实时分析调试,懒得每次都启动 Scrapy 项目…