python
yugu2day
这个作者很懒,什么都没留下…
展开
-
Scrapy logging日志重复输出的解决方法
如果是完全在scrapy流程中的日志,一般有三种输出方式。from scrapy.log import loggerlogger.info("info")# 会抛出warning,警告scrapy.log已经被废弃,此时的logger为 scrapy.log# ScrapyDeprecationWarning: Module `scrapy.log` has been depreca...原创 2020-04-08 19:08:18 · 1784 阅读 · 6 评论 -
python sorted函数自定义排序
一般使用sorted函数的时候,直接会将key设置为一个lambda表达式的匿名函数。这样一般可以直接对字典的key或者value进行排序。但是今天刷leetcode的时候,需要对字典value的数组进行逐一排序,当value一致时,按key的字母顺序排序。这时候就需要自定义比较方法了。通过functools中的com_to_key将一个函数转变为参数key的值。https://leetco...原创 2020-03-01 15:14:14 · 1522 阅读 · 0 评论 -
在linux服务器上搭建mitmproxy
pip install mitmproxymitmdump --listen-host 0.0.0.0 -p 5555如果服务器与手机不在同一局域网,确定手机能连通服务器的情况下,启动mitmproxy时增加–set block_global=false...原创 2019-12-14 16:58:17 · 1085 阅读 · 0 评论 -
Python装饰器之lru_cache
在流畅的Python里看到的,做一下笔记。在运行一些比较耗时的函数,如递归时重复计算相同参数的函数时。通过python自带的装饰器functools.lru_cache可以将函数结果保存起来,作为缓存在重复计算时直接返回结果。减少函数运行的时间。以斐波那契数列的递归为例,首先实现一个递归的斐波那契方法:def fib(n): if n < 2: return n...原创 2019-03-20 19:46:42 · 694 阅读 · 0 评论 -
Python的增量赋值
对于python来说,a=a+b 和a+=b的区别是什么。增量赋值运算符+=和*=的表现取决于第一个操作对象。实际上会调用对象的__iadd__和__imul__方法,当该方法未实现的时候会调用__add__和__mul__方法。而对于可变对象一般都实现了__iadd__和__imul__方法。所以对于不可变对象来说两种方式并没有区别,而可变对象的增量赋值则会在原地进行操作,因此图中的数组的内...原创 2019-03-19 17:19:14 · 1001 阅读 · 0 评论 -
【爬虫】一道爬虫面试题
最近在群里看到老哥提到这题面试题,刚好有关js的混淆。自己撸一下思路怎么做。http://shaoq.com:7777/exam这里第一行的字除了python和题都是由css给span标签设置的style。直接对这个地址进行访问的话,返回的内容只是设置了5.5秒后进行了一次地址的重定向。并对cookie进行了一次设置所以可以通过session保存cookie后重复访问这一链接,但是...原创 2019-03-14 15:44:25 · 1211 阅读 · 0 评论 -
Python日志分级别输出到不同文件
思路:为logger设置2个handler,再对2个handler设置不同的filter进行日志过滤。通过supervisor管理项目时,会有stdout和stderr两种日志路径的设置方式,通过给一个logger设置2个StreamHandler后,分别对handler设置日志级别的过滤,实现日志的分级输出。import loggingimport syslog = logging.g...原创 2019-03-08 19:25:51 · 7657 阅读 · 1 评论 -
Python对序列使用 * 需要注意的地方
以列表为例,在初始化列表的时候我们可以用 * 来复制元素。arr = [0]*3 #此时arr为[0,0,0]arr2 = [[0]]*3 #此时arr2为[[0],[0],[0]]此时arr和arr2中每个元素的内存地址都是相同的,又因为列表为Python中的可变对象。所以对arr2中的一个元素进行list操作时,会影响到其他元素。因此在使用*进行列表的初始化时需要注意列表中...原创 2019-02-13 10:56:31 · 337 阅读 · 0 评论 -
(二)Scrapy的初始化
初始化一个scrapy项目时往往是通过startproject 和 genspider两个命令。了解scrapy进行命令输入时的逻辑是怎样实现的之后,我们可以看看commands文件夹下这两个命令是如何运行的。(1) startproject当我们新建一个项目时通过scrapy startproject <project_name> [project_dir] 命令实现。输入...原创 2019-04-03 21:07:29 · 1271 阅读 · 0 评论 -
(四)Scrapy的抓取流程——Engine
上一篇提到在Crawler的crawl方法中,启动了Engine。而如Scrapy流程图中描述的,抓取的流程由Engine主导完成。engine是ExecutionEngine的实例,初始化时会初始化诸如scheduler、downloader、scraper(itempipeline和spidermiddleware这一块)等属性。engine.py所在的目录,抓取流程中的主要模块。E...原创 2019-04-10 20:41:27 · 994 阅读 · 0 评论 -
(五)Scrapy的抓取流程——Scheduler
在Engine中,是通过Engine实例化的slot对象进行对scheduler对象的初始化,和任务状态的记录。# engine.py中ExecutionEngine的crawl方法def crawl(self, request, spider): assert spider in self.open_spiders, \ "Spider %r not opened w...原创 2019-04-11 20:04:33 · 2697 阅读 · 0 评论 -
(一)Scrapy的命令行
最近一直都是在用自己写的抓取框架做爬虫,还是系统的整理一下Scrapy相关的知识,做一个old school 的爬虫。爬虫的整个流程,就是发送网络请求,处理返回的内容两个过程。然后我们将这个流程细化;如何准备需要访问的链接,需要访问的链接应该是哪些链接;发送请求时我们带上什么,如何更快的发送更多请求;对返回的内容需要做哪些操作……不讲实例,只看实现。从Scrapy的源码来读Scrapy到底是如...原创 2019-04-02 20:12:36 · 6017 阅读 · 0 评论 -
(三)Scrapy的抓取流程——CrawlerProcess
上一章提到scrapy的启动是通过ScrapyCommand对象中的crawler_process实现的,crawler_process是通过crawler.py下的CrawlerProcess类创建的实例。该文件下定义了Crawler,CrawlerProcess和CrawlerRunner三个类。CrawlerProcess是CrawlerRunner的子类,而命令文件中的self.craw...原创 2019-04-09 20:25:33 · 5756 阅读 · 0 评论 -
(六)Scrapy的抓取流程——Downloader
当通过Scheduler取出一条request之后,engine就会调用_download方法进行对这条request的下载。图中downloader的fetch方法就是下载器对request的操作方法。通过DownloaderMiddlewareManager在download方法中定义了process_request, process_response, process_excepti...原创 2019-04-26 19:44:23 · 452 阅读 · 0 评论 -
【Pyppeteer】ConnectionError:Connection is closed解决办法
想着用Pyppeteer写一个渲染web页面的接口,测试的时候发现过不了多久。常驻的browser在newPage()创建的时候就会报错。一直提示Connection is closed。这种情况应该也适于其他连接异常的情况。出现这种情况的原因是建立连接是通过websocket库,而websocket连接默认过期时间是20s,所以经过20s后连接断开也就无法控制浏览器了。解决方法:在...原创 2019-04-18 15:04:29 · 9480 阅读 · 0 评论 -
Python过滤字符串中的unicode乱码
最近获取到的字符串里除了正常的汉字字符外,有一些unicode的乱码在里面显示异常。 我是憨憨因此想要过滤掉这些显示异常的字符。str = eval(str.__repr__())可以通过repr获取raw string,进行正则匹配替换。这样就将字符串中的乱码unicode过滤掉啦!~...原创 2019-08-01 20:16:37 · 7202 阅读 · 0 评论 -
【supervisor】启动时报错Error: Another program is already listening on a port...
当启动supervisor时报错$ supervisord -c supervisord.confError: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before startin...原创 2019-02-27 16:44:57 · 3110 阅读 · 0 评论 -
Python不可变的映射类型MappingProxyType
Python中的字典是可变的,当需要某个映射关系不能被修改时。可以通过MappingProxyType创建不可修改的映射实例。from types import MappingProxyTyped = {'a':1, 'b':2}d_view = MappingProxyType(d)当对d_view的键值进行修改时,会报错。...原创 2019-01-17 19:25:37 · 2579 阅读 · 0 评论 -
python 将图片转换为字符串
通过PIL库进行操作,将图片中每个像素与字符集中的元素进行一一对应,实现将图片转换为字符串的效果。实现后的效果: 首先导入Image模块,用于对图像进行操作,并创建字符库用于替换,从字符的密集进行排序from PIL import Image#创建用于替换的字符集chs = list('''$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]原创 2017-11-27 16:33:53 · 3961 阅读 · 0 评论 -
《用Python写网络爬虫》读书笔记
【builtwith】 pip install builtwith 分析网站使用的技术 import builtwith builtwith.parse(url)【whois】 pip install python-whois 通过WHOIS协议查询域名的注册者 import whois whois.whois(‘baidu.com’)【urllib】urllib2在pytho原创 2018-01-25 09:54:06 · 1670 阅读 · 0 评论 -
基本排序算法(Python实现)
Python列表基本排序算法1.选择排序在每次循环中将剩下未排序的最小值交换到未排序的最前一位。def selectionSort(lyst): for i in range(0, len(lyst) - 1): minIndex = i for j in range(i + 1, len(lyst)): if lys原创 2018-02-03 16:38:37 · 349 阅读 · 0 评论 -
【爬虫】Python使用requests爬取代理IP并验证可用性
在编写爬虫的过程中为了避免IP地址被Ban掉,可以通过抓取IP代理后,通过代理IP进行对网页的访问。网络上有很多提供免费代理IP的网站,我们可以选择西刺进行代理IP的爬取并存储到csv文件中,并通过多进程来验证爬取IP的可用性。http://www.xicidaili.com/就提供了很多免费的代理IP。通过requests和lxml进行网页的爬取和解析。 在爬取之前我们首先设置请求头,...原创 2018-03-08 15:12:30 · 9037 阅读 · 0 评论 -
【爬虫】使用Selenium爬取腾讯漫画
目标:以自动下载指定漫画的最新一话为例,或下载某部指定漫画。 思路:因为在漫画页内漫画图片地址是动态加载出来的,因此选用Selenium进行浏览器的模拟操作,处罚js行为进行地址的加载。再获取到图片地址后进行下载。每部漫画的地址都是有一个固定的id,可以直接请求指定漫画的详情页。ROOT_URL = "http://ac.qq.com"TargetUrls = [ ROOT_U...原创 2018-03-14 11:59:01 · 8549 阅读 · 5 评论 -
虚拟环境下的Pip引用外部环境的解决方法
今天用python -m venv venv生成虚拟环境venv 通过venv\scripts\activate 激活并进入虚拟环境后,通过pip list发现已经安装了和外部相同的包。 通过 pip -V命令发现pip命令的路径为C盘环境变量的路径。 此时可以通过 venv\scripts\python -m pip -V 或 venv\scripts\pip -V 指定pip命令的路径。...原创 2018-04-24 15:07:45 · 2980 阅读 · 2 评论 -
Centos7 Flask+gunicorn+nginx+supervisor 简单配置
Nginx 监听的端口收到来自客户端的请求,根据配置文件转发给WSGI WSGI调用flask框架生成对应路由的html,发送给Nginx Nginx将响应发送给客户端【Nginx】 1.安装 yum install nginx2.修改配置文件server { listen 80; server_name _; # 外部地址 ...原创 2018-06-13 11:40:09 · 617 阅读 · 0 评论 -
zlib和gzip的压缩比较
背景:压缩网页html文档并存储,压缩后能够减少数据库的负担思路:使用python自带的zlib或gzip进行字符串内容的压缩使用:压缩等级越高,所用时间越长1. zlib(默认压缩等级为6)@time_countdef zlib_compress(): res = zlib.compress(html.encode()) print('zlib压缩后%d' %...原创 2018-06-26 12:07:40 · 14624 阅读 · 3 评论 -
python selenium带插件启动
from selenium import webdriveroptions = webdriver.ChromeOptions()options.add_extension("xxx.crx")browser = webdriver.Chrome(chrome_options=options)原创 2018-06-20 15:37:41 · 3257 阅读 · 0 评论 -
Pandas修改csv文件某一列的值
将本来存为 省名 城市名 的字段修改为只有城市名 1. 通过pandas读取csv文件 2. 获取某一列的值并进行类型转换 3. 通过apply方法中的匿名函数进行数据的处理 4. 输出到原始文件中import pandas as pddata = pd.read_csv('price.csv',encoding='utf-8', )data[u...原创 2018-07-11 16:52:27 · 51386 阅读 · 5 评论 -
python简单的异步编程 concurrent.futures
concurrent.futures 简单的异步编程 自从知道了这个,已经忘了threading,multiprocessing怎么用。文档:https://pythonhosted.org/futures/简单的用法,首先Executor作为抽象类,而ThreadPoolExecutor和ProcessPoolExecutor为它的子类分别用来创建线程池和进程池。Executor三...原创 2018-09-06 12:47:36 · 478 阅读 · 0 评论 -
Python使用opencv 时 ImportError: DLL load failed: 找不到指定的模块
开发环境 windows7 + python3.6在安装opencv-python后导入cv2时报错ImportError: DLL load failed: 找不到指定的模块。网上的教程有下载Visual C++ Redistributable for Visual Studio 2015解决,有将python3.dll放入文件夹下解决,也有通过wheel文件进行下载的。尝试了这些方法后都...原创 2018-10-17 12:11:58 · 3158 阅读 · 1 评论 -
Message: 'chromedriver' executable needs to be in PATH的处理
下载与chrome对应版本的chromedriver,解压后放入chrome的文件夹下,并将该路径添加到环境变量。如:C:\Program Files (x86)\Google\Chrome\Application下载地址添加环境变量后仍然没有用的情况下,将chromedriver 放入python解释器目录下。如虚拟环境下的venv/Scripts...原创 2018-10-26 16:29:12 · 484 阅读 · 0 评论 -
pyenv安装python版本BUILD FAILED
今天在一台服务器上安装python版本时,一直报错BUILD FAILED。这种情况可以下载python安装包后离线运行当pyenv install时会在.pyenv/cache文件夹下查看对应版本的Python安装包是否存在,因此可以按照先前的下载地址在该文件夹下加载好安装包。wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0...原创 2018-11-28 15:42:40 · 3089 阅读 · 2 评论