当前分类 / Python / 总共12篇

Python 多线程和多进程爬虫

前面的 《Python 的网络请求 Requests 模块使用》 我们已经对爬虫的基本过程有了了解,而且整个过程比较顺畅,容易理解,但是很多情况下我们的爬取工作并不是如此轻松的,我们可能会面临一些特殊情况,例如今天要说的速度问题,如果有大量的页面需要爬取,我们还使用单一线程就很慢了。

多线程爬虫

我们先不考虑特别大型的爬取,本文所有的思路都是基于满足个人需求的中型爬取需要。我们可以使用多线程来并行爬取,这样就可以成倍的提高爬取速度。

我们先来感受一下如何使用多线程:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import _thread
import time

def print_time(threadName, delay):
    count = 0
    while count < 3:
        time.sleep(delay)
        count += 1
        print(threadName, time.ctime())

_thread.start_new_thread(print_time, ("Thread-1", 1))
_thread.start_new_thread(print_time, ("Thread-2", 2))

阅读更多

Python 经典开源爬虫案例

下面是我整理的一些 GitHub 上面经典的开源爬虫项目,涵盖的比较全面,供大家学习使用。

WechatSogou

微信公众号爬虫

基于搜狗微信搜索的微信公众号爬虫接口,可以扩展成基于搜狗搜索的爬虫,返回结果是列表,每一项均是公众号具体信息字典。

GitHub 地址:https://github.com/Chyroc/WechatSogou

DouBanSpider

豆瓣读书爬虫

可以爬下豆瓣读书标签下的所有图书,按评分排名依次存储,存储到 Excel 中,可方便大家筛选搜罗,比如筛选评价人数 >1000 的高分书籍;可依据不同的主题存储到 Excel 不同的 Sheet ,采用User Agent 伪装为浏览器进行爬取,并加入随机延时来更好的模仿浏览器行为,避免爬虫被封。

GitHub 地址:https://github.com/lanbing510/DouBanSpider

阅读更多

Python 文件存储和数据库

Python 中数据存储的方式和其他语言没什么区别,主要分为两个方面:文件存储和数据库存储。

文件存储

文件存储的方法也分为很多种,主要包括:

  • Python 内置方法
  • NumPy 模块方法
  • os 模块方法
  • csv 模块方法

Python 内置方法

在不需要借助任何外界库的前提下,python 内置方法其实也可以完成我们需要的文件存取任务:

open() 方法

file object = open(file_name [, access_mode][, buffering])

该方法意义在于按照指定模式打开文件,其中,各个参数的含义如下:

阅读更多

Python 的网络请求 Requests 模块使用

Request 是一个简答优雅的 python HTTP 库,相较于 python 标准库中的 urllib 和 urllib2 的库,Requests 更加的便于理解使用, 本篇文章将带你详细了解 Requests 的基本用法。

Requests 模块

安装

pip install requests

注意:在 python 3.8 中的安装包中默认安装了 pip 工具,只需要我们配置一下环境变量即可

PAHT = 'C:\Users\Administrator\AppData\Local\Programs\Python\Python38\Scripts'

阅读更多

Python基础知识总结

Python 是著名的 “龟叔” Guido van Rossum 在 1989 年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言。

Python 的火热度怕是大家已经早已感受到了,很多程序员将 Python 作为了他的第二语言,如果你至今还未接触任何和 Python 相关的知识,那么今天我带给你的这篇文章可以让你快速了解 Python 语法,上手做东西了。

Python 语言的特点

Python 是一种解释性语言

编译型语言:在程序执行前,会通过编译器将程序(代码)转换为机器语言(计算机可以看懂的语音),比如C语音。

解释型语言:没有编译过程,在程序执行的时候通过解释器对程序逐行解释然后直接运行。

比较:因为编译型语音在执行前已经做了编译(翻译给计算机),所以执行比较快(执行过程中不需要翻译)。

事实上,解释性语言还有一个缺点就是不能实现加密,如果要发布你的 Python 程序,实际上就是发布源代码,这一点跟 C/Java 等语言不同。当然了我们也不需要在意这些,如果你要写一个程序卖给别人可能会造成影响,大多数商业模式是售卖服务,所以不存在源码公开问题。

Python 是面向对象的语言

面向过程:一般就是先分析解决问题需要的步骤,然后用函数把这些步骤一步步实现,然后依次调用(比较接近计算机的思考方式)。

面向对象:把问题中的各个事物分解(抽象)成各个对象,通过对象之间交互来实现(和我们人类的思考方式更接近)。

Python 比较适合初学者

Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

阅读更多

Python为什么现在这么火

Python 国内的发展概况

几年前 Python 在国内还只是一门小众语言,但从 2011 开始到现在,Python 的百度搜索指数翻了 10 倍,从下图看得出 Python 在国内的流行度已经直逼 Java,大有赶超之势。

2017年的百度指数趋势图

上图是 2017 年的百度指数趋势图,最近我又比较了Python, Java, PHP 和 JavaScript 发现 Python 几乎是其他的 2 到 3 倍甚至 4 倍还多。难道现在很多公司都在用 python 吗?还是说这个指数只是说明关注和学习的人多了。

2017年到2019年的百度指数趋势图

阅读更多

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 参数可以字节为单位设置缓冲区的大小,用来发送文件类消息体。

举个例子,以下调用都是创建连接到同一主机和端口的服务器的实例:

>>> h1 = http.client.HTTPConnection('www.python.org')
>>> h2 = http.client.HTTPConnection('www.python.org:80')
>>> h3 = http.client.HTTPConnection('www.python.org', 80)
>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)

此模块中定义的常量为:

http.client.HTTP_PORT HTTP 协议默认的端口号 (总是 80)。

http.client.HTTPS_PORT HTTPS 协议默认的端口号 (总是 443)。

阅读更多

Python实现的图片压缩处理工具

前言

最近在博客中做了一个相册功能,但是问题是我的图片都很大,用图片压缩工具压缩了一遍感觉不是很方便,于是就搜了一下python相关工具,后来发现知乎上的一篇文章《如何用Python智能批量压缩图片》,这里感谢作者提供了思路,短短几行代码实现了图片压缩需求。

最后添加了图片水印功能,可以方便配置图片路径来实现压缩和水印添加,本来打算使用Tkinter来实现一个图片界面方便操作,后来想想还是把精力放在核心逻辑上面吧,其实使用图形界面不见的就很方便,这样修改配置其实更方便些,如果你想实现成图形界面可参考我的另一篇博文《Python两个案例练习》

知识点

内置模块和第三方模块

在python中,一个.py文件就可以理解为一个模块,模块之间可以互相引用。

模块分为三种:自己写的、内置的、第三方的。

内置模块一般存放在安装目录的lib目录下,第三方库一般存放在安装目录的lib\site-packages目录下。第三方库使用前需要提前安装,例如Python操作图像的模块PIL需要提前安装。

阅读更多

Python做Hexo博客编辑和发布工具

这几天发生了一些意外,我的固态硬盘奇迹般的坏了,上周四倒腾了一天最终还是丢失了很多文件和我之前写的很多工具脚步,后来又忍痛买了一个新的固态盘。这件事让我对文件备份有了新的认识,也是通过这件事我琢磨准备做一个博客自动备份、编辑和发布的工具。

这个是我做的一个雏形,基本上已经能满足我大部分需求了,但是还不足以让大家使用,我慢慢抽时间修改和迭代吧,中间还有一些技术问题现在还未解决。

阅读更多

Python图形界面Tkinter的使用详解

本文参考自莫烦python视频:https://morvanzhou.github.io/tutorials/python-basic/tkinter/

导入模块

import Tkinter  #注意python 3.0改为了tkinter

或者直接这样导入

from TKinter import *

最简单的界面

注意我的python版本是:2.7.15

#!/usr/bin/python
# -*- coding: UTF-8 -*-

from Tkinter import *

top = Tk()
top.mainloop()

Label和Button

#!/usr/bin/python
# -*- coding: UTF-8 -*-

#3.0版本请使用 import tkinter as tk
import Tkinter as tk

window = tk.Tk() 
window.title('我的窗口')  #添加标题
window.geometry('400x200')  #设置window大小

v = tk.StringVar(None, 'i am a label', None)  #文字变量存储器

#width=15表示15个字符宽度,heiht=2表示2个字符高度,如果直接设置文本可以用text='labeltext'
lable = tk.Label(window, textvariable=v, bg='green', font=('Arial', 12), width=20, height=2)
lable.pack()

on_hit = False
def click_me():  #按钮点击处理方法
    global on_hit
    if on_hit == False:
        on_hit = True
        v.set('clicked you ...')
    else:
        on_hit = False
        v.set('')

button = tk.Button(window, text="click me", width=15, height=2, command=click_me)
button.pack()

window.mainloop()

阅读更多

AndroidStudio 多个 AppId 多渠道快速打包

一直感觉 AndroidStudio 没有 eclipse 快,但是最近由于遇到一个问题不得不将工程迁移到 AndroidStudio 上,迁移后之前在 eclipse 上所做的所有批量打包又得重新在 AndroidStudio 上搞一遍,不得不说这个过程远比我想象的让人愉快,AndroidStudio 的强大和好用改变了之前我对这个 IDE 的偏见,无疑这个 IDE 是开发 Android 的最好工具。

普通打包配置

defaultConfig {
    applicationId myAppId
    minSdkVersion 14
    targetSdkVersion 19
    versionCode vCode
    versionName vName
    testApplicationId "com.xx.xxx.test"
    testInstrumentationRunner "android.test.InstrumentationTestRunner"
    multiDexEnabled true
    signingConfig signingConfigs.releaseConfig
    manifestPlaceholders = [package_name: myAppId, app_icon: myAppIcon,
                            app_name: myAppName, umeng_appkey: umengAppKey,
                            main_menu_json: mainMenus, main_app_change_string:appChangedText]
}

这个配置是一个默认配置项,我们可以将一些公共的东西配置在这里,在这里可以看到我对 AppId (也就是通常说的包名)用一个变量进行配置,因为在我的工程中同一个源码要打多个应用(AppId),像这样的需求应该不多见,但是你总有一天会碰到。

阅读更多