前言:对于我们任何一个漂泊在外的打工者,租房似乎都是我们必经的一个经历,对于我们而言,选择性价比最高,最适合自己的房源至关重要,本文就将利用爬虫技术采集蘑菇租房网上指定的房源信息,后续可以利用这些信息进行机器筛选,比价等等,从而更加方便的找到自己心仪的房源。

爬虫第一步,找到目标网站,确定数据来源,我们打开蘑菇租房网,可以看到如下所示的界面

同样的,我们打开F12,查看network请求,可以看到它的数据直接在这个接口里返回的

分析网页,发现我们可以直接采用requests库请求获取网页数据,然后通过etree解析网页资源,获取我们想要的数据

首先是获取列表页的数据

  1. page = self.getPageCount()
  2. # page = 1
  3. page_link = self.pageurl.replace('@position',str(13))
  4. print(page)
  5. for offset in range(page):
  6. # 拼接URL
  7. pageUrl = page_link.replace('@page',str(offset))
  8. print(pageUrl)
  9. # 通过requests获取数据
  10. response = requests.get(url=pageUrl,headers=get_header())
  11. print(response.text)
  12. # html=response.content
  13. # html_doc=str(html,'utf-8')
  14. # 通过etree解析文档
  15. tree = etree.HTML(response.text)
  16. # 通过xpath提取链接
  17. links = tree.xpath('//div[@class="roomCardSmall-box"]//a/@href')
  18. print(links)
  19. names = tree.xpath('//div[@class="roomCardSmall-box"]//a/@title')
  20. types = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[1]/text()')
  21. desps = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[2]/text()')
  22. positions = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//p/text()')

因为列表页包含分页,所以需要先行获取分页数

  1. def getPageCount(self):
  2. req = requests.get(self.baseUrl,headers=get_header())
  3. print(req.text)
  4. tree = etree.HTML(req.text)
  5. # 通过xpath提取链接
  6. page = tree.xpath('//div[@class="pageBox"]/div[@class="page-box"]/span/text()')
  7. if(len(page)>0):
  8. return int(page[0][1:3])
  9. else:
  10. return 0

获取到列表页数据后,我们可以提取详情页的链接地址,对详情页的地址发起请求,获取并解析详情页的数据

  1. for i in range(len(links)):
  2. item = {}
  3. item['name'] = names[i]
  4. item['type'] = types[i]
  5. item['desp'] = desps[i]
  6. item['position'] = positions[i]
  7. link = links[i]
  8. req = requests.get(link,headers=get_header())
  9. html_doc = str(req.content,'utf-8')
  10. print(html_doc)
  11. tree = etree.HTML(html_doc)
  12. item['pay_type'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="type"]/text()')[0]
  13. item['pay_price'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/text()')[0]
  14. item['pay_price_unit'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/i/text()')[0]
  15. item['phone'] = tree.xpath('//div[@class="w460 room-call"]//div[@class="phone orange"]/text()')[0]
  16. data.append(item)
  17. time.sleep(random.random()*8)
  18. time.sleep(random.random()*8)

注意此处,我进行了随机延时操作,这是为了避免被网站的反爬虫策略识别到

获取到数据后我们还是老规矩,保存到Excel或者数据库

  1. # # 保存数据到excel文件
  2. def saveToCsv(self,data):
  3. wb = Workbook()
  4. ws = wb.active
  5. ws.append(['标题', '类型', '描述', '地理位置', '房租支付方式', '房租', '房租单位','手机号'])
  6. for item in data:
  7. line = [item['name'], item['type'],item['desp'],item['position'],item['pay_type'],item['pay_price'],item['pay_price_unit'],item['phone']]
  8. ws.append(line)
  9. wb.save('蘑菇租房_上海.xlsx')

至此,整个爬虫工作就算完成了,完整的代码如下,需要的自取,请记得安装第三方库如lxml,下篇文章我将介绍利用浏览器的插件进行无编程的爬虫

  1. import requests
  2. from lxml import etree
  3. from openpyxl import Workbook
  4. from myutils import get_header
  5. from selenium import webdriver
  6. from selenium.webdriver.common.by import By
  7. import time
  8. import random
  9. # 爬虫处理类
  10. # 目标网站 蘑菇租房:http://www.mgzf.com/list/qy13_
  11. class Spider:
  12. # 目标网站列表页的基本链接
  13. baseUrl = 'http://www.mgzf.com/list/qy@position_'
  14. pageurl = 'http://www.mgzf.com/list/pg@page/qy@position_/?searchWord=&paraName='
  15. # 自定义的header
  16. # 爬取的页数总和
  17. def getPageCount(self):
  18. req = requests.get(self.baseUrl,headers=get_header())
  19. print(req.text)
  20. tree = etree.HTML(req.text)
  21. # 通过xpath提取链接
  22. page = tree.xpath('//div[@class="pageBox"]/div[@class="page-box"]/span/text()')
  23. if(len(page)>0):
  24. return int(page[0][1:3])
  25. else:
  26. return 0
  27. def buffer(self,browser):
  28. for i in range(50):
  29. time.sleep(0.3)
  30. browser.execute_script('window.scrollBy(0,300)', '')
  31. def getDataByBrowswer(self):
  32. data = []
  33. print('开始爬虫')
  34. browser = webdriver.Chrome('C://Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe')
  35. page_link = self.pageurl.replace('@position',str(13))
  36. page = 1
  37. for offset in range(page):
  38. pageUrl = page_link.replace('@page',str(offset+1))
  39. browser.get(pageUrl)
  40. time.sleep(30)
  41. self.buffer(browser)
  42. links = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a')
  43. types = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[1]')
  44. desps = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[2]')
  45. positions = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//p')
  46. for i in range(len(links)):
  47. item = {}
  48. link = links[i].get_attribute('href')
  49. item['name'] = links[i].text
  50. item['type'] = types[i].text
  51. item['desp'] = desps[i].text
  52. item['position'] = positions[i].text
  53. browser.get(link)
  54. time.sleep(30)
  55. self.buffer(browser)
  56. item['pay_type'] = browser.find_element_by_xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="type"]').text
  57. item['pay_price'] = browser.find_element_by_xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]').text
  58. item['pay_price_unit'] = browser.find_element_by_xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/i').text
  59. item['phone'] = browser.find_element_by_xpath('//div[@class="w460 room-call"]//div[@class="phone orange"]').text
  60. data.append(item)
  61. print(data)
  62. browser.close()
  63. return data
  64. # 列表页处理函数、批量获取详情页链接地址
  65. def getData(self):
  66. data = []
  67. print('开始爬虫')
  68. page = self.getPageCount()
  69. # page = 1
  70. page_link = self.pageurl.replace('@position',str(13))
  71. print(page)
  72. for offset in range(page):
  73. # 拼接URL
  74. pageUrl = page_link.replace('@page',str(offset))
  75. print(pageUrl)
  76. # 通过requests获取数据
  77. response = requests.get(url=pageUrl,headers=get_header())
  78. print(response.text)
  79. # html=response.content
  80. # html_doc=str(html,'utf-8')
  81. # 通过etree解析文档
  82. tree = etree.HTML(response.text)
  83. # 通过xpath提取链接
  84. links = tree.xpath('//div[@class="roomCardSmall-box"]//a/@href')
  85. print(links)
  86. names = tree.xpath('//div[@class="roomCardSmall-box"]//a/@title')
  87. types = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[1]/text()')
  88. desps = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[2]/text()')
  89. positions = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//p/text()')
  90. for i in range(len(links)):
  91. item = {}
  92. item['name'] = names[i]
  93. item['type'] = types[i]
  94. item['desp'] = desps[i]
  95. item['position'] = positions[i]
  96. link = links[i]
  97. req = requests.get(link,headers=get_header())
  98. html_doc = str(req.content,'utf-8')
  99. print(html_doc)
  100. tree = etree.HTML(html_doc)
  101. item['pay_type'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="type"]/text()')[0]
  102. item['pay_price'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/text()')[0]
  103. item['pay_price_unit'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/i/text()')[0]
  104. item['phone'] = tree.xpath('//div[@class="w460 room-call"]//div[@class="phone orange"]/text()')[0]
  105. data.append(item)
  106. time.sleep(random.random()*8)
  107. time.sleep(random.random()*8)
  108. return data
  109. # # 保存数据到excel文件
  110. def saveToCsv(self,data):
  111. wb = Workbook()
  112. ws = wb.active
  113. ws.append(['标题', '类型', '描述', '地理位置', '房租支付方式', '房租', '房租单位','手机号'])
  114. for item in data:
  115. line = [item['name'], item['type'],item['desp'],item['position'],item['pay_type'],item['pay_price'],item['pay_price_unit'],item['phone']]
  116. ws.append(line)
  117. wb.save('蘑菇租房_上海.xlsx')
  118. # # 开始爬虫
  119. def startSpider(self):
  120. data = self.getData()
  121. self.saveToCsv(data)
  122. # data = self.getDataByBrowswer()
  123. # self.saveToCsv(data)
  124. if __name__ == "__main__":
  125. spider = Spider()
  126. spider.startSpider()

利用requets库采集蘑菇租房网的租房信息的更多相关文章

  1. crawler4j源码学习(2):Ziroom租房网房源信息采集爬虫

    crawler4j是用Java实现的开源网络爬虫.提供了简单易用的接口,可以在几分钟内创建一个多线程网络爬虫.下面实例结合jsoup解析网页,javacsv存储采集数据:采集自如ziroom租房网(h ...

  2. 第一百四十三节,JavaScript,利用封装库做百度分享

    JavaScript,利用封装库做百度分享 效果图 html代码 <div id="share"> <h2>分享到</h2> <ul> ...

  3. 利用python库twilio来免费发送短信

    大家好,我是四毛,最近开通了个人公众号“用Python来编程”,欢迎大家“关注”,这样您就可以收到优质的文章了. 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图 ...

  4. Python:利用 selenium 库抓取动态网页示例

    前言 在抓取常规的静态网页时,我们直接请求对应的 url 就可以获取到完整的 HTML 页面,但是对于动态页面,网页显示的内容往往是通过 ajax 动态去生成的,所以如果是用 urllib.reque ...

  5. Python利用PyExecJS库执行JS函数

      在Web渗透流程的暴力登录场景和爬虫抓取场景中,经常会遇到一些登录表单用DES之类的加密方式来加密参数,也就是说,你不搞定这些前端加密,你的编写的脚本是不可能Login成功的.针对这个问题,现在有 ...

  6. Qt编写数据可视化大屏界面电子看板12-数据库采集

    一.前言 数据采集是整个数据可视化大屏界面电子看板系统核心功能,没有数据源,这仅仅是个玩具UI,没啥用,当然默认做了定时器模拟数据,产生随机数据,这个可以直接配置文件修改来选择采用何种数据采集方法,总 ...

  7. 如何利用BeautifulSoup选择器抓取京东网商品信息

    昨天小编利用Python正则表达式爬取了京东网商品信息,看过代码的小伙伴们基本上都坐不住了,辣么多的规则和辣么长的代码,悲伤辣么大,实在是受不鸟了.不过小伙伴们不用担心,今天小编利用美丽的汤来为大家演 ...

  8. 如何利用CSS选择器抓取京东网商品信息

    前几天小编分别利用Python正则表达式.BeautifulSoup.Xpath分别爬取了京东网商品信息,今天小编利用CSS选择器来为大家展示一下如何实现京东商品信息的精准匹配~~ CSS选择器 目前 ...

  9. c# 利用动态库DllImport("kernel32")读写ini文件(提供Dmo下载)

    c# 利用动态库DllImport("kernel32")读写ini文件 自从读了设计模式,真的会改变一个程序员的习惯.我觉得嘛,经验也可以从一个人的习惯看得出来,看他的代码编写习 ...

随机推荐

  1. oracle 多表连接查询 join

    转 简介: 多表连接查询通过表之间的关联字段,一次查询多表数据. 下面将依次介绍 多表连接中的如下方法: 1.from a,b 2.inner join 3.left outer join 4.rig ...

  2. RabbitMQ安装(centos7)

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 本文RabbitMQ版本为rabbitmq-server-3.7.17,erlang为erlang-22.0.7.请各位去官网查看版本匹配和下载 ...

  3. 【Android】SDK的配置

    1:Android Studio 下载   安装后创建项目 2:  打开settings 3:下载后,配置SDK 4:下载jdk1.8.0_74.rar 解压   加入环境变量 5:下载夜神模拟器,加 ...

  4. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  5. 初窥Ansible playbook

    Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. Ansible系列博文直达链接:Ansible入门系列 前言 在上一篇文章中说到A ...

  6. 一文说通Dotnet Core的中间件

    前几天,公众号后台有朋友在问Core的中间件,所以专门抽时间整理了这样一篇文章.   一.前言 中间件(Middleware)最初是一个机械上的概念,说的是两个不同的运动结构中间的连接件.后来这个概念 ...

  7. Java实现 蓝桥杯VIP 基础练习 Sine之舞

    问题描述 最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功.所以他准备和奶牛们做一个"Sine之舞"的游戏,寓教于乐,提高奶牛们的计算能力 ...

  8. Java实现 计蒜客 拯救行动

    拯救行动 公主被恶人抓走,被关押在牢房的某个地方.牢房用 N \times M (N, M \le 200)N×M(N,M≤200) 的矩阵来表示.矩阵中的每项可以代表道路(@).墙壁(#).和守卫( ...

  9. Java实现 LeetCode 123 买卖股票的最佳时机 III(三)

    123. 买卖股票的最佳时机 III 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易. 注意: 你不能同时参与 ...

  10. Java实现 LeetCode 57 插入区间

    57. 插入区间 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: inte ...