天津所有的公产房的交易都要通过这个网站来摘牌挂牌,本人因为房屋交易的需要,想抓取这个网站每天的挂牌公产房信息。这对于python的老手来说根本就是个小case,但本人之前只是python学了个入门教程,手写了个抓svn提交数据的python脚本,怎么抓互联网的信息还没尝试过,不过码农的一个特质就是爱折腾嘛,尝试着从0开始,花了2个晚上的下班时间搞定。下面记录下关键步骤,希望对跟我有类似需求的同学有帮助。这里没有选择scrapy这种功能很全的抓取框架,我觉得需求没有那么复杂,搜了下用requests应该就足够了

1.确定要抓取信息的网站的真实地址并用代码能正确访问。

打开津房置换首页www.jfzh.com.cn,进入右下角服务E栈-->公产房摘挂牌公示(http://www.jfzh.com.cn/jf/gongfang),然后你会看见几个按钮,点击第一个“挂牌期间显示”,会看到出来个小窗口,里面显示着挂牌出售的公产房的信息,每22s会刷新一次。 在这个小窗口按F12,能在标题栏看到它的真实地址www.jfzh.com.cn:8018/guapaiqijianxianshi.aspx。但是你如果在python里面直接requests.get这个地址,是会报错的。在http://www.jfzh.com.cn/jf/gongfang页面按F12,看了下“挂牌期间显示”这个按钮的源码,就是一个很简单的window.open函数。python之所以直接get会无法访问应该是请求的header里少了cookie或者其他的信息,所以想抓个包看看少哪些东西,但是chrome的F12在点击“挂牌期间显示”之后根本看不到什么内容:

无奈正准备下个专门的抓包软件,忽然又想到还有个默认的ie(win10叫edge),死马当活马医试试看吧。这个时候不得不说微软立功了!在这一刻它是比google的chrome好用的:

其实两个浏览器的F12功能都是差不多的,但是edge这个看起来更好看一些,而且点击按钮后真能抓到东西,这个时候你就能看到guapaiqijianxianshi.aspx的GET请求里真的有cookie,这些cookie是访问Default.aspx带回来的。当你访问http://www.jfzh.com.cn/jf/gongfang时,它里面内置了一个http://www.jfzh.com.cn:8018/Default.aspx,所以你先get Default.aspx,然后再get guapaiqijianxianshi.aspx,就能正确地访问了。搜了一下,python的requests已经很贴心的给程序员准备了session这个类来自动处理cookies,所以我们只需要下面3行代码就能获取到网页内容了:

session = requests.session()
session.get("http://www.jfzh.com.cn:8018/Default.aspx")
eg = session.get("http://www.jfzh.com.cn:8018/guapaiqijianxianshi.aspx")
print eg.text

2.解析html

有了内容之后,就要考虑怎么解析html了。python也一样提供了很多选择,比如BeautifulSoup,lxml等等,最后我还是选了自带的HtmlParser,简单就是美嘛。定义了一个HtmlParser的子类:

class MyHTMLParser(HTMLParser):def __init__(self):HTMLParser.__init__(self)self.curHouse = Noneself.flag = 0self.houseList=[]self.exist=0

curHouse是用来存储一个房屋的信息的,houseList就是存所有房屋信息的集合,flag是生成房屋信息的时候用得上,exist稍后再讲。HtmlParser是通过遍历start end标签和中间的data来处理html的,如果不知道怎么使HtmlParser的搜一下教程,一两分钟就能看明白,下面贴的代码根据津房置换返回的html内容就很容易明白是怎么回事:

    def handle_starttag(self, tag, attrs):if tag == "tr" and self._attr(attrs,"valign") == "Middle":print "--------------------------------------------"self.flag = 1self.curHouse = HouseInfo()def handle_data(self, data):if self.lasttag == "b" and self.flag > 0:#print("Encountered some data  :", data)if self.flag == 1:self.curHouse.district=dataif self.flag == 2:self.curHouse.address=dataif self.flag == 3:self.curHouse.floor = dataif self.flag == 4:self.curHouse.houseType = dataif self.flag == 5:self.curHouse.ownerType = dataif self.flag == 6:self.curHouse.area = dataif self.flag == 7:self.curHouse.direction = dataif self.flag == 8:self.curHouse.price = dataif self.flag == 9:self.curHouse.moveoutTime = dataif self.flag == 10:self.curHouse.viewTime = dataif self.flag == 11:self.curHouse.picktime = dataif self.flag == 12:self.curHouse.device = dataif self.flag == 13:self.curHouse.loan = dataif self.house_exist(self.curHouse):print "maybe get a duplicate house:"self.exist += 1self.curHouse.toString()else:print "get a new house:"self.curHouse.toString()self.houseList.append(self.curHouse)self.flag += 1

有个细节注意下,HtmlParser处理&nbsp这种空格符好像有问题,会直接跳过,没找到很好的方法来解决,所以把html中的nbsp都替换了:

str = eg.text.replace("<b>&nbsp;</b>", "<b>none</b>")

3.定时向网站发起请求

一次请求只能获得4个房屋信息,要想获得所有的,需要每隔一段时间就请求一次,浏览器是每22s刷新请求一次,代码保险起见弄了个30s,至于定时器python又有很多选择(库实在是太丰富了),最后根据简单满足需求的原则,用threading的timer:

def handle_request(session,parser,fileName):now = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S')f = codecs.open(fileName, "a", 'utf-8')try:sys.stdout = fprint "handle request at", now# session = requests.session()# session.get("http://www.jfzh.com.cn:8018/Default.aspx")eg = session.get("http://www.jfzh.com.cn:8018/guapaiqijianxianshi.aspx")str = eg.text.replace("<b> </b>", "<b>none</b>")parser.feed(str)finally:f.close()if(parser.exist<5):timer = Timer(30, handle_request,[session,parser,fileName])timer.start()

刚才提到的exist,就是用来判断什么时候退出循环请求的。因为每30s请求一次房屋信息,房屋信息是滚动同步给浏览器的,若干次之后拿到的房屋信息肯定是跟之前的重复的,这里记录一个次数,当已存在的房屋数量小于5的时候,timer启动一个线程30s后执行,否则就直接退出了。最后请求到的房屋信息会保存到文件中,这里没有有logger,就是把stdout重定向到文件中。

用python抓取津房置换的房屋挂牌交易数据相关推荐

  1. Python 抓取软科中国大学排名首页数据

    文章目录 利用requests.BeautifulSoup.xlwings库抓取软科中国大学排名首页数据 (1)软科中国大学排名 (2)调用requests模块中get方法,get方法包括header ...

  2. 我用 Python 抓取《大秦赋》“相关数据”,发现了这些秘密......

    前言 最近,最火的电视剧莫过于<大秦赋了>,自12月1日开播后,收获了不错的口碑.然而随着电视剧的跟新,该剧在网上引起了激烈的讨论,不仅口碑急剧下滑,颇有高开低走的趋势,同时该剧的评分也由 ...

  3. 使用Python抓取猫眼近10万条评论并分析

    <一出好戏>讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘"这出好戏"到底如何? 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至 ...

  4. 电视剧《大秦赋》最近很火!于是我用Python抓取了“相关数据”,发现了这些秘密............

    前言 最近,最火的电视剧莫过于<大秦赋了>,自12月1日开播后,收获了不错的口碑.然而随着电视剧的跟新,该剧在网上引起了激烈的讨论,不仅口碑急剧下滑,颇有高开低走的趋势,同时该剧的评分也由 ...

  5. 《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?

    视频课程链接:https://edu.csdn.net/course/detail/9348 黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演阵容强大,相信许多 ...

  6. 《一出好戏》讲述人性,使用Python抓取猫眼近10万条评论并分析,一起揭秘“这出好戏”到底如何?...

    黄渤首次导演的电影<一出好戏>自8月10日在全国上映,至今已有10天,其主演阵容强大,相信许多观众也都是冲着明星们去的. 目前<一出好戏>在猫眼上已经获得近60万个评价,评分为 ...

  7. python代码案例详解-我用Python抓取了7000 多本电子书案例详解

    安装 安装很简单,只要执行: pip install requests-html 就可以了. 分析页面结构 通过浏览器审查元素可以发现这个电子书网站是用 WordPress 搭建的,首页列表元素很简单 ...

  8. python抓取头条文章

    python抓取头条美文并存储到mongodb # Author:song from multiprocessing import Pool from urllib.parse import urle ...

  9. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...

    微信:一个提供即时通讯服务的应用程序,更是一种生活方式,超过数十亿的使用者,越来越多的人选择使用它来沟通交流. 不知从何时起,我们的生活离不开微信,每天睁开眼的第一件事就是打开微信,关注着朋友圈里好友 ...

最新文章

  1. python 去除list 里面的重复元素
  2. Andorid 实现图片转成pdf的方法
  3. css超出一行添加省略号属性
  4. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
  5. mac python3.8上怎么安装pygame 第三方库_Python3.8安装Pygame Python3.8安装Pygame教程步骤详解...
  6. 【Breadth-first Search 】279. Perfect Squares
  7. silverlight 缺少对象错误
  8. 【Python】Python中的关键字
  9. 阿里云盘来袭,送几个福利码!手慢无!
  10. chart.js使用学习——混合图表
  11. 计算机磁盘坏道怎么隔离,小科普 | 硬盘坏道就凉凉?把它隔离出去吧!(DLC)...
  12. 张一鸣卸任字节跳动CEO
  13. 15-P-PCA从概率角度思考PCA主成分分析
  14. 【论文翻译】Semantic Relation Reasoning for Shot-Stable Few-Shot Object Detection
  15. 小学三年级另类语文题难住大学副教授(图)
  16. Finger.01 - ESP8266模块STA模式调试
  17. 泰坦尼克号第n遍重温泪点
  18. 【Linux进程概念】冯 诺依曼体系结构 操作系统 进程 fork 进程状态 优先级
  19. 从区块链到DAG(五)--DAG项目介绍IOTA和Obyte
  20. 百度前端训练营day2笔记

热门文章

  1. 02-23 决策树CART算法
  2. 上海有哪些值得加入的互联网公司?
  3. 欧姆龙, PLC CJ2M标准程序,一共控制12个伺服电机 ,气缸若干
  4. linux服务器模拟POST请求发送curl
  5. hive 字符串拼接函数
  6. 基于imx6的gt911触摸屏驱动移植
  7. LFM法实现的user item推荐系统
  8. SQL语句查看表结构和修改字段长度
  9. 大学vb考试必背题库
  10. post与get区别