最近在跟着网上的视频复习爬虫,记录一下
xpath的使用
xpath解析原理:
1、实例化一个etree对象,且需要将解析的页面源码数据加载到该对象中
2、调用etree对象中的xpath方法结合xpath表达式实现标签的定位和内容获取
环境安装:
pip install lxml
如何实例化一个etree对象:from lxml import etree
1、将本地的html文件中的源码数据加载到etree对象中:
etree.parse(filePath)
2、可以将网络上获取到的源码数据加载到该对象中:
etree.HTML(page_text)
xpath表达式:
/ :表示的是从根节点开始定位,表示一个层级
// : 表示的是多个层级,可以表示从任意位置开始
属性定位: //div[@class="song"] ,即tag[@attrName="attrValue"]
索引定位://div[2]/p[3] **索引是从1开始的**
取文本:
/text() 指获取的是标签中直系的文本内容
//text() 指标签中非直系的文本内容(所有的文本内容)
取属性:
/@attrName, 即img/@src或/a/@href等
作业案例
目标:爬取站长素材中图标,并保存
代码实现:
# 爬取站长素材中图标
import requests
from lxml import etree
import os
if __name__=="__main__":
# 分页
for i in range(1,10):
# 第一页的网址和其他页的网址不一样
if i ==1:
url = "https://sc.chinaz.com/tubiao/index.html"
else:
url = "https://sc.chinaz.com/tubiao/index_"+str(i)+".html"
headers = {
"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:93.0) Gecko/20100101 Firefox/93.0"
}
# 获取基础页面内容,content防止中文乱码
page_text = requests.get(url,headers).content
path = "./icon/"+str(i)
if not os.path.exists(path):
os.makedirs(path)
# 对基础页面进行解析
tree = etree.HTML(page_text)
for icon in tree.xpath('//ul[@class="pngblock imgload"]/li/p'):
# 获取icon详情页面的url和标题
icon_url = "https:"+icon.xpath('./a/@href')[0]
icon_name = icon.xpath('./a/@alt')[0]
print(icon_name)
# 详情页面解析
detail_page_text = requests.get(icon_url,headers).content
detail_tree = etree.HTML(detail_page_text)
for download in detail_tree.xpath('//div[@class="downbody"]/div[3]/a[1]'):
# 获取icon详情页面中下载的url
download_url = download.xpath('./@href')[0]
download_text = requests.get(download_url,headers).content
# 对rar文件进行保存
# rar文件的保存不知怎么做,就参照的图像的保存来到,竟然成功了
with open(path + '/' + icon_name, 'wb') as f:
f.write(download_text)
print(icon_name, "ok!")