接着上篇存储到本地文件后,对于规则与爬取对象的选取这部分工作放到了Selector选择器部分,可以理解为对于目标的解析方法。
本节关键词:直接使用 | xpath | 正则匹配 | CSS
1.直接使用
对于这部分,使用一个小demo演示,在命令行处执行发现直接跳转到编译器pycharm,于是就用pycharm来运行了。代码在下自取:
# encoding:UTF-8
'''
为了检验Selector直接使用的用法
'''
from scrapy import Selector
content = '<html><head><h3>hello world</h3><meta http-equiv="Content-Type" content="text/html;charset=utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta content="always" name="referrer"><meta name="theme-color" content="#2932e1"><link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" /><link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" /><link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg"><link rel="dns-prefetch" href="//dss0.bdstatic.com"/><link rel="dns-prefetch" href="//dss1.bdstatic.com"/><link rel="dns-prefetch" href="//ss1.bdstatic.com"/><link rel="dns-prefetch" href="//sp0.baidu.com"/><link rel="dns-prefetch" href="//sp1.baidu.com"/><link rel="dns-prefetch" href="//sp2.baidu.com"/><title>百度一下,你就知道</title>'
selector = Selector(text=content)
print(selector.xpath('/html/heal/title/text()').extract_first())
print(selector.css("h3::text").extract_first())
print("text")
在演示过程中,使用的是【文件名加后缀名】 后直接回车的方式直接运行,经测试并没有输出结果,直接打开了编译器,所以转向编译器:
其text部分的输出测试是为了排除匹配不成功,没有获取到结果所以没有输出的结果,考虑直接执行,编译的仍然是python文件,猜想是因为没有设置默认编译py文件,这里贴出在pycharm中运行成功的截图,继续往后走:
进入shell中发现,使用命令后出现上一个文件执行结果,并且对baidu网页进行采集:
scrapy shell https:www.baidu.com
采集结束后进入shell模式,可以使用两条命令查看采集网页状态码及url:
response.status
response.url
针对百度网页的selector用法分别获取到html-head-title下的文本信息,其中extract( )、extract_first( )两个函数分别取出其中文本信息和列表中首条信息(下个部分对于xpath方法这部分有具体讲解),因此获取结果不同:
继续对网页进行提取操作,例如对所有a标签的提取文本和超链接:
2.XPath选择器
讲完直接选择器,开始对xpath方法进行讲解,其中xpath方法和另三种extract*类方法的功能如下:
讲完理论照例,使用一个例子来说明xpath的具体用法,这次下手的是taobao网页(参照上面shell+网址命令,将网址换成 https://www.taobao.com/tbhome/page/special-markets),继续采集工作,输入后我的采集进程较慢,不知是不是网速影响,稍等一会就能出来:
可以看到对于采集对象的解析和存入dict再输出,这里shell下可以多行代码 ,
...:状态下输入完代码多敲一次回车,quit()是退出命令,其中下方代码中 end=“;” 语句是避免换行,以分号结束单条结果
完成标题的提取后,对于进一步的采集,侧重看源码规则,针对规则写出xpath函数中引号包含的特征式,以获取到匹配的结果:
采集成功,这部分练习结束 。
3.CSS选择器
用样例说明它的使用,还是拿taobao测试。对象URL是:https://www.taobao.com/tbhome/page/market-list
【练习目标】将taobao市场上的分类都取下来:
因为分类有点复杂,先给目标一个截图再往后走:
照例将上方URL接上 scrapy shell 命令后回车,在采集完成后的shell中输入命令,常规操作,先看状态,200往后走:
对a标签的“category-*-*”属性的文本(双冒号加text,千万记得后面不用跟括号,方法才需括号),结果果然对应列表,这是一级输出,往后走:
尝试到标题以后,对二级分类继续进行筛选,这部分一样的代码我爬到的结果跟老师不太一样,所以按照理解稍微改动一下代码,再次尝试:
经过修改 可以看出确实是把分类对象全爬取下来了。上下两种是我使用了两种不同的分隔符,可以看出来去掉了最后一行的换行输出后,就在一行了:
4.正则匹配
这部分需要注意的是,不能直接用,需要先用xpath()或者selecto进行引导,注意括号的使用:
依旧是上个小案例,对于baidu网页title标签内的提取, 还有[0]和re_first()两种方法取出值:
这部分的练习就到这里。
今天~的那句话:刻意练习,每日精进!