有个朋友是做的是一种不可描述的工作,需要经常上这么一个网站: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的数据一样
到此为止我们就成功的将区服和价格从网页中提取了出来!
版权所属,如需转载,请注明出处:搜闲鱼
“通过xpath和beautifulsoup爬取游戏币实时价格”的一个回复