Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Py无处不在,你真的感受到了?

Py无处不在,你真的感受到了?

作者头像
公众号guangcity
发布于 2019-09-20 03:32:42
发布于 2019-09-20 03:32:42
49500
代码可运行
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)
运行总次数:0
代码可运行

Py无处不在,你真的感受到了?


0.前言1.图床我来了2.pdf我来了3.作者的话


今日知图

复制or粘贴

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 复制n行
nyy  例如复制10行 10yy 
# 粘贴
p

0.前言

好久没真真切切的用编程解决实际问题,我们通常是学,但是不会用,那么今天来学习一下,python在实际生活中的强大之处!特别是爬虫,哈哈~~~

之前承诺scrapy本周会发出一文,没问题,这周会发!本来打算用scrapy来写,结果发现scrapy写的太简单,真的,在scrapy中封装的要好,对于这节的学习,为了提高各位真正的编程与爬虫能力,我们不用框架,如果你需要框架scrapy来爬虫,可以留言,然后根据留言情况,适当将本节代码转为scrapy

ok,现在来说一下我的两个重要需求,也就是针对本文,放出两个重要实战!干货很多哦~~,嘿嘿~

第一需求来源于七牛云,我的博客用的图床是七牛云,然后七牛云为了号召国家响应,由于域名限制问题,你必须备案,所以七牛云就将之前的免费图床域名,变为测试域名,之前一直在想,免费的东西都用了这么久,什么时候收费啊,结果,就前两天,直接给我发了个邮件,提示你有一周时间,一周后,大家懂的,直接凉凉,所有图片404~~

看到这个消息后,非常震惊,当时有点小慌,但是机制的我,用python解决了这个问题。

给大家一句话:免费的永远是最贵的!!!

我又是怎么解决的呢?看后文留个疑惑!!

第二个需求来源于cs231n,我看到这个网站有很多pdf我需要下载,但是太多了,手动会点残,那么怎么办,总不能点一个下载一个吧,这也不符合我们程序员的风格。所以我又有了办法,看后面解决方案!

1.图床我来了

获取当前文件夹下所有的markdown文档

如下图所示是我的部分markdown文档,我们知道,当图床提供的url失效,那么所有图片404,这是个非常恐怖的问题,那么我该如何解决?

首先下载所有图片,七牛云提供了qshell命令工具,直接下载所有图片,非常爽,结果下来后,真的多,有450+的图片,如果放在每个markdown中,又得去找对应的文档以及450+个图片链接,手动修改,这个工作量太大了,所以我就用python实现替换所有markdown中的所有链接为新链接,这里将450+张图片存入了github上。后面再找其他的图床,如果有好的,留言一下~~

实战

首先获取文件夹下所有markdown文档!

这里通过os模块来解决!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import os
def file_name(file_dir):
    file_list = []
    # 三元tupple(dirpath, dirnames, filenames)
    '''
    dirpath:string,代表目录的路径;
    dirnames:list,包含了当前dirpath路径下所有的子目录名字(不包含目录路径);
    filenames:list,包含了当前dirpath路径下所有的非目录子文件的名字(不包含目录路径)。
    '''
    for root, dirs, files in os.walk(file_dir):
        print(root)
        print(dirs)
        print("----")
        print(files)
        for file in files:
            print(os.path.splitext(file))
            if os.path.splitext(file)[1] == '.md':
                file_list.append(os.path.join(root, file))
    return file_list

替换

然后需要做的就是所有文件原地替换!

下面两个链接我全部打码了,运用到你们自己的情况直接替换调即可!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def md_Link(file_list):
    for file in file_list:
        with open(file, 'r+', encoding='utf-8') as f:
            d = f.read()
            t = d.replace('http://xxxx.clouddn.com', 'https://raw.githubusercontent.com/xxxx/xxxx/xxx')
            f.seek(0, 0)
            f.write(t)

嗨皮,最终搞定~~~

2.pdf我来了

这里功能很明确,实现pdf全局下载!

下面这个布局大家很熟悉吧,很多网站的文件下载都是这样,那么也就意味着,只需要在我给的代码上稍作修改,便可以实现多个网站爬取

导包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import requests
from urllib import request
from lxml import etree
import os
import re
import time

目标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
base_url = 'http://cs231n.stanford.edu/slides/'

封装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class slides_Spider:
    def __init__(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
        }
        self.headers = headers

注:下面所有的代码都是在这个类封装下的方法!

获取选择器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_Html(self,url):
    html = requests.get(url, headers=self.headers).text
    selector = etree.HTML(html)
    return selector

年份获取

对于这个网站,难点在哪?

没有反爬,这就非常简单了,难点在你的处理,这里给出一个高级用法:starts-with,我通过这个来定位所有的a标签,根据href属性,筛选出年份,直接以20开头的便满足条件!用法看代码!

然后我们要获取下一个页面的url,也就是跳转链接,那就是跟前面的base_url拼接就行!

最后这里为什么返回两个,而不是一个,原因是,我想要用年份这个list来当作数据的目录名,每个目录下面有多个pdf,予以区分开,更加自动化处理!

另一个返回则是跳转下一个页面的url!

输出格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
['2015/', '2016/', '2017/', '2018/']
['http://xxx/2015/', 'http://xxx/slides/2016/', ...]

实战:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_yearUrl(self,url):
    selector = self.get_Html(url)
    year_Href=selector.xpath('//a[starts-with(@href, "20")]/text()')
    # 得到每个url的text,为一个list
    print(year_Href)
    year_sildeHref = []
    # 每个url拼接,得到跳转年份的url
    for i in range(len(year_Href)):
        year_sildeHref.append(base_url+year_Href[i])
    print(year_sildeHref)
    return year_Href,year_sildeHref

获取所有pdf链接

这里直接调用上述的年份跳转链接,进入相应链接后,如下图,会有多个pdf,这个就是我们最终的目标,那么如何处理呢,这里通过筛选出pdf结尾的url,并予以拼接,那么就得到了完整的pdf链接,最终建立一个字典来将对应的年份对应多个pdf,输出格式为下面:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{'2015': ['http://xxx/2015/xxx.pdf'...],'2016':[.....].....}

实战 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def get_AllUrl(self,url):
    year_Href,year_sildeHref = self.get_yearUrl(url)
    pdf_dict = {}
    for i in range(len(year_sildeHref)):
        pdf_list = []
        selector = self.get_Html(year_sildeHref[i])
        pdf_response = selector.xpath('//a[contains(@href,"pdf")]/text()')
         # 去掉2015后面的/
        year_Href[i] = year_Href[i].replace('/','')
        for j in pdf_response:
            pdf_list.append(year_sildeHref[i]+j)
        pdf_dict[year_Href[i]] = pdf_list

    print(pdf_dict)
    return pdf_dict

下载pdf

首先利用上面的字典key创建目录,然后循环遍历当前key所对应的list当中的每个url,然后下载,最终下载的文件名为url中后面xx.pdf形式!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def downLoad_Pdf(self,url):
    pdf_dict = self.get_AllUrl(url)
    for key in pdf_dict:
        path = key
        if not os.path.exists(path):
            os.mkdir(path)
        else:
            print("目录已存在")
        print("---------"+ key +"年资料正在下载---------")
        for each in pdf_dict[key]:
            pdf_name = re.split('/', each)[-1]
            print(pdf_name)
            content = requests.get(each,headers=self.headers)
            with open(path+'/'+pdf_name, 'wb') as f:
                for chunk in content.iter_content(chunk_size=32):
                    f.write(chunk)
            time.sleep(2)
        print("---------" + key + "年资料下载完毕---------")
    print("---------下载完毕---------")

调用

调用上面方法!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
s = slides_Spider()
allPdf_url = s.downLoad_Pdf(base_url)
print(allPdf_url)

结果

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python下载视频的三种姿势
今天和大家分享下我近段时间get的新技能,用单线程、多线程和协程三种方式爬取并下载梨视频的小视频,话不多说,我们开始叭。冲鸭冲鸭!
可以叫我才哥
2021/12/04
2.4K0
Python下载视频的三种姿势
类及数据库的应用,G-MARK网站数据Python爬虫系统的构建
“Good Design Award”创立于1957年,也是日本国内唯一综合性的设计评价与推荐制度,通称为G-mark,中文称之为日本优良设计大奖。
二爷
2020/07/22
6230
类及数据库的应用,G-MARK网站数据Python爬虫系统的构建
爬虫网页解析之css用法及实战爬取中国校花网
我们都知道,爬虫获取页面的响应之后,最关键的就是如何从繁杂的网页中把我们需要的数据提取出来,
Python编程与实战
2019/12/04
2K0
初学者的20个爬虫经典案例视频_李昌钰水门事件20集大经典案例
链接:aHR0cHM6Ly9iai5mYW5nLmxpYW5qaWEuY29tL2xvdXBhbi8=
全栈程序员站长
2022/11/07
1.2K0
初学者的20个爬虫经典案例视频_李昌钰水门事件20集大经典案例
语雀文档批量导出为Markdown文件
语雀的定位由之前的社区转向工具,也不提供批量导出Markdown的功能,有开发者提供了导出脚本可以通过语雀官方API帮我们把文档批量导出为Markdown,方便我们把文档导入notion等其他平台或者备份在本地,以备不时之需
KenTalk
2023/04/07
3.2K0
语雀文档批量导出为Markdown文件
Python爬虫学习 煎蛋网全站妹子图爬虫
通过上一篇文章的爬取过程,我们基本上理解了抓取一个网站的大致流程。因为一个网站虽然有很多页,但是大部分网站每一页的HTML标签内容都是相同的。我们只要获取到一页的内容,就可以获得所有页的内容了。那么开始之前,我们来分析一下煎蛋网妹子图页面的URL。
python学习教程
2020/06/09
1.5K0
python爬虫之——爬取煎蛋网图片
事先声明:本人之前并没有听说过什么煎蛋网,代码学习来自其他网站,仅供学习使用。 import requests import os import time from bs4 import BeautifulSoup # 发出请求获得HTML源码 def get_html(url): # 指定一个浏览器头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.3
种花家的奋斗兔
2020/11/13
5320
Requests+Etree+BeautifulSoup+Pandas+Path+Pyinstaller应用 | 获取页面指定区域数据存入文档
注意:请文明上网,本文仅作为学习用。讲述的是思路和方法,所以对被测试网站关键数据进行隐藏。如有需要,可学习思路后自行找测试对象进行学习。
虫无涯
2023/02/15
1.2K0
Scrapy实战:爬取一个百度权重为7的化妆品站点
Scrapy实战:爬取一个百度权重为7的化妆品站点 网站为OnlyLady:http://hzp.onlylady.com/brand.html 创建 创建项目 $ scrapy startproject onlylady 创建爬虫 $ cd onlylady $ scrapy genspider ol hzp.onlylady.com 结构如下: ├── onlylady │ ├── __init__.py │ ├── items.py │ ├── middlewares.py │ ├──
禹都一只猫olei
2018/05/10
7673
Scrapy实战:爬取一个百度权重为7的化妆品站点
简单NLP分析套路(1)----语料库积累之3种简单爬虫应对大部分网站
近期有机会听了听天善智能的课程《自然语言处理之AI深度学习顶级实战课程》慢慢的有一些心得,以后有机会慢慢给大家分享出来。
流川疯
2019/01/17
2.2K0
[Python] 超星学习通作业批量下载
# -*- coding: utf8 -*- #coder:nianboy #time:2022-7-14 import os import re import requests import pandas as pd class ChaoXingWork: def __init__(self, user, password): self.password = password self.user = user self.work_da
纯情
2023/04/27
3830
python scrapy 爬虫实例_scrapy爬虫完整实例
本文主要通过实例介绍了scrapy框架的使用,分享了两个例子,爬豆瓣文本例程 douban 和图片例程 douban_imgs ,具体如下。
全栈程序员站长
2022/09/13
4780
十分钟写个博客迁移工具
最近不少写博客的朋友跟我反馈博客园的一些文章下架了,这让我联想到去年简书一样,我之前写的博客都被下架不可见了。
Cookieboty
2021/04/09
4780
十分钟写个博客迁移工具
python: 自动下载sci-hub文献
科研神器sci-hub下载文献简单易用,但是仍然需要手动下载,如果待下载文献太多,就不那么友好了,最好可以自动批量下载,而这个正好是python requests库所擅长的。
生信菜鸟团
2022/02/17
3.3K0
python: 自动下载sci-hub文献
语雀迁移至Obsidian
之前一直使用Typora+各种博客(Wordpress/Hexo/Typecho)来进行笔记和写作,后来接触并爱上了语雀,主要是贴图太方便了。(使用Typora的时候会搭配PicGo+云存储,但是有时候会粘贴了多余的图片或者想替换已有图片时,懒得打开云存储进行删除,久而久之就忘了,造成了一定的空间浪费。) 刚开始用语雀的时候还特地看了下,可以导出md格式的文章。但最近想批量导出知识库时,发现只能选择PDF或者语雀特定的格式,数据不在自己手里感觉不大放心。于是弄了个脚本通过语雀官方API导出了全部文章,并开始寻找本地存储的笔记软件。 结合个人情况进行筛选后发现Obisidian比较适合,但是一开始不会用,不会怎么处理图片路径的问题。语雀是没有目录这个概念的,所以导出的文章都放到了一起,然后图片等资源也统一放到了文章目录中的某一目录。而如果我在Obsidian里通过建立多级文件夹的方式来分类文章,那么所有图片资源的链接都要进行改动,差点弃坑了。还好在B站看了关于ob的视频,学到了通过索引的方式来进行管理。
Naraku
2022/01/20
5.3K0
语雀迁移至Obsidian
爬虫必备技能之网页解析库:xpath用法和实战
在安装 scrapy 之前需要先安装 Twisted 地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted。下载符合自己版本的 Twisted,然后将其放入 python 安装目录中,先使用命令安装 pip install Twisted。安装完之后,scrapy 就很容易安装了,安装命令如下:pip install scrapy。
润森
2019/08/29
1.2K0
爬虫必备技能之网页解析库:xpath用法和实战
归档 | 记录一次视频切片并上传大厂图床的尝试
经常在各种影视站看到图床切片的视频,研究了下。 首先看效果(新人练手项目,代码很烂,重在思路) 本文不提供相关接口,仅做技术复现! 前期准备 需要首先安装 ffmpeg 并配置到环境变量(使用命令行输入 ffmpeg 可以正常打开的那种) https://www.gyan.dev/ffmpeg/builds/ 或 https://github.com/BtbN/FFmpeg-Builds/releases 目录结构 项目分为以下几部分 对 mp4 文件进行格式转换,转成单个 ts 文件 对 单个 ts
Zkeq
2022/05/18
2.6K0
归档 | 记录一次视频切片并上传大厂图床的尝试
用Python脚本自动采集金融网站当天发布的免费报告
想写一个脚本能自动采集下载当天发布的这个页面的这几个免费报告,能保存成这个标题的pdf文件,网站是手机号注册就能下载这些文件的,就是在我注册登录状态下,能采集下载。
Python进阶者
2023/08/31
3660
用Python脚本自动采集金融网站当天发布的免费报告
爬虫学习
安装Anaconda(集成环境), 安装成功后能够提供一种基于浏览器的可视化工具 ---Jupyter.
py3study
2020/01/17
2K0
一个scrapy框架的爬虫(爬取京东图书)
我们的这个爬虫设计来爬取京东图书(jd.com)。 scrapy框架相信大家比较了解了。里面有很多复杂的机制,超出本文的范围。 1、爬虫spider tips: 1、xpath的语法比较坑,但是你可以在chrome上装一个xpath helper,轻松帮你搞定xpath正则表达式 2、动态内容,比如价格等是不能爬取到的 3、如本代码中,评论爬取部分代码涉及xpath对象的链式调用,可以参考 # -*- coding: utf-8 -*- # import scrapy # 可以用这句代替下面三句,但不推荐
用户1225216
2018/03/05
1.4K0
推荐阅读
相关推荐
Python下载视频的三种姿势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验