Python中xpath爬虫实例详解
什么是xpath?
XPath全称为XML Path Language,即XML路径语言,它是一种用来定位XML文档中特定内容的语言。在Python爬虫中,我们可以使用XPath语法来提取网络上的HTML/XML中的信息。
Python中的XPath库
Python中有多个支持XPath的库,比较常用的是:
- lxml:这是Python的一个解析库,同时也是XPath的解析库之一。
- xml.etree.ElementTree:Python自带的标准库,同时也是XPath的解析库之一。
本文以lxml为例,讲解如何使用XPath进行网页数据的爬取和提取。
安装lxml库
lxml库的安装非常简单,只需要在命令行中执行以下指令即可:
pip install lxml
实例一:爬取豆瓣电影TOP250
我们将使用XPath来爬取豆瓣电影TOP250中的电影名称、评分以及电影详情页链接。
下载页面
首先,我们需要将页面下载到本地。这可以通过Python的requests库来实现,代码如下:
import requests
url = 'https://movie.douban.com/top250'
response = requests.get(url)
html = response.text
解析HTML
下载页面后,我们需要解析它。华丽的lxml库就可以派上用场了。解析代码如下:
from lxml import etree
selector = etree.HTML(html)
在这里,我们使用了etree类中的HTML()方法将HTML字符串解析为一个Element对象。要注意的是,使用HTML()方法和fromstring()方法解析HTML的方式是不同的。
编写XPath表达式
接下来,我们需要编写XPath表达式来定位我们所需的信息。需要爬取的内容分别是电影名称、评分和电影详情页链接。我们可以打开豆瓣电影TOP250的页面,在网页上选择对应内容,随便找一个电影的名称,右键点击“检查”,在弹出来的开发者工具中,选中对应的HTML代码,右键“Copy XPath”,就获得了该元素的XPath路径。
详细的XPath语法以及XPath路径的获取方法请参考这篇文章。
提取数据
有了XPath路径之后,我们就可以使用lxml库提供的XPath()方法来提取数据了。代码如下:
movie_list = selector.xpath('//ol[@class="grid_view"]/li')
for movie in movie_list:
title = movie.xpath('.//div[@class="hd"]/a/span[1]/text()')[0]
rating = movie.xpath('.//span[@class="rating_num"]/text()')[0]
link = movie.xpath('.//div[@class="hd"]/a/@href')[0]
print('电影名称:' + title)
print('评分:' + rating)
print('电影详情页链接:' + link)
print()
我们首先使用XPath语法定位TOP250电影的列表。然后,使用for循环遍历每个电影,提取电影名称、评分和电影详情页链接,并将其输出到控制台。
实例二:爬取全国高速公路车流量
我们将使用XPath来爬取高德地图上全国各个高速公路的实时车流量数据。
下载页面
首先,我们需要将页面下载到本地。这可以通过Python的requests库来实现,代码如下:
import requests
url = 'https://restapi.amap.com/v3/traffic/status/road?name=全国高速公路网&adcode=100000&key=4f618cfc1a58e97c7e80439b76db3842'
response = requests.get(url)
json_data = response.json()
解析JSON
通过调用requests库的get()方法,我们获得了HTTP响应,其内容为一串JSON字符串。为了使得Python可以处理这个JSON字符串,我们需要将其解析为Python的dict类型。这可以通过调用response对象的json()方法来实现,代码如下:
import json
json_data = json.loads(response.text)
编写XPath表达式
解析JSON字符串之后,我们需要编写XPath表达式来提取我们所需的数据。我们需要获取全国各个高速公路的名称以及它们各自的实时车流量。在JSON串中,这些数据位于一个名为“trafficinfo”、下面又嵌套了两个名为“description”和“roads”的JSON对象中。
提取数据
有了XPath路径之后,我们就可以使用lxml库提供的XPath()方法来提取数据了。代码如下:
traffic_info = json_data['trafficinfo']
description_list = traffic_info['description']
for description in description_list:
road_list = description['roads']
for road in road_list:
name = road['name']
tmcs = road['tmcs']
total_jam = 0
for tmc in tmcs:
jam = tmc['jam']
if jam is None:
jam = 0
total_jam += jam
print('名称:' + name + ',车流量:' + str(total_jam) + '辆')
我们首先找到“trafficinfo”对象,然后找到它下面的“description”数组,遍历数组中的每个元素。然后,我们在每个“description”对象中找到名为“roads”的数组,遍历数组中的每个元素。最后,我们提取每个元素的“name”和“tmcs”字段,计算出该路段上的总车流量并将其输出到控制台。
到这里,我已经非常详细地讲解了Python中使用XPath进行网页数据的爬取和提取。希望对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python 中xpath爬虫实例详解 - Python技术站