通过xpath和beautifulsoup爬取游戏币实时价格

有个朋友是做的是一种不可描述的工作,需要经常上这么一个网站:http://b2b.1771.com/shouquotation.html

这是个线上虚拟货币交易平台。

每天她的工作就是在价格高的时候卖出那些虚拟货币,但是这个页面有很多区服啊,她只需要那么几个,于是我就想帮她把这几个价格给抓出来看,既然都抓都抓了干脆全部抓了吧,既然都全部抓了,干脆一直抓吧,抓了那么多数据自然得要放数据库咯……

于是就有了这篇文章,本文基于python3.X

网页数据抓取就是爬虫,使用最广泛的就是python,听说python简单易学,于是决定直接跳过基本语法学习,直接开搞。

爬虫的基本原理很简单,就是http请求后获取返回的数据进行解析提取有用的信息。

Python用来发送http请求的模块我选择了自带的urllib。在此之前有必要提一下:同样有此功能的模块还有urllib3和requests,它们不是标准库。但是urllib3 提供了文件post和线程安全连接池,而requests更加简洁易用!

1.发送请求:

url='http://b2b.1771.com/shouquotation.html'

header = {

   'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36'

}

request = urllib.request.Request(url, headers=header)

reponse = urllib.request.urlopen(request).read().decode('utf-8')

其中模拟了header防止频繁的请求被服务器识别处是爬虫,最后的response就是html页面字符串了。

2.解析:

我第一反应是使用xpath,因为观察网页数据可以看出来

区服和价格都是在同一个标签<li>中。

任意取两个区服的xpath发现:

/html/body/section/div[6]/div[2]/div[2]/div[5]/ul/li[2]/span/a[1]/font

/html/body/section/div[6]/div[2]/div[2]/div[5]/ul/li[6]/span/a[1]/font

不同的地方仅仅是li的序号,于是去掉序号的筛选加上class的筛选

/html/body/section/div[6]/div[2]/div[2]/div/ul/li/span/a/font[@class='qf']

同样价格:

/html/body/section/div[6]/div[2]/div[2]/div/ul/li/span/a/font[@class='shj']

要使用xpath需要将获取的html字符串转为XML

这里使用了第三方的解析器—-lxml,这是一款速度快相当快而且容错能力很强的库


Html = lxml.etree.HTML(reponse)

qf = Html.xpath("/html/body/section/div[6]/div[2]/div[2]/div/ul/li/span/a/font[@class='qf']")

shj = Html.xpath("/html/body/section/div[6]/div[2]/div[2]/div/ul/li/span/a/font[@class='shj']")

这样我们获取了两组列表:区服和价格。这时出了小插曲,当我满心欢喜的循环遍历列表的时候,却输出了这样的数据:

原来lxml经过xpaht筛选的结果并不是html的字符串,而是一个个的节点,这每一个节点都是一个字典型的数据。

print(i.tag)#获取<a>标签名a

print(i.attrib)#获取标签的属性

print(i.text)#获取标签的文字部分

修改成第三句后,成功输出了

解析的第二种方式是使用第三方库—– BeautifulSoup

用请求返回的htnl字符串创建BeautifulSoup对象:


bs=BeautifulSoup(reponse,features="html.parser")

这里使用了ptyhon内置的标准库,你也可以选择前面介绍的lxml

可以使用print soup.prettify()格式化输出看看html内容

简单介绍下BeautifulSoup将html字符串转换成一个树形的结构,其中每个节点都是一个python对象,大致可分为Tag、NavigableString、BeautifulSoup、Comment四类

举个栗子:

print(bs.title)

因为需要批量选择,所以使用了BS的find_all()方法:

[ptyhon]

def find_all(self, name=None, attrs={}, recursive=True, text=None,

limit=None, **kwargs):

[/python]

这是它的定义

Name是tag,<a><p><div>这样的

Attrs是属性

Text是字符串内容

Limit则是个数

通过前面的观察,我们的目标很明确,带属性的font


for i in bs.find_all('font',{'class':'qf'}):

print(i.text)

for i in bs.find_all('font',{'class':'shj'}):

print(i.text)

输出的数据和前面的xpath的数据一样

到此为止我们就成功的将区服和价格从网页中提取了出来!

版权所属,如需转载,请注明出处:搜闲鱼

1,464 次浏览

“通过xpath和beautifulsoup爬取游戏币实时价格”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注