找回密码
  注册[Register]
查看: 1369|回复: 14

python爬虫批量下载ppt模板

[复制链接]
发表于 2020-10-27 14:32 来自手机 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

本帖最后由 Jacklin 于 2020-10-27 14:34 编辑

ppt模板地址:http://www.ypppt.com/moban/ 这是一个免费的ppt模板网站
前两天帮朋友下述职报告,需要啥分类自己改下地址就可以用了。
代码写的渣勿喷。

附上代码:
  1. import time
  2. import requests
  3. from scrapy.selector import Selector

  4. def RequestsDX(url):
  5.     # 实例化一个request对象
  6.     headers = {
  7.         'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
  8.                        'Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51',
  9.         'Accept'     : 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,'
  10.                        'application/'
  11.                        'signed-exchange;v=b3;q=0.9'
  12.     }
  13.     response = requests.get(url, headers)
  14.     response.encoding = 'utf-8'
  15.     return response

  16. def SelectorDX(response):
  17.     # 实例化一个selector对象
  18.     selector = Selector(text=response.text)
  19.     return selector

  20. def url_page():
  21.     # 查看模板分类下有多少页
  22.     ppt_url = 'http://www.ypppt.com/moban/shuzhi/'
  23.     url_list = [ppt_url]
  24.     for i in range(2, 1000):
  25.         ppt_url2 = 'http://www.ypppt.com/moban/shuzhi/list-%s.html' % i
  26.         response = RequestsDX(ppt_url2)
  27.         if response.status_code == 200:
  28.             url_list.append(ppt_url2)
  29.         else:
  30.             break
  31.     return url_list

  32. def url_page_ppt_id(selector):
  33.     # 查看每页ppt模板的id,并合成对应ppt链接
  34.     id = []
  35.     page_id_sum = len(selector.xpath('/html/body/div[2]/ul/li'))
  36.     for i in range(1, page_id_sum):
  37.         tag = selector.xpath('/html/body/div[2]/ul/li[%s]/a' % i).extract_first()
  38.         # 一个笨办法做的字符串过滤 拿到ppt的id 变量名起的稀碎
  39.         y = tag.split('<')
  40.         a = y[1].find('.html')
  41.         b = y[1].rfind('/')
  42.         # print(y[1][b+1:a])
  43.         id.append(y[1][b + 1 :a])
  44.     return id

  45. def download_page():
  46.     # 拿到下载页面
  47.     url_list = url_page()
  48.     url = 'http://www.ypppt.com/p/d.php?aid='
  49.     url_download = []
  50.     for i in url_list:
  51.         response = RequestsDX(i)
  52.         selector = SelectorDX(response)
  53.         id = url_page_ppt_id(selector)
  54.         for i in id:
  55.             url_download.append(url+i)
  56.     return url_download

  57. def download_url():
  58.     # 分析下载页面中的下载链接并下载
  59.     url_list = []
  60.     name_list = []
  61.     url = download_page()
  62.     xpath = '/html/body/div/div/ul/li[1]/a'
  63.     filename_xpath = '/html/body/div/div/div[2]/div[2]/h1'
  64.     for i in url:
  65.         response = RequestsDX(i)
  66.         selector = SelectorDX(response)
  67.         url_download = selector.xpath(xpath).extract_first()
  68.         file_name = selector.xpath(filename_xpath).extract_first()
  69.         name1 = file_name.replace(' - 下载页', '')
  70.         name2 = name1.replace('<h1>', '')
  71.         name = name2.replace('</h1>', '')
  72.         a = url_download.find('"')
  73.         b = url_download.rfind('"')
  74.         url_list.append(url_download[a + 1 :b])
  75.         name_list.append(name)
  76.     download_list = [name_list, url_list]
  77.     return download_list

  78. def download():
  79.     # 下载
  80.     start_time = time.time()
  81.     download_list = download_url()
  82.     url = download_list[1]
  83.     name = download_list[0]
  84.     for i in range(len(url)):
  85.         response = RequestsDX(url[i])
  86.         print('='*100)
  87.         print('正在下载', name[i])
  88.         with open(r'D:\ppt\%s.zip' % name[i], 'wb') as f:
  89.             for chunk in response.iter_content(chunk_size=1024):
  90.                 f.write(chunk)
  91.         print('下载完成')
  92.     end_time = time.time()
  93.     cost = end_time - start_time
  94.     print(cost)
  95. download()
复制代码
最后贴上效果图
112206h3ysq2hm7z47e6y1.png

最后有几个疑问希望能有人帮我解答下:
1、我觉着是可以下载的更快的,可能是写法问题,请大佬指教
2、能否用多线程处理多个任务这样应该能更快,但是不太熟悉多线程模块,希望能有大佬提供个思路
3、能否告知python的写法的标准,我感觉我写的变量稀碎,因为是自学的所以全部都是自由发挥
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-10-27 14:32 | 显示全部楼层
多谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 15:12 | 显示全部楼层
谢谢楼主分享,先收藏了。
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 15:19 | 显示全部楼层
6666666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 16:04 | 显示全部楼层

不错不错~~~~~
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 16:35 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

头像被屏蔽
发表于 2020-10-27 16:44 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 17:12 | 显示全部楼层
谢谢大佬分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 17:14 | 显示全部楼层
谢谢分享!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-10-27 17:40 | 显示全部楼层
谢谢@Thanks!
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|大牛论坛 |我的广告

GMT+8, 2024-4-26 03:50 , Processed in 0.043129 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表