本文作者 @东东哥 。项目整体思路和最终结果展示参见文章:

东东哥:用Python爬了一线城市的房租与工资,一线城市的房租在工资的占比真的很高吗?

这一篇是对其中房租数据的获取做具体讲解。

附代码:https://gitee.com/crossin/snippet/tree/master/rent

一、背景

使用scrapy进行爬取自如所有城市的租房信息。数据预览:

二、创建项目

本文使用CrawlSpider进行爬取。普通的 spider ,解析完一整个页面后获取下一页 url,然后重新发送新请求。CrawlSpider 可以在设置只要满足某个条件的url,都进行爬取,就不需要手动的 yield request。

代码:

rules = (# 设置爬取需要爬取城市url的正则表达式Rule(LinkExtractor(allow=r'http://.*\.ziroom.com/z\/.*/\?isOpen=0'), follow=True),# follow =True,不然只会爬到第四页,不会进行跟进爬取Rule(LinkExtractor(allow=r'http://.*\.ziroom.com/z\/.*d\d+-p\d+\/'),callback="parse_page", follow=True),)

创建 CrawlSpider 爬虫:

1.创建项目scrapy startproject ziroom
2.进入项目所在路径 cd ziroom
3.创建爬虫 scrapy genspider -t ziroom_spider "域名"
4.scrapy genspider -t ziroom_spider "www.ziroom.com"

三、数据抓取

首先打开这个链接 http://www.ziroom.com/z/z0/ 进行分析。找到房源信息,我们的目的就是将标题,价格,位置,地铁情况等基本信息抓取出来,所以就没有必要去爬取进入详情页爬取。然后点击“下一页”可以发现,url会随之变化,例如http://www.ziroom.com/z/z0-p2/ 第二页为p2,第一页是p1,说明房源信息并不是通过Ajax异步请求技术得到的,这就好办了,我们直接请求浏览器显示的url,并使用xpath,CSS或者正则提取信息就行了。打开浏览器F12,进入开发者工具,选择Elements,定位任一房源标题,就能找到我们所需要的数据。可以看到房源

我可以看到房源数据是存放在列表中,我使用Xpath进行提取。

可以看到上面的代码还没有提取价格,这是因为自如网的价格有个小坑,房屋价格信息是图片,图片上的数字都是乱序,前端从这张图片根据像素截取出来数字,来展示价格。

复制url打开就可以看到如下的图片,有10个数字。

最开始想到的是使用百度的图像识别API接口,但是去看了看,发现免费的调用次数只有200,网上说这个图片的url是随机的,如果真这样,那肯定要花钱,要么使用pytesseract,或者自己写代码。但是我不想自己造轮子,且安装 pytesseract 这个也挺麻烦。这时候我想,要是图片的url并不是随机的就好了,所以我爬了北京所有的租房信息,发现图片的url并不是网上所说的随机的,总共只有10个url是固定的。这就简单了。

我先用百度图像识别,识别出图片中的数字,并根据background-position 确定切割数字的位置,然后组合就能得到价格。例如-171.2px代表的位置是 8,对应的就是上图中的数字 2。通过观察发现,对应位置有如下几个。

['-0px', '-21.4px', '-42.8px', '-64.2px', '-85.6px', '-107px', '-128.4px', '-149.8px', '-171.2px', '-192.6px']

所以只需要将房源价格中图片的url与10个url进行对比,就能确定图片的数字。代码如下

四、数据存储

表结构

设置items.py

class ZiroomItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()# 固定写法title = scrapy.Field()desc = scrapy.Field()location = scrapy.Field()region = scrapy.Field()prices_url = scrapy.Field()price = scrapy.Field()room_url = scrapy.Field()city = scrapy.Field()

设置好item后要在spider.py中导入item

from ziroom.items import ZiroomItemitem = ZiroomItem(title = title,desc = desc,location = location,region = region,prices_url = prices_url,price = price,room_url = room_url,city = self.city,)

设置pipelines.py。这里只贴出异步存储的代码,同步存储所使用的的代码可以在完整代码查看。

# 异步插入,速度快
class TwistedPipeline(object):def __init__(self):dbparams = {'host': '127.0.0.1','port': 3306,'user': 'root','password': '1234','database': 'ziroom','charset': 'utf8','cursorclass': cursors.DictCursor # 需要指定游标的类}# 设置连接池self.dbpool = adbapi.ConnectionPool('pymysql',**dbparams)self._sql = None@propertydef sql(self):if not self._sql:self._sql = """
            insert into city(Id, title, area, location, city, region, price,room_url,
            price_url)
            values(null,%s,%s,%s,%s,%s,%s,%s,%s)
            """return self._sqlreturn self._sqldef process_item(self, item, spider):# 将insert_item 给 runInteraction 执行就可以实现异步defer = self.dbpool.runInteraction(self.insert_item, item)# 添加错误处理,想知道是哪个 item 出错,所以传入 item 参数,同理传入 spider defer.addErrback(self.handle_error,item, spider)# item 是 process_itemdef insert_item(self, cursor, item):cursor.execute(self.sql,(item['title'],item['desc'],item['location'],item['city'],item['region'],item['price'],item['room_url'],item['prices_url']))# 添加错误处理def handle_error(self,errors,item,spider):print("="*10)print(errors)print("="*10)

设置middlewares.py,我这里只设置了随机 UserAgent。设置随机IP也可以在middlewares进行设置。

from scrapy import signals
import random
class UserAgentDownloadMiddleware(object):def process_request(self, request,spider):USER_AGENTS = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36","Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/44.0.2403.155 Safari/537.36","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36","Mozilla/5.0 (X11; Linux i686; rv:64.0) Gecko/20100101 Firefox/64.0","Mozilla/5.0 (Windows NT 6.1; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","Mozilla/5.0 (X11; Linux i586; rv:63.0) Gecko/20100101 Firefox/63.0","Mozilla/5.0 (Windows NT 6.2; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A","Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; TencentTraveler 4.0; Trident/4.0; SLCC1; Media Center PC 5.0; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30618)","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; QQDownload 1.7; GTB6.6; TencentTraveler 4.0; SLCC1; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.5.30729; .NET CLR 3.0.30729)","Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; iCafeMedia; TencentTraveler 4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)","Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko, Safari) Cheshire/1.0.UNOFFICIAL","Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en) AppleWebKit/418.9 (KHTML, like Gecko, Safari) Cheshire/1.0.UNOFFICIAL"]user_agent = random.choice(USER_AGENTS)request.headers['User-Agent'] = user_agent

五、基本设置

修改setting.py:

1.ROBOTSTXT_OBEY = False # 设置为不遵守robot协议
2.设置headers
DEFAULT_REQUEST_HEADERS = {
'Host': 'nj.ziroom.com',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Upgrade-Insecure-Requests': '1','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}
3. 打开middlewares
DOWNLOADER_MIDDLEWARES = {
'ziroom.middlewares.UserAgentDownloadMiddleware': 543
}
4. 打开pipelines
ITEM_PIPELINES = {
'ziroom.pipelines.TwistedPipeline': 300
}

六、运行爬虫

需要在项目目录下运行:

运行成功:

结束运行:

下一篇我们将讲解如何获取收入信息。

附代码:https://gitee.com/crossin/snippet/tree/master/rent

------

欢迎搜索及关注:Crossin的编程教室

这里还有更多精彩。一起学,走得远

计算房租收入比(1)- scrapy 爬取网上租房信息相关推荐

  1. python爬取网上租房信息_用python爬取租房网站信息的代码

    自己在刚学习python时写的,中途遇到很多问题,查了很多资料,下面就是我爬取租房信息的代码: 链家的房租网站 两个导入的包 1.requests 用来过去网页内容 2.BeautifulSoup i ...

  2. python爬取网上租房信息_Python爬虫入门 | 5 爬取小猪短租租房信息

    小猪短租是一个租房网站,上面有很多优质的民宿出租信息,下面我们以成都地区的租房信息为例,来尝试爬取这些数据. 1.爬取租房标题 按照惯例,先来爬下标题试试水,找到标题,复制xpath. 多复制几个房屋 ...

  3. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(四) —— 应对反爬技术(选取 User-Agent、添加 IP代理池以及Cookies池 )

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) -- 数据的持久化--使用MongoDB存储爬取的数据 最近项目有些忙,很多需求紧急上线,所以一直没能完善< 使用 ...

  4. scrapy爬取——阿里招聘信息

    scrapy爬取--阿里招聘信息 爬取网站地址: https://job.alibaba.com/zhaopin/positionList.htm 1.创建项目 进入项目目录 输入cmd进入都是窗口创 ...

  5. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) —— 编写一个基本的 Spider 爬取微博用户信息

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(一) -- 新建爬虫项目 在上一篇我们新建了一个 sina_scrapy 的项目,这一节我们开始正式编写爬虫的代码. 选择目标 ...

  6. [Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(三) —— 数据的持久化——使用MongoDB存储爬取的数据

    上一篇:[Python 爬虫] 使用 Scrapy 爬取新浪微博用户信息(二) -- 编写一个基本的 Spider 爬取微博用户信息 在上一篇博客中,我们已经新建了一个爬虫应用,并简单实现了爬取一位微 ...

  7. Python爬取自如租房信息(价格)笔记——笨办法

    爬取自如租房信息 最近正在学习python爬虫,顺便又要租房子,于是就想爬去自如上的租房信息顺便来联系一下. ·掉进价格的大坑里 在爬取过程中一切都听顺利的,可是到了最关键的房租部分就遇到了问题.居然 ...

  8. 深圳python爬虫培训南山科技园钽电容回收_记一次python 爬虫爬取深圳租房信息的过程及遇到的问题...

    为了分析深圳市所有长租.短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题: 爬取代码: import requests from reques ...

  9. python解决租房问题_记一次python 爬虫爬取深圳租房信息的过程及遇到的问题

    为了分析深圳市所有长租.短租公寓的信息,爬取了某租房公寓网站上深圳区域所有在租公寓信息,以下记录了爬取过程以及爬取过程中遇到的问题: 爬取代码: import requests from reques ...

  10. scrapy 爬取拉勾网职位信息

    需求:1.使用python爬虫框架,爬取拉勾网职位信息, 2.将爬取的职位信息存储到json格式的文件中 3.将爬取的数据进行数据分析 1.图片中的链接是职位列表页的链接,进行翻页,该链接没有变化,无 ...

最新文章

  1. java swing计算机_使用java swing仿window7标准计算器界面
  2. 2017 人工智能+内容生产研究报告【附下载】
  3. java已知一个二叉树_Day58:对称的二叉树
  4. 【深入Java虚拟机JVM 08】JVM四种引用-强引用、软引用、弱引用、虚引用
  5. 计算机科学与技术专业导论_教育部最新公布!西安工业大学新增4个本科专业!...
  6. Mac OS Git 安装
  7. Java BigInteger类| isProbablePrime()方法与示例
  8. 西瓜书《机器学习》线性模型 一元线性回归公式推导
  9. linux 查找字母c结尾的内容,linux如何查找以某个字母打头的文件或文件夹 比如,/etc目录下很多文件,我想列出所有以c开头的文件或文件...
  10. 学生宿舍信息管理系统
  11. JPG png GIF BMP常见图像格式的介绍与区别
  12. aria2 配置教程
  13. 抑制广播风暴 各种发包
  14. 新媒体运营教程:头条平台视频运营和分析
  15. 看不懂简明python教程_简明python教程的读书笔记(一)
  16. 基于SpringBoot、Vue的开源情侣空间
  17. android系统 最新版本是多少,安卓系统最新版本是多少 Android M 最新功能
  18. 毕业论文管理系统类图
  19. 告别最好用的微软UWP应用OneNote 微软已经开始将其替换为Win32版
  20. Html5添加非常实用的可自动轮播的旋转木马插件教程

热门文章

  1. 鸿蒙系统的理解,我所理解的鸿蒙系统
  2. Alarm Clock C/C++ Version
  3. Elasticsearch教程(31) es mapping参数doc_values enabled ignore_above norms store详解
  4. el-upload+额外的参数 , element上传功能组件及其参数的详解
  5. 腾讯加盟:Kafka-on-Pulsar 项目迎来 2 位腾讯 Maintainer!
  6. 记录一个非常实用的gif制作工具licecap
  7. Win10任务栏卡死,无响应,一直转圈,点不动
  8. 解决swiper动态改变数据后分页混乱问题
  9. WinEdt10.3 激活
  10. ecshop 添加会员头像功能