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

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

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

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

首先是获取列表页的数据

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

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

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

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

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

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

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

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

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

import requests
from lxml import etree
from openpyxl import Workbook
from myutils import get_header
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import random # 爬虫处理类
# 目标网站 蘑菇租房:http://www.mgzf.com/list/qy13_
class Spider:
# 目标网站列表页的基本链接
baseUrl = 'http://www.mgzf.com/list/qy@position_'
pageurl = 'http://www.mgzf.com/list/pg@page/qy@position_/?searchWord=&paraName='
# 自定义的header
# 爬取的页数总和
def getPageCount(self):
req = requests.get(self.baseUrl,headers=get_header())
print(req.text)
tree = etree.HTML(req.text)
# 通过xpath提取链接
page = tree.xpath('//div[@class="pageBox"]/div[@class="page-box"]/span/text()')
if(len(page)>0):
return int(page[0][1:3])
else:
return 0 def buffer(self,browser):
for i in range(50):
time.sleep(0.3)
browser.execute_script('window.scrollBy(0,300)', '') def getDataByBrowswer(self):
data = []
print('开始爬虫')
browser = webdriver.Chrome('C://Users/Administrator/AppData/Local/Google/Chrome/Application/chromedriver.exe')
page_link = self.pageurl.replace('@position',str(13))
page = 1
for offset in range(page):
pageUrl = page_link.replace('@page',str(offset+1))
browser.get(pageUrl)
time.sleep(30)
self.buffer(browser)
links = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a')
types = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[1]')
desps = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[2]')
positions = browser.find_elements_by_xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//p')
for i in range(len(links)):
item = {}
link = links[i].get_attribute('href')
item['name'] = links[i].text
item['type'] = types[i].text
item['desp'] = desps[i].text
item['position'] = positions[i].text
browser.get(link)
time.sleep(30)
self.buffer(browser)
item['pay_type'] = browser.find_element_by_xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="type"]').text
item['pay_price'] = browser.find_element_by_xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]').text
item['pay_price_unit'] = browser.find_element_by_xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/i').text
item['phone'] = browser.find_element_by_xpath('//div[@class="w460 room-call"]//div[@class="phone orange"]').text
data.append(item)
print(data)
browser.close()
return data # 列表页处理函数、批量获取详情页链接地址
def getData(self):
data = []
print('开始爬虫')
page = self.getPageCount()
# page = 1
page_link = self.pageurl.replace('@position',str(13))
print(page)
for offset in range(page):
# 拼接URL
pageUrl = page_link.replace('@page',str(offset))
print(pageUrl)
# 通过requests获取数据
response = requests.get(url=pageUrl,headers=get_header())
print(response.text)
# html=response.content
# html_doc=str(html,'utf-8')
# 通过etree解析文档
tree = etree.HTML(response.text)
# 通过xpath提取链接
links = tree.xpath('//div[@class="roomCardSmall-box"]//a/@href')
print(links)
names = tree.xpath('//div[@class="roomCardSmall-box"]//a/@title')
types = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[1]/text()')
desps = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//h2[2]/text()')
positions = tree.xpath('//div[@class="roomCardSmall-box"]//a//div[@class="text-content-middle"]//p/text()')
for i in range(len(links)):
item = {}
item['name'] = names[i]
item['type'] = types[i]
item['desp'] = desps[i]
item['position'] = positions[i]
link = links[i]
req = requests.get(link,headers=get_header())
html_doc = str(req.content,'utf-8')
print(html_doc)
tree = etree.HTML(html_doc)
item['pay_type'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="type"]/text()')[0]
item['pay_price'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/text()')[0]
item['pay_price_unit'] = tree.xpath('//div[@class="w460 price mt10"]/div[@class="info"]/span[@class="num orange"]/i/text()')[0]
item['phone'] = tree.xpath('//div[@class="w460 room-call"]//div[@class="phone orange"]/text()')[0]
data.append(item)
time.sleep(random.random()*8)
time.sleep(random.random()*8)
return data # # 保存数据到excel文件
def saveToCsv(self,data):
wb = Workbook()
ws = wb.active
ws.append(['标题', '类型', '描述', '地理位置', '房租支付方式', '房租', '房租单位','手机号'])
for item in data:
line = [item['name'], item['type'],item['desp'],item['position'],item['pay_type'],item['pay_price'],item['pay_price_unit'],item['phone']]
ws.append(line)
wb.save('蘑菇租房_上海.xlsx') # # 开始爬虫
def startSpider(self):
data = self.getData()
self.saveToCsv(data)
# data = self.getDataByBrowswer()
# self.saveToCsv(data) if __name__ == "__main__":
spider = Spider()
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. [站点推荐]001.学习新技能的37个最佳网站(The 37 Best Websites To Learn Something New)

    忘了过于褒奖的学校.整天呆在拥挤的教室而效果却差得可怜.这些网站和应用涵盖了科学.艺术和技术的无数话题.它们可以教会你实践练习任何技能,从制作豆 沙到用 node.js 开发 app,而且它们都是免费 ...

  2. SpringBoot的 HelloWorld

    SpringBoot HelloWorld 功能需求 ​ 浏览器发送hello请求,服务器接收请求并处理,相应HelloWorld字符串 1.创建一个maven工程:(jar) 2.导入SpringB ...

  3. win10系统下计算器界面变成英文的解决方法

    标题: win10系统下计算器界面变成英文的解决方法 作者: 梦幻之心星 347369787@QQ.com 标签: [win10, 计算器, 英文] 目录: 软件 日期: 2019-04-20 目录 ...

  4. [C#.NET拾遗补漏]01:字符串操作

    字符串操作在任意编程语言的日常编程中都随处可见,今天来汇总一下 C# 中关于字符串的一些你可能遗忘或遗漏的知识点. 逐字字符串 在普通字符串中,反斜杠字符是转义字符.而在逐字字符串(Verbatim ...

  5. JavaScript (五) js的基本语法 - - - 面向对象、工程模式、内置对象、JSON

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.编程思想 1.定义: 编程思想:把一些生活中做事的经验融入到程序中 面向过程:凡事都要亲力亲为,每件 ...

  6. Java实现桐桐的数学难题

    桐桐的数学难题 题目描述 今天数学课上,桐桐学习了质数的知识:一个正整数如果只能被1和它本身整除,那么这个整数便是质数.桐桐就想:任意一个正整数是否都能分解成若干个质数相乘的形式呢?输入一个正整数n( ...

  7. Java实现 蓝桥杯VIP 算法训练 集合运算

    问题描述 给出两个整数集合A.B,求出他们的交集.并集以及B在A中的余集. 输入格式 第一行为一个整数n,表示集合A中的元素个数. 第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素. 第三行 ...

  8. Java实现 LeetCode 299 猜数字游戏

    299. 猜数字游戏 你正在和你的朋友玩 猜数字(Bulls and Cows)游戏:你写下一个数字让你的朋友猜.每次他猜测后,你给他一个提示,告诉他有多少位数字和确切位置都猜对了(称为"B ...

  9. Java实现 蓝桥杯 算法训练 1的个数

    试题 算法训练 1的个数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 输入正整数n,判断从1到n之中,数字1一共要出现几次.例如1123这个数,则出现了两次1.例如15,那么从1 ...

  10. Java实现第九届蓝桥杯字母阵列

    字母阵列 题目描述 仔细寻找,会发现:在下面的8x8的方阵中,隐藏着字母序列:"LANQIAO". SLANQIAO ZOEXCCGB MOAYWKHI BCCIPLJQ SLAN ...