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 […]

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 […]

自动打开的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爬虫抓取链家网二手房数据,绕过链家只显示前100页限制

最近用 python 爬虫抓取了链家网站二手房的数据,说一下大概思路和遇到的问题。 最开始,是在找链家提供的api。Requests虽然没有转基因,美丽汤也简洁美丽,但还是略显麻烦。 如果能直接找到json格式的数据,那自然最好,就不必再使用Requests+BeautifulSoup的组合来折腾了。 以链家成都二手房首页为入口,确实可以看到有api存在。 我激动得差点以为成功了,就这么简单? 但仔细一看,并不对,这个接口根本匹配不了当前页面显示的内容。 怎么办,只有祭出Requests+BeautifulSoup大法了。 这时候就遇到一个问题,链家只显示前100页数据,100以后的数据根本就不显示啊,又怎么办? 手动构造链接,把「pg100」改成「pg105」、「pg106」,没有效果。   不能硬来,我们选择分区。 先把首页的锦江、青羊、武侯、高新、成华、金牛等区拼音抓下来,然后按区分别去抓取房源。原则上,只要每个区的房源数量小于100*30套,就能抓取完。 抓取区的核心代码为: 如果某区数量大于3000,可以先抓100页,得到小区、片区名,然后按小区或者片区再去爬取。 其他内容,比方说Requests、BeautifulSoup的使用,链接的构造,USER_AGENTS的随机切换等,本文就不再介绍了,网络上有其他比我写得好的内容。 总结一下,链家网站其实对爬虫是很友好的,基本上只要你换个USER_AGENTS,程序跑慢点,他就不会 ban 你。 最后,贴一下跑出来的数据。

4声母.com.cn一口价域名、注册时间、价格

本列表内容为个人兴趣爱好而收集,所有信息根据互联网公开内容所得,侵权立删。 列表内容有一定时效性,且字段仅为4声母.com一口价域名、注册时间、现价,源代码各个版本已在上一篇内容公布。 khtt.com 注册日期: 2005年10月27日 价格:9688 抓取时间:2017-01-15 20:47:59 csjn.com 注册日期: 2005年04月14日 价格:9688 抓取时间:2017-01-15 20:48:00 bbqj.com 注册日期: 2005年03月12日 价格:9600 抓取时间:2017-01-15 20:48:01 dqff.com 注册日期: 2005年03月05日 价格:9600 抓取时间:2017-01-15 20:48:02 hhtb.com 注册日期: 2005年03月16日 价格:9600 抓取时间:2017-01-15 20:48:04 gxdp.com 注册日期: 2006年04月02日 价格:9600 抓取时间:2017-01-15 20:48:05 jhkz.com 注册日期: 2005年07月26日 价格:9588 抓取时间:2017-01-15 20:48:05 dlyb.com 注册日期: 2008年06月04日 价格:9588 抓取时间:2017-01-15 20:48:06 stzg.com 注册日期: 2007年02月12日 价格:9555 抓取时间:2017-01-15 […]

python爬虫:将域名列表按注册时间排序

工具不能提高生产力,那就不是生产力工具,那就可以果断弃之。 断断续续的学习python,根据网络上的教程做了些爬虫实验,无非也就是按别人的思路重新操作一遍,纵然成功,成就感也大打折扣,实用价值也并不高。 今天开始实现一个具体的、官方未给出解决方案的需求,把ename的竞拍列表按域名的注册时间排序。初步想到的是,先获取域名列表,把列表中的域名的whois信息逐个爬出来,根据注册时间再排序输出。 这里面应先实现的是,输入一个域名,将他的whois信息存入数组。这里面应该有很多问题,例如.com等国际域名和.cn等国别域名可能在字段上有差异,查询whois信息应使用哪家接口等。废话不多说,抿口咖啡先干起来。 (2017年1月14日14点16分) import urllib.request whois = urllib.request.urlopen(“http://whois.chinaz.com/linchun.org”) mybytes = whois.read() mystr = mybytes.decode(“utf8”) whois.close() print(mystr) #用chinaz的接口实现whois的查询 #易名接口:http://whois.ename.net/linchun.org 403错误,后续模拟浏览器来 #西部数码:http://www.west.cn/web/whois/whoisinfo?domain=linchun.org uft8编码错误 回头来修 import requests r = requests.get(url=’http://linchun.org’)  # 最基本的GET请求 print(r.status_code)  # 获取返回状态 r = requests.get(url=’http://linchun.org’, params={‘wd’: ‘python’})  # 带参数的GET请求 print(r.url) print(r.text)  # 打印解码后的返回数据 #使用第三方库requests import requests r = requests.get(url=’http://whois.chinaz.com/linchun.org’)  # 最基本的GET请求 print(r.status_code)  # […]