爬虫数据提取的第三种方式,一般我们常用的爬虫方式,今天是xpath方法解析数据了。其实也还有其他的,像css选择器等。不过我们常用的大概就是这三种解析方式了。BeautifulSoup解析,正则表达式解析,以及现在的xpath解析。
其实爬虫基础内容其实也就是这么多了,接下来重点可能会放在反爬、解密之类的,以及加快爬取效率。
XPath,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言,它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索
它的操作原理:
1.实现标签的定位:实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。
2.调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获。
代码如下(示例):
url = "https://nanchang.zbj.com/search/f/?type=new&kw=saas&fr=search-history"
requ = requests.get(url)
html = etree.HTML(requ.text)
#print(requ.text)
divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[5]/div[1]/div")
#print(divs)
data =[]
for div in divs:
# /html/body/div[6]/div/div/div[2]/div[5]/div[1]/div[1]/div/div/a[1]/div[2]/div[1]/span[1]
try:
price = div.xpath("./div/div/a[1]/div[2]/div[1]/span[1]/text()")[0].strip("¥")
#print(price)
title = "saas".join(div.xpath("./div/div/a[1]/div[2]/div[2]/p/text()"))
#print(title)
chengjiao = div.xpath("./div/div/a[1]/div[2]/div[1]/span[2]/text()")[0]
#print(chengjiao)
company = div.xpath("./div/div/a[2]/div[1]/p/text()")[1].replace("\n","")
#print(company)
data.append([price,title,chengjiao,company])
except IndexError:
pass
根据解析原理我们知道,首先我们需要实例化一个etree对象
然后呢我们在调用etree对象中的xpath方法进行数据提取。
实例化对象有两种:
1.将本地文档加载入etree对象中。etree.parse(“文件路径”)
2.将互联网中获取的数据加载入etree对象中。 etree.HTML(“储存数据的对象”)
然后便可以进行数据提取了
提取的时候我们可以根据观察开发者工具中代码,一步一步定位到所需内容下,当然一定要保证是正确的,如果出错的话是得不到结果的。
本次实例我们是需要得到一个div标签下很多div标签中内容的。
所以我们首先定义了一个divs的对象,来储存定位到本div标签的内容。然后便可以对其进行循环操作。
并且在循环中运用xpath解析时,我们只需要在当前路径下,在继续定位便可。
其实也有一种简单的方法,可以直接在开发者工具中复制标签的xpath路径,我们一般可以选择绝对路径,然后根据对比去删除前边不需要的,这样我们就能够得到锁定为到的内容。
这个解析方式其实是很简单的一种了。
当然,在爬取过程中也碰到了很多问题,想其中有一个数据是没有我们定位到的标签的,它并不是我们所需要的内容。所以我使用了异常处理的操作,将其pass过去了。
以及我们获取到的数据可能会存在一些其他字符等,我们不需要的,同样也是对其进行处理,最后便得到了最终的数据。
代码如下(示例):
with open("saas相关数据.csv","w",encoding="utf-8",newline="") as f:
csvwriter = csv.writer(f)
csvwriter.writerows(data)
print("over!")
本步操作同样是讲数据存储在了csv文件中,
爬虫数据的解析其实也只是基础中的一部分,经过学习了三种方法之后,我也会更加深入的学习更多有用的知识,把爬虫应用到更多的操作中。
当然在爬取过程中,我觉得最难得并不是爬取方法,而是对于整个过程的逻辑结构以及步骤的掌握程度。
所以我认为,我们不能只是单纯的学习方法,同时也需要增强对结构分析这类的能力进行一个拓展学习。