前面的 《Python 的网络请求 Requests 模块使用》 我们已经对爬虫的基本过程有了了解,而且整个过程比较顺畅,容易理解,但是很多情况下我们的爬取工作并不是如此轻松的,我们可能会面临一些特殊情况,例如今天要说的速度问题,如果有大量的页面需要爬取,我们还使用单一线程就很慢了。
多线程爬虫
我们先不考虑特别大型的爬取,本文所有的思路都是基于满足个人需求的中型爬取需要。我们可以使用多线程来并行爬取,这样就可以成倍的提高爬取速度。
我们先来感受一下如何使用多线程:
|
|
前面的 《Python 的网络请求 Requests 模块使用》 我们已经对爬虫的基本过程有了了解,而且整个过程比较顺畅,容易理解,但是很多情况下我们的爬取工作并不是如此轻松的,我们可能会面临一些特殊情况,例如今天要说的速度问题,如果有大量的页面需要爬取,我们还使用单一线程就很慢了。
我们先不考虑特别大型的爬取,本文所有的思路都是基于满足个人需求的中型爬取需要。我们可以使用多线程来并行爬取,这样就可以成倍的提高爬取速度。
我们先来感受一下如何使用多线程:
|
|
下面是我整理的一些 GitHub 上面经典的开源爬虫项目,涵盖的比较全面,供大家学习使用。
微信公众号爬虫
基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。
GitHub 地址:https://github.com/Chyroc/WechatSogou
豆瓣读书爬虫
可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到 Excel 中,可方便大家筛选搜罗,比如筛选评价人数 >1000 的高分书籍;可依据不同的主题存储到 Excel 不同的 Sheet ,采用User Agent 伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。
GitHub 地址:https://github.com/lanbing510/DouBanSpider
Python 是著名的 “龟叔” Guido van Rossum 在 1989 年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。
Python 的火热度怕是大家已经早已感受到了,很多程序员将 Python 作为了他的第二语言,如果你至今还未接触任何和 Python 相关的知识,那么今天我带给你的这篇文章可以让你快速了解 Python 语法,上手做东西了。
编译型语言:在程序执行前,会通过编译器将程序(代码)转换为机器语言(计算机可以看懂的语音),比如C语音。
解释型语言:没有编译过程,在程序执行的时候通过解释器对程序逐行解释然后直接运行。
比较:因为编译型语音在执行前已经做了编译(翻译给计算机),所以执行比较快(执行过程中不需要翻译)。
事实上,解释性语言还有一个缺点就是不能实现加密,如果要发布你的 Python 程序,实际上就是发布源代码,这一点跟 C/Java 等语言不同。当然了我们也不需要在意这些,如果你要写一个程序卖给别人可能会造成影响,大多数商业模式是售卖服务,所以不存在源码公开问题。
面向过程:一般就是先分析解决问题需要的步骤,然后用函数把这些步骤一步步实现,然后依次调用(比较接近计算机的思考方式)。
面向对象:把问题中的各个事物分解(抽象)成各个对象,通过对象之间交互来实现(和我们人类的思考方式更接近)。
Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。
我们为了提高网站的收录量,最好通过API主动提交给搜索引擎,之前在 Hexo 中有比较好用的 hexo-baidu-url-submit
插件,而使用 hugo 后没找到比较合适方便的,于是便想到使用 python 提交到百度服务器,根据官方文档和示例,使用 http.client
实现的 POST 提交。
http.client
模块定义实现了 HTTP 和 HTTPS 协议的客户端类,API 如下:
class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)
HTTPConnection 的实例代表与 HTTP 的一个连接事务。 它的实例化应当传入一个主机和可选的端口号。 如果没有传入端口号,如果主机字符串的形式为 主机:端口 则会从中提取端口,否则将使用默认的 HTTP 端口(80)。 如果给出了可选的 timeout 参数,则阻塞操作(例如连接尝试)将在指定的秒数之后超时(如果未给出,则使用全局默认超时设置)。 可选的 source_address 参数可以为一个 (主机, 端口) 元组,用作进行 HTTP 连接的源地址。 可选的 blocksize 参数可以字节为单位设置缓冲区的大小,用来发送文件类消息体。
举个例子,以下调用都是创建连接到同一主机和端口的服务器的实例:
|
|
此模块中定义的常量为:
http.client.HTTP_PORT
HTTP 协议默认的端口号 (总是 80)。
http.client.HTTPS_PORT
HTTPS 协议默认的端口号 (总是 443)。
最近在博客中做了一个相册功能,但是问题是我的图片都很大,用图片压缩工具压缩了一遍感觉不是很方便,于是就搜了一下python相关工具,后来发现知乎上的一篇文章《如何用Python智能批量压缩图片》,这里感谢作者提供了思路,短短几行代码实现了图片压缩需求。
最后添加了图片水印功能,可以方便配置图片路径来实现压缩和水印添加,本来打算使用Tkinter来实现一个图片界面方便操作,后来想想还是把精力放在核心逻辑上面吧,其实使用图形界面不见的就很方便,这样修改配置其实更方便些,如果你想实现成图形界面可参考我的另一篇博文《Python两个案例练习》。
在python中,一个.py文件就可以理解为一个模块,模块之间可以互相引用。
模块分为三种:自己写的、内置的、第三方的。
内置模块一般存放在安装目录的lib
目录下,第三方库一般存放在安装目录的lib\site-packages
目录下。第三方库使用前需要提前安装,例如Python操作图像的模块PIL需要提前安装。
这几天发生了一些意外,我的固态硬盘奇迹般的坏了,上周四倒腾了一天最终还是丢失了很多文件和我之前写的很多工具脚步,后来又忍痛买了一个新的固态盘。这件事让我对文件备份有了新的认识,也是通过这件事我琢磨准备做一个博客自动备份、编辑和发布的工具。
这个是我做的一个雏形,基本上已经能满足我大部分需求了,但是还不足以让大家使用,我慢慢抽时间修改和迭代吧,中间还有一些技术问题现在还未解决。
本文参考自莫烦python视频:https://morvanzhou.github.io/tutorials/python-basic/tkinter/
|
|
或者直接这样导入
|
|
注意我的python版本是:2.7.15
|
|
|
|
一直感觉 AndroidStudio 没有 eclipse 快,但是最近由于遇到一个问题不得不将工程迁移到 AndroidStudio 上,迁移后之前在 eclipse 上所做的所有批量打包又得重新在 AndroidStudio 上搞一遍,不得不说这个过程远比我想象的让人愉快,AndroidStudio 的强大和好用改变了之前我对这个 IDE 的偏见,无疑这个 IDE 是开发 Android 的最好工具。
|
|
这个配置是一个默认配置项,我们可以将一些公共的东西配置在这里,在这里可以看到我对 AppId (也就是通常说的包名)用一个变量进行配置,因为在我的工程中同一个源码要打多个应用(AppId),像这样的需求应该不多见,但是你总有一天会碰到。