思路分析
首先,对站长素材网站中的免费网站页面发起get请求,以防万一,可将响应数据编码格式手动设置为utf-8。然后,实例化一个etree的对象,且需要将被解析的页面源码数据加载到该对象中。再使用xpath表达式进行标签定位。再从定位的标签中提取到ppt详情页的访问地址和名称。
再对ppt详情页的地址发起get请求,再次实例化一个etree的对象,且将需要被解析的页面源码数据加载到该对象中,定位下载地址的标签并提取下载地址。
再对下载地址发起get请求。最后将响应数据进行持久化存储。
总结起来就是,三次请求,两次解析。
源码
import requests
from lxml import etree
import os
if __name__ == "__main__":
# 创建一个文件夹,保存ppt
if not os.path.exists('./ppt模板'):
os.mkdir('./ppt模板')
# UA伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \
AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/96.0.4664.93 Safari/537.36'
}
url = 'https://aspx.sc.chinaz.com/query.aspx?keyword=%E5%85%8D%E8%B4%B9&issale=&classID=864&page=1'
# 发起请求
page_response = requests.get(url=url, headers=headers)
# 手动设置响应数据编码格式为utf-8
page_response.encoding = 'utf-8'
# 获取响应数据。text方法返回的是字符串形式的响应数据
page_text = page_response.text
# 数据解析
tree = etree.HTML(page_text)
div_list = tree.xpath('//div[@id="main"]/div/div')
for div in div_list:
ppt_title = div.xpath('./p/a/text()')[0] + '.rar'
# ppt_title = ppt_title.encode('iso-8859-1').decode('gbk')
ppt_src = 'https:' + div.xpath('./p/a/@href')[0]
print(ppt_src)
# 向PPT详情页发起请求
ppt_response = requests.get(url=ppt_src, headers=headers)
ppt_response.encoding = 'utf-8'
ppt_page_text = ppt_response.text
ppt_tree = etree.HTML(ppt_page_text)
# 解析下载地址
ppt_download_url = ppt_tree.xpath('//ul[@class="clearfix"]/li[1]/a/@href')[0]
print(ppt_download_url)
# 访问下载地址
ppt_data = requests.get(url=ppt_download_url, headers=headers).content
# 设置存储路径
ppt_path = './ppt模板/' + ppt_title
with open(ppt_path, 'wb') as fp:
fp.write(ppt_data)
print(ppt_title, "下载完成!")
# print("第%d页下载完毕!" % 1)