Python
——从入门到 PY 交易
其实我早就入门了。
其实我入门了好多次。
不过这次是我第一次真正写出来一个有点用处的脚本。
虽然最终租下房子还是中介提醒我可以预定了,这脚本没完全起效
事情起因是因为最近房子快到期了,所以考虑换一套。
由于有跟人合租的需求,所以想找一套两室一厅的。
在某租房网站上挑来挑去后,决定租 X 地的房子,于是和中介打好招呼,去看房。
结果到了地方,中介告诉我房子还在装修没法看,于是只好问了问详情,留了联系方式就走了。
没想到刚上地铁走了没两站,中介打电话告诉我房子可以看了,并且看中的几套中,有一套当天 50 分钟后就可以签约。
然而看中的几套中,有一套比这一套更喜欢的,所以告诉中介希望等等后面的房子。
结果就在这套房子可签约后的 20 分钟,房子被别人签走了,走了,了……
(该网站是线上签约,热门房子就看谁手速快)
虽然想要的并不是这套房子,但是痛定思痛,还是决定写个脚本实时监控想要的房子。
虽然我学的是 Java,但是 Java 本身运行比较吃内存,不够轻量级,所以我把目光转向 Python,一个我并不怎么会的语言。
思路如下:
- 如果网站是以 JavaScirpt 发起请求调用 JSON 获取房源数据的话,我直接解析 JSON 就很容易得到房子是否可签约。通过 JSON 获取数据例子:Apple Inc.预约新机时显示各店是否有新机是这种模式,常见于 Ajax 异步刷新使用的方式。不过我找了一圈,发现该网站不是这种类型,可能是 PHP 在后端调用接口直接把成品页面拼装好了直接返回给浏览器的;
- 直接抓取整个页面,通过寻找相关 Dom 节点获取所需数据,根据数据判断房子是否可以预定;
- 通过阿里大于,当房子可以预定时就给自己的手机发一条短信提醒;
- 定期执行该方法,准备随时获得最新信息。
具体代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| import httplib2.socks import top.api import sys import time from threading import Timer from lxml import etree
reload(sys) sys.setdefaultencoding('utf8')
alidayuUrl = 'gw.api.taobao.com'
alidayuPort = '80'
alidayuTemplet = "SMS_12345678"
alidayuSign = "贰浩次元"
alidayuTel = "1**********"
class PageClass: def getPage(self, url): http = httplib2.Http() response,content = http.request(url,'GET') return content
def getURL(filepath): input = open(filepath, 'r') cites = input.readlines() return cites
def zhaofangzi(): urls = getURL('url.txt') for url in urls: print "url:",url page = PageClass() content = page.getPage(url.strip())
tree = etree.HTML(content) hyperlinks = tree.xpath(u'//div[@class="room_btns clearfix"]/a') for index,hyperlink in enumerate(hyperlinks): if index > 1: break btnId = hyperlink.get('id') yudingFlg = False if index == 0: if btnId == 'zreserve': yudingFlg = False else: yudingFlg = True elif index == 1: if btnId == 'toYuding': yudingFlg = True
if yudingFlg == True: title = tree.xpath(u'//div[@class="room_name"]/h2')[0].text.strip() print "title:",title req = top.api.AlibabaAliqinFcSmsNumSendRequest(alidayuUrl, alidayuPort) req.set_app_info(top.appinfo('appkey', 'appsecret'))
req.extend = "" req.sms_type = "normal" req.sms_free_sign_name = alidayuSign req.sms_param = "{housename:'"+title+"'}" req.rec_num = alidayuTel req.sms_template_code = alidayuTemplet try: resp = req.getResponse() print (resp) except Exception, e: print (e) print "end" return True
if __name__ == "__main__": while zhaofangzi(): print 'now time:'+time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+'. waiting for 15 min' t = Timer(60 * 15, zhaofangzi) t.start() t.join()
|
实际操作及运行中遇到的问题如下:
- 乱码问题。不同的机器上运行,有的抓取页面时会出乱码,有的不会出,这个比较头疼,会直接影响到运行结果,最终也没解决这个问题
(反正房子已经订好了);
- 做这个脚本的时候实际没有监控到「XX:XX 可预订」按钮的信息,实际上之后的某个版本做了,但仍然卡在乱码的问题上,最终还是放弃了。
一张效果图