不用bs4的原因居然是名字太长?爬取彩票开奖信息

需求分析

昨天,我做了一个爬取彩票预测的程序,其中首次使用到了beautifulsoup4进行数据的解析,和平时最大的区别在于,没有使用xpath解析数据,而是使用了css的选择器。不过没想到的是,昨天却有一位小伙伴说他不喜欢使用beautifulsoup4

他说,“BeautifulSoup的名字太长了,使用起来经常拼错,所以我不喜欢用beautifulsoup4。仙草哥哥你为什么不试一试Selector呢?Selector使用起来非常方便,而且还有css选择器,我觉得,这个比bs4更好用“

没想到,beautifulsoup4不受欢迎的原因居然会是,名字太长!看来,这也提醒了我们,平时起名字的时候一定要选择一个简单易读,朗朗上口,容易拼写的名字啊!

另外,在我昨天做了爬取彩票预测的程序以后,有一位喜欢彩票的小伙伴看到了,非常高兴,但是他还希望我们能够顺便提供一下开奖信息,这样的话,就可以很方便的看到本期的彩票开奖号码了,好吧,其实这也不是什么困难的事情,本期我们就来实现一下,能够同时满足这两位小伙伴的想法

实现分析

首先,我们需要搞清楚的是,昨天这位小伙伴提到的Selector,指的是scrapy中的一个组件,Selector,通过from scrapy import Selector,就能够引入这个Selector选择器

另外,关于说Selector比beautifulsoup4更好,是否有依据呢?如果说是从使用的方便程度上来说,Selector提供的接口可能更容易使用一些。但是从实现上,scrapy是不是也引入了beautifulsoup4,从而做出来的Selector呢?嗯,那是另外一回事了,我们并不纠结于此。也可以说是,bs4从未离开,它只是换了一种形式陪伴着我们

总而言之呢,Selector的使用非常方便,首先引入Selector选择器,然后通过Selector解析html,然后直接使用css()的方法,就可以使用css选择器进行解析了

from scrapy import Selector

s = Selector(text=html)

html.css()

至于我们要获取的页面呢,很简单,就是彩票的开奖信息,如下所示

直接获取名称,期号,和号码就可以了。除了使用的解析方式不同,不是平常的lxml以外,其他的都和以往一样。也是通过requests发送请求,然后得到响应,这个自不必多说

完整代码实现

import requests
from base64 import b64decode
from scrapy import Selector

url = b64decode("aHR0cDovL20ueWlxaWNhaS5jb20va2ov").decode()

headers = {"user-agent": "Mozilla/5.0"}

r = requests.get(url ,headers=headers)

s = Selector(text=r.text)

for i in s.css(".lottery-item"):
	title = i.css(".lotto-type dt::text").get()
	phase = i.css(".lotto-type dd::text").get()
	number = i.css(".lotto-ball span::text").extract()
	print("种类:" + title)
	print("期号:" + phase)
	print("号码:", number)
	print()

以下是程序的运行结果展示,可以看出,和我们在页面上看到的内容,一模一样,很好的实现了我们的需求


如果说使用体验的话,直接引入Selector选择器确实非常的好用,但是在平时却很少会看到这种使用方式,为什么呢?

我想,这可能和Selector是scrapy的一部分有很大的关系吧。习惯使用Selector选择器的,想必也会喜欢使用scrapy,那么可能就直接使用scrapy完成程序了,而不会去单独的使用requests做爬虫,然后把Selector当作其中的一部分引入。而不喜欢scrapy的使用者,或者根本就不会使用scrapy的使用者,多半也没道理会专门去只学习和使用一个Selector,因此,我们很少会看到单独拿出Selector进行使用的情况,当然,这主要是我自己的想法

如果你对此有不同的见解的话,欢迎评论留言,发表一下你的看法,那么,周末愉快,我们下周再见啦!

来源:仙草哥哥

物联沃分享整理
物联沃-IOTWORD物联网 » 不用bs4的原因居然是名字太长?爬取彩票开奖信息

发表评论