网页解析主要用到xpath模块对属性进行定位
下载的主要是压缩文件,所以要用二进制格式进行解析和存取
欢迎各位大佬批评指正
import requests
from lxml import etree
import os
#站长素材网站PPT爬取
#获取首页代码
def GetHtmlLText():
print("第" + str(page) + "页开始爬取:")
url = "http://sc.chinaz.com/ppt/free_" + str(page) + ".html"
r = requests.get(url=url, headers=headers)
r.encoding = r.apparent_encoding # 获取原始网页编码,防止乱码
return r.text
# 开始解析
def GiveInfo():
tree = etree.HTML(Page_text)
# 获取每一个PPT的详情页url
href_list = tree.xpath('//div[@class="sc_warp mt20"]/div/div/div/a/@href')
# 获取PPT名称
name = tree.xpath('//div[@class="sc_warp mt20"]/div/div/div/a/img/@alt')
# 循环访问每一个PPT详情页
all_load_url = []
for i in href_list:
href_text = requests.get(url=i).text
t = etree.HTML(href_text)
# 匹配到下载链接
if (t.xpath('//div[@class="ppt_left fl"]/div/div[8]/div[2]/ul/li/a/@href') != []):
load_url = t.xpath('//div[@class="ppt_left fl"]/div/div[8]/div[2]/ul/li/a/@href')[0]
else: # 如果匹配不到正确格式,则终止本次操作
continue
all_load_url.append(load_url)
for j in range(len(all_load_url)):
# 防止有不同格式链接,终止本次爬取
if all_load_url[j][:4] != 'http':
continue
else:
# 获取资源
source = requests.get(url=all_load_url[j], headers=headers).content
# 存储路径
path = './PPT大全/' + str(name[j]) + '.rar'
# 持久化存储
with open(path, 'wb') as fp:
fp.write(source)
print(name[j] + " 下载成功!!!")
if __name__=='__main__':
#在当前项目文件下新建一个文件夹
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, likeGecko) Chrome / 85.0.4183.83Safari / 537.36'}
#实现翻页操作,可自行修改页数
for page in range(2,600):
Page_text=GetHtmlLText()
GiveInfo()
print("全部下载成功")
这是程序解析过程: