macOS Catalina 10.15 升级 mongodb-community 4.2 报错及解决方案

每次系统大升级,都会有些生产力工具出问题,所以这次Mac升到macOS Catalina 10.15(19A583),心里早有些准备。 果然,MongoDB启动不了了。 莫不是因为系统升级到了macOS 10.15,不兼容MongoDB?那升级软件呗。 brew update && brew upgrade && brew cleanup 升不动呀。 原来因为种种纠葛(这又是另外一篇故事了),MongoDB不再开源,故HomeBrew已将其移出。具体可以看这里:https://github.com/Homebrew/homebrew-core/pull/43770 那怎么办? 参考官方给出的解决方案:https://github.com/mongodb/homebrew-brew 先卸载老版本: brew services stop mongodb brew uninstall mongodb 再安装mongodb-community: brew tap mongodb/brew brew install mongodb-community 启动: brew services start mongodb-community 命令一气呵成,这下成了吧? 哈? 哈??? 再看看mongo是否启动了。以下两条命令都可以。 nc -zvv localhost 27017 ps -ax | grep mongo $ nc -zvv localhost 27017 […]

Python queue 类 实现元素唯一性的方法

queue 是 python 内置的轻量级的多生产者、多消费者消息队列模块,小巧玲珑,安全好用。 queue 模块好是好,就是入队时不支持检测元素的唯一性。比如我的爬虫有一组URL,或者ID,重复的数据就没必要再放入队列。如果在多线程中直接操作,过程不可控,很容易出问题。 查询资料,CSDN 上有解决方案(原文点这),通过修改 queue 模块的源代码,在put方法中增加一个unique参数,依据此参数是否为 True ,在底层的 deque 中判断将要加入的元素是否存在,以此实现检测元素唯一性的功能。 试之,可行。 具体过程如下: 首先找到 python 内置函数 queue 模块的位置: 位置如下: 通过以上路径,找到 queue.py 文件 ,修改以下代码: def put(self, item, block=True, timeout=None, unique=False): with self.not_full: # —– 以下三行为新增代码 —–# if unique: if item in self.queue: return # —– 新增代码结束 —–# if self.maxsize > 0: if not […]

Mac Python3 Matplotlib中文方框乱码解决方案

在macOS Mojave 10.14上,使用Python 3.7的绘图库Matplotlib 3,当输出中文时遇到方框形乱码。 Google了一下,找到不少方法,有安装字体的,有更改配置的,有自己写方法的。看了一下这些方法,要么太复杂,要么升级后还要重新弄,都不太满意。 继续搜索发现,造成Matplotlib中文乱码是因为Mac下没有SimHei字体库,需要下载SimHei字体,再配置Matplotlib。 如果我们找到Mac里支持中文的字体,然后在Matplotlib里设置为默认,也就不需要再下载了。 运行以上代码,可以发现Mac上有很多字体可供使用,我们找到Arial Unicode MS,设置为Matplotlib的默认字体即可。 我们更改Matplotlib的默认字体: 通过以上两行代码,不用其他任何修改,即可正常显示中文。

python爬虫抓取易方达指数基金网数据的一些实践

易方达指数基金网(http://www.indexfunds.com.cn)是中国最早的指数和指数基金研究网站,2012年8月份就上线了。 易方达指数基金网使用的是wind的授权数据,其免费、简洁、强大,是深受保险、券商、社保等机构投资者,基金代销机构的理财经理,基金持有人,指数领域从业者,财经记者,研究分析人员等各路人马好评的神器。 我们怎么用python爬虫把有用的公开数据抓取下来,用来自己研究呢? 我们先来看看这个网站。选择「指数分区」。 以「沪深300」指数基金为例,曲线图上展示的数据有:指数名称、指数代码、某日价格、较前日涨跌、日期,这就是我们想要的数据。 怎么得到我们想要的数据呢? 在调试工具的Network里找到文件 http://static.indexfunds.com.cn/market/ifs/000300.SH_cy_nv.js ,这是2018年往后的数据,其数据格式为: http://static.indexfunds.com.cn/market/his/ifs/000300.SH_all_nv.js 这是基金成立之日起,至2017年年底的数据。两个文件的内容相加,即为全部数据。 我们观察数据‘20180102_4087.4012_0.014028’,很明显,「20180102」为日期,「4087.4012」为价格,「0.014028」为涨跌。 那么,我们只需要找到指数基金对应的文件,就可以解构出所需的数据了。 核心代码: #传入url,获取指数详情 def getFundInfo(url): fundinfo=[] headers = { ‘User-Agent’: random.choice(USER_AGENTS), } response = requests.request(“GET”, url, headers=headers) s=response.text.split(‘[‘)[-1]#字符串分割,将=号后面的内容保存下来 s = s.split(‘]’)[0] s=s.replace(“‘”, “”)#去掉字符串本身的引号 data = s.split(‘,’)#按逗号将str数据转为list for i in data: time=i.split(‘_’)[0]#时间 price=i.split(‘_’)[1]#价格 change=i.split(‘_’)[-1]#涨跌 fundinfo.append({‘时间’:time,’数值’:price,’涨跌’:change }) return fundinfo 还有两个问题,怎么获取指数基金对应的文件? 200多个指数基金代码,又怎么获取? 第一个问题,很简单,可以这样构造文件的url地址: url1 = ‘http://static.indexfunds.com.cn/market/his/ifs/’ […]

Python爬虫抓取透明房产网房源信息

闲来无事,想看看成都透明房产网(esf.cdfgj.gov.cn)的房源信息。 成都透明房产网的主办单位是成都房地产信息档案中心(成都市城乡房产管理局直属单位),运营机构和技术支持是成都房联电子信息有限公司。成都透明房产网是房管局的公示平台,其产权性质、备案价格等信息相对可靠,但更新较慢。 可以看到,网页代码的结构还是比较简单,哪些信息是有价值的呢? 最有价值的肯定是房源的均价和总价了,其他信息比如区位、面积等其次。 下面直接开干,爬虫的大概思路是,先获取总页码,开多线程,取出页码获取房源,存储。 以下为主要部分源码: #获取成都透明房产网信息 def get_cdfgj(page): url = “http://esf.cdfgj.gov.cn/search” querystring = {“page”:page} headers = { ‘Accept’: “text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8”, ‘Accept-Encoding’: “gzip, deflate”, ‘Accept-Language’: “zh-CN,zh;q=0.9,zh-TW;q=0.8”, ‘Cache-Control’: “no-cache”, ‘Connection’: “keep-alive”, ‘Host’: “esf.cdfgj.gov.cn”, ‘Upgrade-Insecure-Requests’: “1”, ‘User-Agent’: random.choice(USER_AGENTS), ‘page’: str(page), } try: response = requests.request(“GET”, url, headers=headers, params=querystring) except: print(‘无法打开链接’) return [] response.encoding = response.apparent_encoding # 编码 soup […]

Python程序给宝宝起名?

出于好玩,想用Python程序给小孩起名。 思路是这样的,先穷举出全部常用汉字,生成单字名及双字名,将生成的名字放到「姓名测试网站」进行打分,按得分对名字进行排序,以便筛选。 具体实施起来有几个关键点: 1、常用汉字的生成 python3生成汉字,这儿有两种思路,一种是生成Unicode编码的全部汉字,共计20927个。 ming_list=[] for i in range(0x4e00, 0x9fbf): ming=chr(i) 另一种是生成GBK2312编码的常用汉字,共计6763个。 ming_list=[] for i in range(0x4e00, 0x9fbf): ming=chr(i) try: ming_gb = ming.encode(‘gb2312’) # 汉字转 gb2312 ming_list.append(ming) except: pass 这里采用第二种方式,过滤掉不常用的生僻字。 2、提升程序效率 此处用多线程解决问题已经不好用了,6763*6763有45738169种组合,每秒完成3次请求,大概需要45738169/3/60/60/24=176.46天。 这么慢肯定接受不了,这里我们就要用到rabbitMQ和pika了。核心思想是,主程序只管分派任务,将45738169个名字分发下去,其他机器(窗口)从任务池里取任务并执行。这种思路的好处是,理论上机器可以无限增加,工作效率与机器数量成正比,各机器之间互不影响,某机器掉线不影响整体。 核心代码: 任务分发端: import pika print(‘send….start….’) for i in range(1000): connection = pika.BlockingConnection(pika.ConnectionParameters(‘localhost’))#任务分发 channel = connection.channel() channel.queue_declare(queue=’ming’,durable=True) channel.basic_publish(exchange=”, routing_key=’ming’, body=str(i), properties=pika.BasicProperties( delivery_mode=2, […]

自动打开的Chrome新标签页面如何抓包

在使用 python 爬虫过程中,我们常会用到开发者工具进行分析。在使用谷歌提供的 Chrome 开发者工具时,我遇到这样一个问题:点击A标签页面的某个按钮/链接,自动打开了B标签。此时,A标签的开发者工具捕捉不到任何数据,新打开的B标签又还没有打开抓包工具。怎么办?要么禁止打开B标签,所有页面必须在 A 标签内加载。理论上,在Console里自定义脚本即可实现,但我没有成功。要么打开B标签的同时,把开发者工具一起打开。这个方法最简单,在 Chrome 的Settings里稍加设置即可。 具体步骤见下图:

Mac OS系统使用crontab定时执行Python3程序的一些实践

Crontab用于自动执行周期性任务,比如,每天自动爬取最新的域名信息、房价信息等,不需要任何人工干预。 Crontab很强大,但是也有很多坑。我把一些命令,以及遇到的一些问题,写在这里。 添加任务: crontab -e 查看任务: crontab -l 命令格式: 常用命令: 每五分钟执行 */5 * * * * 每小时执行 0 * * * * 每2小时执行 0 */2 * * * 每天执行 0 0 * * * 每周执行 0 0 * * 0 每月执行 0 0 1 * * 每年执行 0 0 1 1 * 查看crontab最近日志: tail -f […]

python对mongodb数据库的基本操作:连接、增、删、改、查

1、插入数据 db.collection.insert(document) 在mongodb中插入数据,有 save和insert两个语句可以使用。其区别在于: 若新增的数据中存在主键且重复,insert() 会提示错误,而save() 则会更改原来的内容为新内容; insert可以一次性插入一个列表,不会遍历,效率高,save则需要遍历列表,分别插入。   2、 删除数据 db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } ) 参数说明: query :(可选)删除的文档的条件。 justOne : (可选)如果设为 true 或 1,则只删除一个文档。 writeConcern :(可选)抛出异常的级别。   3、更新数据 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参数说明: query : update的查询条件,类似sql update查询内where后面的。 update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为sql update查询内set后面的 upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。 multi : […]