【实战】 python爬取链家北京在售二手房数据(一)

1.背景

上次通过stata爬取了教育部的政策文件数据,大概了解了爬取数据思路以及正则表达式方面的知识。

但是,用stata在清洗时确实比较费力。

这不,前段时间安装了stata 16,新功能(官方介绍New in Stata 16)中有个比较亮眼的功能,

就是可以在stata中写python语句,调用python的包进行数据处理,

这就给了很大动力去学习python爬虫,

这样的话,就可以实现python爬取数据,再用stata进行处理分析,用stata和python结合出报告啦~

想想都激动呢~

因此,以链家北京在售二手房数据为例,花了2天时间学习并爬取了共84278条数据~

2.学习过程

  • 找学习帖子:找了不少帖子也看了不少python爬取链家数据的帖子,有的要么太简单,有的要么没有注释,完全不知道思路,最后找到了这篇学习帖子:python爬取链家网的房屋数据

  • 准备工具:随便度娘就可以实现;

    • 下载好python3;
    • 下载好sublime3;
    • 在sublime 3中进行配置,可以执行运行python;
    • 安装chrome浏览器及Xpath插件;
  • 学习过程

    • 按照学习帖子,将帖子中的代码一行一行敲下来;
    • 然后,一段一段地去理解和运行,不懂就度娘;
    • 因为学习帖子里是爬取二手房交易数据,而需求是爬取二手房在售数据,所以,在理解代码之后,根据需求调整修改代码;
  • 经过上述过程,最后得到了爬取链家北京在售二手房数据的代码,代码如下:

    3. 代码

    正如帖子里所述,爬取思路主要是,

    先获得每个房屋的链接,再对每个房屋页面内的数据进行提取,

    本帖子就先放出获得每个房屋的链接的代码:

    # 获取链接html,urllib.request.urlopen
    import urllib.request
    # 取消证书验证
    import ssl 
    # 解析html,xpath
    from lxml import etree
    # 正则表达式,re.findall
    import re
    # 线程
    import threading
    
    
    # 全局取消证书验证
    ssl._create_default_https_context=ssl._create_unverified_context
    
    # 获取页面
    def get_page(url):
      page=urllib.request.urlopen(url)
      html=page.read().decode('utf_8')
      return html
    
    # 获取当前的总页数
    def get_page_num(url):
      try:
          html=get_page(url)
          pagenum=re.findall(r'"totalPage":(.+?),"curPage"',html)[0] #只保留括号里面的内容
      except:
          pagenum=0
      pagenum=int(pagenum)
      return pagenum
    
    # 获取当前页所有房子的url
    def get_house_url_current_page(url):
      # flag='' 
      list_house_url_current_page=[]
      try:
          html=get_page(url)
          selector=etree.HTML(html)
          house_url_list_li=selector.xpath('/html/body/div[4]/div[1]/ul/li') #修改
          for li in house_url_list_li:
              house_url=li.xpath('div[1]/div[1]/a/@href')[0] #修改
              list_house_url_current_page.append(house_url)
      except:
          pass
      return list_house_url_current_page
    
    
    # 获取某个区所有的房屋url
    def get_house_url_current_distric(district_url_list):
      list_house_url=[]
      for district_url in district_url_list:
          pagenum=get_page_num(district_url)
          if pagenum==0:
              print('----------')
              pagenum=get_page_num(district_url)
              print(pagenum)
              print(district_url)
              print('++++++++++')
          elif pagenum==1:
              print(pagenum)
              url=district_url
              print(url)
              list_house_url_current_page=get_house_url_current_page(url)
              list_house_url.append(list_house_url_current_page)
          elif pagenum>1:
              for i in range(1,pagenum+1):
                  print(pagenum)
                  url=district_url.strip('*/') +'pg'+str(i)
                  print(url)
                  list_house_url_current_page=get_house_url_current_page(url)
                  list_house_url.append(list_house_url_current_page)
          else:
              pass
    
      # 把所有的url拼接成字符串,便于写入本地
      str_url=''
      for row in list_house_url:
          for url in row:
              str_url+=url+'\n'
      return str_url
    
    # 把url写到本地
    def write_house_url(write_str,district):
      path_file='C:/study/实战/python/data/zaishou/'+district+".txt" #修改
      with open(path_file,'w') as file:
          file.write(write_str)
    
    # 组合所有区的搜索条件url
    def get_search_url_all_district():
      district_url=['https://bj.lianjia.com/ershoufang/dongcheng/',
      'https://bj.lianjia.com/ershoufang/xicheng/',
      'https://bj.lianjia.com/ershoufang/chaoyang/',
      'https://bj.lianjia.com/ershoufang/haidian/',
      'https://bj.lianjia.com/ershoufang/fengtai/',
      'https://bj.lianjia.com/ershoufang/shijingshan/',
      'https://bj.lianjia.com/ershoufang/tongzhou/',
      'https://bj.lianjia.com/ershoufang/changping/',
      'https://bj.lianjia.com/ershoufang/daxing/',
      'https://bj.lianjia.com/ershoufang/yizhuangkaifaqu/',
      'https://bj.lianjia.com/ershoufang/shunyi/',
      'https://bj.lianjia.com/ershoufang/fangshan/',
      'https://bj.lianjia.com/ershoufang/mentougou/',
      'https://bj.lianjia.com/ershoufang/pinggu/',
      'https://bj.lianjia.com/ershoufang/huairou/',
      'https://bj.lianjia.com/ershoufang/miyun/',
      'https://bj.lianjia.com/ershoufang/yanqing/']
    
      # 组合搜索
      # 面积
      search_area=['a1','a2','a3','a4','a5','a6','a7','a8']
      # 价格
      search_price=['p1','p2','p3','p4','p5','p6','p7','p8']
    
      # 组合搜索条件url 
      search_url=[] 
      for url in district_url: 
          url_list=[] 
          for area in search_area: 
              for price in search_price: 
                  url_=url+area+price+'/'
                  url_list.append(url_) 
          search_url.append(url_list) 
      return search_url
    
    def main(index): 
      list_district=['dongcheng','xicheng','chaoyang','haidian',
      'fengtai','shijingshan','tongzhou','changping','daxing',
      'yizhuangkaifaqu','shunyi','fangshan','mentougou',
      'pinggu','huairou','miyun','yanqing']
      district=list_district[index]
      search_url=get_search_url_all_district()
      district_url_list=search_url[index]
      write_str=get_house_url_current_distric(district_url_list)
      write_house_url(write_str,district)
    
    if __name__=='__main__':
      # 根据需求调节线程数
      for index in range(0,17):
          thread=threading.Thread(target=main,args=(index,))
          print(threading.active_count())
          thread.start()
    

4. 结果

每个区所有链接.png

预告:
【实战】 python爬取链家北京在售二手房数据(二)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,529评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,015评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,409评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,385评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,387评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,466评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,880评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,528评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,727评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,528评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,602评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,302评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,873评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,890评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,132评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,777评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,310评论 2 342