<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[张昆]]></title><description><![CDATA[Peace & Love]]></description><link>https://blog.youkuaiyun.com/u013205877</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; u013205877]]></copyright><item><title><![CDATA[python 图片、文件 通过 request header 多线程下载]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/104410634</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/104410634</guid><author>u013205877</author><pubDate>Thu, 20 Feb 2020 14:47:36 +0800</pubDate><description><![CDATA[写爬虫过程中发现图片下载比较慢，遂使用多线程下载来提速
import threading
import requests


class MulThreadDownload(threading.Thread):
    def __init__(self, url, startpos, endpos, temp_dict, headers, proxies):
        super(MulT...]]></description><category></category></item><item><title><![CDATA[python3 requests https 请求 报 SSLContext 相关递归错误]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/103146818</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/103146818</guid><author>u013205877</author><pubDate>Tue, 19 Nov 2019 17:10:29 +0800</pubDate><description><![CDATA[一、错误信息：
2019-11-19 15:14:40 : Provider before requests .post
2019-11-19 15:14:41 : error infoTraceback (most recent call last):
  File "/root/operation/spider/web/lh_spider_config/utils/run_provider/s...]]></description><category></category></item><item><title><![CDATA[selenium webdriver chrome 获取 文件 下载 链接 （js生成的链接，点击事件发送请求并弹窗的那种）]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/103040203</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/103040203</guid><author>u013205877</author><pubDate>Tue, 12 Nov 2019 23:04:22 +0800</pubDate><description><![CDATA[import json
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

chrome_options = Option...]]></description><category></category></item><item><title><![CDATA[爬虫 headless 访问 知道创宇 加速乐 CDN 网站]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/102698620</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/102698620</guid><author>u013205877</author><pubDate>Wed, 23 Oct 2019 11:47:55 +0800</pubDate><description><![CDATA[通过 requests.get 直接请求网站首页，返回 521 错误提示码，返回结果是js代码。这是采用加速乐反爬技术，在访问前先判断客户端的cookie是否正确，如果不正确，返回521状态码和一段js代码，并且进行set-cookie操作，返回的js代码经过浏览器执行又会生成新的cookie，这两个cookie一起发送给服务器，才会返回正确的网页内容
试了下代码demo如下，有cookie就带上...]]></description><category></category></item><item><title><![CDATA[python爬虫 伪装 使用 mitmproxy 通过js验证]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/102518969</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/102518969</guid><author>u013205877</author><pubDate>Sat, 12 Oct 2019 14:01:33 +0800</pubDate><description><![CDATA[是否爬虫可以通过如下的方式检测出来
爬虫如何通过https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html的检测

1. 爬虫的代码
chrome headless 配置、基本安装和使用可以参考：
http://www.voidcn.com/article/p-hwlrznzi-bp...]]></description><category></category></item><item><title><![CDATA[python 重写logging.Handler的emit 实现日志输出到 redis 数据库]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/101532141</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/101532141</guid><author>u013205877</author><pubDate>Fri, 27 Sep 2019 14:18:35 +0800</pubDate><description><![CDATA[python中想要把日志输出到redis，可以写一个类继承logging.Handler，并重写emit方法来实现
import logging
import datetime
from redis import StrictRedis, ConnectionPool
from core.settings import REDIS_HOST, REDIS_DB, REDIS_PORT

pool ...]]></description><category></category></item><item><title><![CDATA[1.6 在字典中将键映射到多个值上]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/100632046</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/100632046</guid><author>u013205877</author><pubDate>Mon, 09 Sep 2019 17:31:52 +0800</pubDate><description><![CDATA[字典是一种关联容器，每个键都映射到一个单独的值上，如果想让键映射到多个值，需要将这多个值保存到另一个容器如列表或者集合中。要使用列表或者集合取决于应用的意图，如果希望保留应用的插入顺序就用列表，如果希望不重复就用集合。
为了能方便的创建这样的字典，可以使用collections模块中的defaultdict类

...]]></description><category></category></item><item><title><![CDATA[1.5 实现优先级队列]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/100624230</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/100624230</guid><author>u013205877</author><pubDate>Sun, 08 Sep 2019 12:42:13 +0800</pubDate><description><![CDATA[想要实现一个队列,能够以给定的优先级来对准荣盛排序,而且每次pop操作时候都会返回优先级最高的那个元素
使用heapq模块来实现一个简单的优先级队列
import heapq

class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(sel...]]></description><category></category></item><item><title><![CDATA[1.4 找到最大或者最小的N个元素]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/100621920</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/100621920</guid><author>u013205877</author><pubDate>Sun, 08 Sep 2019 11:25:57 +0800</pubDate><description><![CDATA[一、N=1 使用min、max
如果只是简单的想找到最小或最大的元素（N=1时），使用min和max最快
二、N约等于集合长度，先排序
如果N和集合的本身大小差不多，通常更快的方法是先对集合进行排序，然后做切片操作，例如sorted(items)[:N]或者sorted(items)[-N:]
三、N小于集合长度 使用heapq
如果我们想在某个集合中找到最大或者最小的N个元素,使用heapq中的...]]></description><category></category></item><item><title><![CDATA[1.3 保存最后N个元素]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/100561012</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/100561012</guid><author>u013205877</author><pubDate>Thu, 05 Sep 2019 16:37:09 +0800</pubDate><description><![CDATA[在迭代或者其他形式的处理过程中对最后几项记录做一个有限的历史记录统计
from collections import deque

def search(lines, pattern, history):
    previous_lines = deque(maxlen=history)
    for line in lines:
        if pattern in line:
   ...]]></description><category></category></item><item><title><![CDATA[1.2 从任意长度的可迭代对象中分解元素]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/100560123</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/100560123</guid><author>u013205877</author><pubDate>Thu, 05 Sep 2019 16:03:41 +0800</pubDate><description><![CDATA[1.2 从任意长度的可迭代对象中分解元素
使用*表达式来代替多项
record = (1,2,3,4,5,6)
a,*b,c = record
print(a,b,c)

输出：
1 [2, 3, 4, 5] 6


]]></description><category></category></item><item><title><![CDATA[1.1 将序列分解为单独的变量]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/100559696</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/100559696</guid><author>u013205877</author><pubDate>Thu, 05 Sep 2019 15:50:51 +0800</pubDate><description><![CDATA[只要对象是可迭代的，字符串、文件、迭代器生成器都行，就可以执行分解操作,例如
x,y = (4,5)

name, date = ['acme', (2012, 12, 12)]

_, shares, price, _ = ['acme',50, 91.1, (2012,12,12)]


...]]></description><category></category></item><item><title><![CDATA[跟着董伟明大佬的书了解了解 python常用的类库]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/98088650</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/98088650</guid><author>u013205877</author><pubDate>Fri, 02 Aug 2019 10:41:51 +0800</pubDate><description><![CDATA[一、errno
在日常开发中经常需要捕获各种异常，做特殊处理。举个例子：
    os.kill(12345,0)

输出
Traceback (most recent call last):
  File "/Users/zhangkun/Documents/GitHub/geektime/test.py", line 4, in &lt;module&gt;
    os.kill(12345...]]></description><category></category></item><item><title><![CDATA[再用半个小时你就可以彻底了解 python3.6协程中的async/await的来源了]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/91383530</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/91383530</guid><author>u013205877</author><pubDate>Thu, 01 Aug 2019 18:15:06 +0800</pubDate><description><![CDATA[看到一篇非常明晰的讲述，转载过来备忘
Python中的协程大概经历了如下三个阶段：

最初的生成器变形yield/send
引入@asyncio.coroutine和yield from
在最近的Python3.5版本中引入async/await关键字

一、生成器变形yield/send
普通函数中如果出现了yield关键字，那么该函数就不再是普通函数，而是一个生成器。
def mygen(al...]]></description><category></category></item><item><title><![CDATA[一个小时理解同步异步、阻塞非阻塞、IO多路复用、select、poll、epoll等概念]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/94228455</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/94228455</guid><author>u013205877</author><pubDate>Thu, 01 Aug 2019 18:13:22 +0800</pubDate><description><![CDATA[一、同步、异步、阻塞与非阻塞
1.同步与异步
1.1 同步与异步概念
同步和异步的概念与消息的通知机制有关。同步与异步主要是从消息通知机制角度来说的。

同步就是一个任务的完成需要依赖另外一个任务时，只有等待被依赖的任务完成后，依赖的任务才能算完成，这是一种可靠的任务序列。要么成功都成功，失败都失败，两个任务的状态可以保持一致。
异步是不需要等待被依赖的任务完成，只是通知被依赖的任务要完成什么工作...]]></description><category></category></item><item><title><![CDATA[Git 入门教程]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/97750522</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/97750522</guid><author>u013205877</author><pubDate>Tue, 30 Jul 2019 15:39:06 +0800</pubDate><description><![CDATA[via runoob
一、配置

/etc/gitconfig 文件：系统中对所有用户都普遍适用的配置。若使用 git config 时用 --system 选项，读写的就是这个文件。
~/.gitconfig 文件：用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项，读写的就是这个文件。
当前项目的 Git 目录中的配置文件（也就是工作目录中的 .gi...]]></description><category></category></item><item><title><![CDATA[普通人该如何买保险]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/94651296</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/94651296</guid><author>u013205877</author><pubDate>Thu, 04 Jul 2019 23:04:02 +0800</pubDate><description><![CDATA[一、买之前：预防销售套路
1. 第一种套路：停售
平时我们怎么接触到保险呢？除了说在电视上经常看到广告之外，是不是我们身边的代理人，也就是说，我们的亲戚朋友的代理人，主动来找到我们：“哎呀，是不是给孩子买个保险呀，要帮孩子存一点钱！”或者是说：“哎呀，你要买一个什么保险，可以年年领，月月领，一直领到死！”这种话呢，经常会从他们的嘴巴里面讲出来，那么到底她们讲的这些话，里面哪些是属于套路呢？

最常...]]></description><category></category></item><item><title><![CDATA[python中的线程相关概念简单梳理]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/93904303</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/93904303</guid><author>u013205877</author><pubDate>Thu, 27 Jun 2019 22:14:00 +0800</pubDate><description><![CDATA[1.简单启动一个线程
python标准库提供了threading模块，启动一个线程就是把一个函数传给Thread实例，再调用start()运行起来
import threading
import time

def loop():
    print(f'----------thread :{threading.current_thread().name} is running...')
    ...]]></description><category></category></item><item><title><![CDATA[Python的type和object之间到底是什么关系？]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/90727698</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/90727698</guid><author>u013205877</author><pubDate>Sat, 01 Jun 2019 12:00:57 +0800</pubDate><description><![CDATA[V2EX上有个问题：三年左右的 Python 后端 , 大概要能到什么样到水平才合格啊？下面的回复众说纷纭，但是有个问题比较新颖：描述一下 type 与 object 的关系，查了一下网上的答案，加上一些自己的理解写到这里备忘（其实印象中以前在某本书上看过的，但是不想翻书找，搜索引擎提高学习效率啊）
前提是我们已经了解了面向对象编程中的类的继承关系，类的实例化概念，在这个基础上来理解会更容易一些。...]]></description><category></category></item><item><title><![CDATA[macOS pip 安装 mysqlclient 报错]]></title><link>https://blog.youkuaiyun.com/u013205877/article/details/90173097</link><guid>https://blog.youkuaiyun.com/u013205877/article/details/90173097</guid><author>u013205877</author><pubDate>Mon, 13 May 2019 14:39:44 +0800</pubDate><description><![CDATA[ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'clang' failed with exit status 1

export LIBRARY_PATH=$LIBRARY_PATH:/usr...]]></description><category></category></item></channel></rss>