python3 scrapy_redis 分布式爬取房天下存mongodb

(一)scrapy_redis 简单介绍

scrapy_redis基于scrapy框架的基础上集成了redis,通过了redis实现了去重,多台服务器进行分布式的爬取数据。

(二)scrapy_redis 简单配置

(1)settings.py 文件中加入两行代码:

#启用Redis调度存储请求队列
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

#确保所有的爬虫通过Redis去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

image.png

(2)spider文件中把scrapy.Spider改为RedisSpider; 加入redis_key

image.png

以上就是scrapy_redis在scrapy框架中的简单配置,更多的配置内容,请查看以往博客介绍

(三)房天下爬虫代码的编写

(一)获取的内容是优选房源

image.png

起始页:https://m.fang.com/zf/bj/?jhtype=zf

因为这个页面是下滑刷新的,并没有点击下一页的操作,而是动态JS进行加载的,我们可以使用审查元素中的网络,查看接口请求信息

image.png

其中的一个链接:

https://m.fang.com/zf/?purpose=%D7%A1%D5%AC&jhtype=zf&city=%B1%B1%BE%A9&renttype=cz&c=zf&a=ajaxGetList&city=bj&r=0.7838634037101673&page=3

我们可以看到 page=3 只要我们操控这个变量就完全可以了。

但是:当我们打开上面的链接的时候,出现一堆的乱码:

image.png

(二)我们在parse()方法中使用decode 方法解码一下,就可以显示正常了。

    def parse(self,response):
          print(response.body.decode('utf-8'))

敲黑板!!!

因为这里用了分布式,我使用的方法是一台专门爬url,就是列表页的url,另外一台专门进行列表页url的解析工作。

基于现在的情况,我现在只有一台电脑,所以我进行了两个爬虫进行运行,一个进行url的爬取,一个进行页面的解析工作。

(1)url爬取:

image.png

(2)页面解析:


image.png

(1)爬取url的spider代码:

# -*- coding: utf-8 -*-
# @Time    : 2018/4/30 14:14
# @Author  : 蛇崽
# @Email   : 643435675@QQ.com
# @File    : fangtianxia.py(房天下)
import scrapy
import redis
from scrapy_redis.spiders import RedisSpider

from zhilianspider.settings import REDIS_HOST,REDIS_PWD


class FangtianxiaSpider(RedisSpider):

    name = 'fangtianxia'

    allowed_domains = ['m.fang.com']
    """
    44684 p:16  index 3192
    """
   # start_urls = ['https://m.fang.com/zf/?purpose=%D7%A1%D5%AC&jhtype=zf&city=%B1%B1%BE%A9&renttype=cz&c=zf&a=ajaxGetList&city=bj&r=0.7782449595236586&page=1']

    base_url = 'https://m.fang.com/zf/?purpose=%D7%A1%D5%AC&jhtype=zf&city=%B1%B1%BE%A9&renttype=cz&c=zf&a=ajaxGetList&city=bj&r=0.7782449595236586&page='

    # 获取到redis

    pool = redis.ConnectionPool(host=REDIS_HOST, port=6379, db=0, password=REDIS_PWD)
    redis = redis.StrictRedis(connection_pool=pool)

    for index in range(1,3192):
        star_url = base_url+str(index)
        redis.lpush('fangtianxia:start_urls',star_url)

    redis_key = 'fangtianxia:start_urls'


    def parse(self,response):
        #print(response.body.decode('utf-8'))
        url = response.xpath("//*[@class='tongjihref']/@href").extract()
        for v_url in url:
            print(v_url)
            n_v_url = 'https:'+v_url
            print('nvurl  ',n_v_url)
            self.redis.rpush('fangtianxia:house_urls',n_v_url)

(2)解析页面的代码

# -*- coding: utf-8 -*-
# @Time    : 2018/4/30 14:14
# @Author  : 蛇崽
# @Email   : 643435675@QQ.com
# @File    : fangtianxia.py(房天下)
import scrapy
import redis
from scrapy_redis.spiders import RedisSpider

from zhilianspider.items import FanItem
from zhilianspider.settings import REDIS_HOST,REDIS_PWD


class FangtianxiaSpider(RedisSpider):

    name = 'fangtianxia_down'

    allowed_domains = ['m.fang.com']

    redis_key = 'fangtianxia:house_urls'

    # start_urls = ['https://m.fang.com/zf/bj/JHAGT_404572021_11444434x1010063105_163711602.html']

    def parse(self,response):
        item = FanItem()
        item["title"] = response.xpath('//*[@class="xqCaption mb8"]/h1/text()')[0].extract()
        item["area"] = response.xpath('//*[@class="xqCaption mb8"]/p/a[2]/text()')[0].extract()
        item["location"] = response.xpath('//*[@class="xqCaption mb8"]/p/a[3]/text()')[0].extract()
        item["housing_estate"] = response.xpath('//*[@class="xqCaption mb8"]/p/a[1]/text()')[0].extract()
        item["rent"] = response.xpath('//*[@class="f18 red-df"]/text()')[0].extract()
        item["rent_type"] = response.xpath('//*[@class="f12 gray-8"]/text()')[0].extract()
        item["floor_area"] = response.xpath('//*[@class="flextable"]/li[3]/p/text()')[0].extract()
        item["house_type"] = response.xpath('//*[@class="flextable"]/li[2]/p/text()')[0].extract()
        item["floor"] = response.xpath('//*[@class="flextable"]/li[4]/p/text()')[0].extract()
        item["orientations"] = response.xpath('//*[@class="flextable"]/li[5]/p/text()')[0].extract()
        item["decoration"] = response.xpath('//*[@class="flextable"]/li[6]/p/text()')[0].extract()
        item["house_info"] = response.xpath('//*[@class="xqIntro"]/p/text()')[0].extract()
        item["house_tags"] = ",".join(response.xpath('//*[@class="stag"]/span/text()').extract())
        yield item

(三)items.py代码:

class FanItem(scrapy.Item):
    # 标题
    title = scrapy.Field()
    # 区(朝阳)
    area = scrapy.Field()
    # 区域 (劲松)
    location = scrapy.Field()
    # 小区 (劲松五区)
    housing_estate = scrapy.Field()
    # 租金
    rent = scrapy.Field()
    # 建筑面积
    floor_area = scrapy.Field()
    # 户型
    house_type = scrapy.Field()
    # 楼层
    floor = scrapy.Field()
    # 朝向
    orientations = scrapy.Field()
    # 装修
    decoration = scrapy.Field()
    # 房源描述
    house_info = scrapy.Field()
    # 标签
    house_tags = scrapy.Field()
    # 租房类型(押一付三etc)
    rent_type = scrapy.Field()

(四)数据展示

现在的数据还没有爬完,到现在redis的详情url已经是60万的数据了,怕要是撑爆了。


image.png

mongo数据库里面的数据是3万左右:

image.png

总结一下:scrapy_redis 中的url爬取,这是用这个框架以来第一次用的这种方式,或许这种方式更支持分布式操作,一个爬url,多个通过url进行页面的解析操作,比较解析页面是比较费时的。

其余代码都是跟前面爬取智联招聘的代码都差不多一样的,这里就不贴出来了,完整的代码我会上传上来。

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

推荐阅读更多精彩内容