出发点

想做一个地图热力图,发现安居客房产数据有我要的特性。emmm,那就尝试一次好了~

老规矩,从爬虫,从拿到数据开始...

scrapy的配置

创建一个项目(在命令行下敲~):

scrapy startproject anjuke

这命令会建一个叫anjuke的文件夹,里面会有一些待你配置的文件

创建一个spider:

先进入创建的项目文件夹里

cd anjuke
scrapy genspider anju qd.anjuke.com

这命令会建一个叫anju.py的文件,它就是刚刚创建的spider

这时的文件夹结构应该是这样的:

创建item

item是保存爬取数据的容器,使用方法和字典类似~

将item.py修改如下:

import scrapy

class AnjukeItem(scrapy.Item):
# define the fields for your item here like:
address = scrapy.Field()
name = scrapy.Field()
type_ = scrapy.Field()
tags = scrapy.Field()
price = scrapy.Field()
area = scrapy.Field()
city = scrapy.Field()

至于item为什么是这样的可以看看这张图片:

网页结构:

上图就是下面代码用xpath获取divs的那部分,这跟网页的结构有关~

浏览器直接按f12审查元素就是这个站的源码了(有的网站有些内容由js加载时,其实这里可能不是返回的源码)。

上图列出了下面xpath代码的逻辑~~

spider的逻辑(spider-anju.py的修改)

# -*- coding: utf-8 -*-
import scrapy
from anjuke.items import AnjukeItem # 使用item class AnjuSpider(scrapy.Spider):
name = 'anju' # spider的名称,影响不大
allowed_domains = [] # 允许爬取的域,为空则是允许当前spider爬取所有的域名
start_urls = ['https://cheng.fang.anjuke.com/', 'https://chang.fang.anjuke.com/', 'https://chi.fang.anjuke.com/',
'https://chu.fang.anjuke.com/', 'https://cy.fang.anjuke.com/', 'https://chao.fang.anjuke.com/',
'https://cx.fang.anjuke.com/', 'https://hf.fang.anjuke.com/', 'https://changd.fang.anjuke.com/',
'https://cg.fang.anjuke.com/', 'https://chongz.fang.anjuke.com/', 'https://chss.fang.anjuke.com/',
'https://ba.fang.anjuke.com/', ] def parse(self, response):
divs = response.xpath('''//div[@class="key-list imglazyload"]/div''') # 使用xpath从response中获取需要的html块
city = response.xpath(
'''//span[@class="city"]/text()''').extract_first() # 我们匹配到的其实只有一个,获取第一个就行了,这里如果用.extract()其实会返回一个列表
print(divs)
for div in divs: item = AnjukeItem() # 实例化item对象
item['city'] = city # 城市
item['address'] = div.xpath('.//span[@class="list-map"]/text()').extract_first() # 楼盘地址
item['name'] = div.xpath('.//span[@class="items-name"]/text()').extract_first() # 开发商名称
try:
item['type_'] = div.xpath('.//a[@class="huxing"]/span/text()').extract()[:-1] # 房子类型比如两房一厅这样子~
except:
pass item['tags'] = div.xpath('.//span[@class="tag"]/text()').extract() # 网站给楼盘定的标签~ price = div.xpath('.//p[contains(@class,"price")]//text()').extract() # 价格
item['price'] = price
try: item['area'] = div.xpath('.//a[@class="huxing"]/span/text()').extract()[-1].replace('建筑面积:',
'') # 房子面积范围~
except:
pass
yield item next_ = response.xpath('//a[@class="next-page next-link"]/@href').extract_first() # 获取下一页的链接
print('-----next')
print(next_)
yield response.follow(url=next_, callback=self.parse) # 将下一页的链接加入爬取队列~~
上面的start_urls的链接是另外爬的,链接这里:安居客,全部链接爬下来了,这里为了篇幅就列出几个就好了。

上面代码item的结构:

为什么我要将价格保存为list呢?

因为网站这里给的价格有最低价、总价、均价,我只想要均价,保留价格的类型后面用时分类方便~

然后是将数据保存到Mongodb,需要对pipelines.py进行一些修改:

import pymongo

class TextPipeline(object):  #这个自定义的类是打算用来处理item数据的,后来发现爬到的item数据好像还挺干净就没有写逻辑了~
def process_item(self, item, spider):
print(item)
return item class MongoPipeline(object):
def __init__(self,mongo_uri,mongo_db):
self.mongo_uri = mongo_uri
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls,crawler): #类方法,用于从settins.py中获取在那边设置的MONGO_URI和MONGO_DB
return cls(
mongo_uri = crawler.settings.get('MONGO_URI'),
mongo_db = crawler.settings.get('MONGO_DB')
)
def open_spider(self,spider): #当spider开启时这个方法被调用,这里用来连接数据库
self.client = pymongo.MongoClient(self.mongo_uri)
self.db = self.client[self.mongo_db]
def process_item(self,item,spider): #实现了item数据插入到数据库,自动创建与项目名同名,spider同名的表,数据都保存在里面
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self,spider): #当spider关闭时这个方法被调用
self.client.close()

最后就是应付反爬的一些操作咯:

这些都在settings.py设置:

首先,站点对user-agent有检查,发现是爬虫头直接跳转到验证码页面...

emmm,伪造浏览器请求头就好了:

在settings.py加(记得import random):

USER_AGENT_LIST=[  #各浏览器的请求头
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1062.0 Safari/536.3",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.0 Safari/536.3",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24",
"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/535.24 (KHTML, like Gecko) Chrome/19.0.1055.1 Safari/535.24"
]
USER_AGENT = random.choice(USER_AGENT_LIST) #随机从上面列表中选取请求头,伪造请求头~

还有就是禁用cookie,网站会通过用户的Cookie信息对用户进行识别与分析,所以要防止目标网站识别我们的会话信息:

COOKIES_ENABLED = False  #关闭cookie

最后就是访问频率的控制,站点对一个ip的访问频率也有监测,一直很访问快的话,也是会跳到人机验证页面~:

DOWNLOAD_DELAY = random.choice([1,2])  #访问延时,随机选1或2~

最后,看看爬到的部分数据(去重之后大概有7w条左右)~

对爬取到的数据的想法:

1、给出的房源少,房源最多的城市也就2000左右,我想这很大程度并不能代表各个城市的平均水平。。

2、爬到的数据也不一定对,可能房地产或网站这边故意压低一点房价,以消费者吸引目光~

3、其实最好的办法是以公司的合作来取到数据,有这样官方的数据就不用自己去爬了,而且也最准确、最真实啊(有大腿抱得话真的舒服)~

End

安居客scrapy房产信息爬取到数据可视化(上)-scrapy爬虫的更多相关文章

  1. 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码

    接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~ 先看看保存的数据吧~ 本人之前都是习惯把爬到的数据保存到本地json文件, 这次保存到数据库后发现使用mongod ...

  2. 中国大学MOOC课程信息爬取与数据存储

    版权声明:本文为博主原创文章,转载 请注明出处: https://blog.csdn.net/sc2079/article/details/82016583 10月18日更:MOOC课程信息D3.js ...

  3. 爬虫--scrapy+redis分布式爬取58同城北京全站租房数据

    作业需求: 1.基于Spider或者CrawlSpider进行租房信息的爬取 2.本机搭建分布式环境对租房信息进行爬取 3.搭建多台机器的分布式环境,多台机器同时进行租房数据爬取 建议:用Pychar ...

  4. 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息

    超详细创建流程及思路 一. 新建项目 1.创建文件夹,然后在对应文件夹创建一个新的python项目 2.点击Terminal命令行窗口,运行下面的命令创建scrapy项目 scrapy startpr ...

  5. Scrapy项目 - 实现腾讯网站社会招聘信息爬取的爬虫设计

    通过使Scrapy框架,进行数据挖掘和对web站点页面提取结构化数据,掌握如何使用Twisted异步网络框架来处理网络通讯的问题,可以加快我们的下载速度,也可深入接触各种中间件接口,灵活的完成各种需求 ...

  6. Scrapy项目 - 实现斗鱼直播网站信息爬取的爬虫设计

    要求编写的程序可爬取斗鱼直播网站上的直播信息,如:房间数,直播类别和人气等.熟悉掌握基本的网页和url分析,同时能灵活使用Xmind工具对Python爬虫程序(网络爬虫)流程图进行分析.   一.项目 ...

  7. Scrapy项目 - 数据简析 - 实现斗鱼直播网站信息爬取的爬虫设计

    一.数据分析截图(weka数据分析截图 2-3个图,作业文字描述) 本次将所爬取的数据信息,如:房间数,直播类别和人气,导入Weka 3.7工具进行数据分析.有关本次的数据分析详情详见下图所示:   ...

  8. 爬虫系列5:scrapy动态页面爬取的另一种思路

    前面有篇文章给出了爬取动态页面的一种思路,即应用Selenium+Firefox(参考<scrapy动态页面爬取>).但是selenium需要运行本地浏览器,比较耗时,不太适合大规模网页抓 ...

  9. Python 招聘信息爬取及可视化

    自学python的大四狗发现校招招python的屈指可数,全是C++.Java.PHP,但看了下社招岗位还是有的.于是为了更加确定有多少可能找到工作,就用python写了个爬虫爬取招聘信息,数据处理, ...

随机推荐

  1. Struts2 - 值栈(ValueStack)

    1. 关于值栈: 1). helloWorld 时, ${productName} 读取 productName 值, 实际上该属性并不在 request 等域对象中, 而是从值栈中获取的. 2). ...

  2. Execl to HTML

    /************************************************************************* * Execl to HTML * 说明: * 这 ...

  3. Python语言及其应用 第2章

  4. Poj 2503 Babelfish(Map操作)

    一.Description You have just moved from Waterloo to a big city. The people here speak an incomprehens ...

  5. 【转】 Pro Android学习笔记(七一):HTTP服务(5):多线程调用HttpClient

    目录(?)[-] 应用共享HttpClient对象的同步问题 创建共享HttpClient代码 创建共享对象 创建可共享的HttpClient对象 使用共享HttpClient对象的代码 基础代码 修 ...

  6. JAVA 1.5 并发之 Executor框架 (二)execute VS submit

    http://www.cnblogs.com/rockman12352/p/3788688.html 上一篇对于整体框架讲了很多东西,但是具体在使用时有一些细节并没有说出来 首先是执行任务 execu ...

  7. Java中继承的规则

    一.子类中对父类构造函数的调用规则 1.如果不显式指定,子类中的构造函数会默认调用父类中的无参构造 测试代码 package day07; import java.sql.Date; import j ...

  8. js---window对象的三种窗口

    ============================================================================ window对象的三种窗口.html < ...

  9. python中报中文编码异常,Non-ASCII ,but no encoding declared

    异常信息: SyntaxError: Non-ASCII character '\xe5' in file a.py on line 9, but no encoding declared; see ...

  10. JasperReports项目中的应用

    转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html . 2.业务处理 //返回报表查询结果 List<ReportEl ...