利用scrapy抓取深圳在链家网的所有租房信息,存进MySql数据库

这次利用scrapy抓取了深圳所有在链家网的租住房信息,一直对房租价格比较感兴趣,这次终于能利用自己的技能分析一下了,至于为什么现在链家网,时候觉得这里数据比较齐全。
这是网址


Paste_Image.png

下面是scrapy框架图


Paste_Image.png

先看items代码,看看我们需要什么数据
Paste_Image.png

提取这些数据都是为了分析与价格的关系
这是setting里面链接MySql的一些设定,包括密码,用户,以及端口,在pipelines里面要用

Paste_Image.png

下面看pipelines代码,主要是对于抓取到的数据进行操作,存进Mysql数据库,这里不得不吐槽一下,mogodb数据库在爬虫里面感觉比MySql方便多了,因为在插进数据之前,自己必须现在数据库里面创建好表。

import mysql.connector
from lianjia import settings
# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
MYSQL_HOSTS = settings.MYSQL_HOSTS
MYSQL_USER = settings.MYSQL_USER
MYSQL_PASSWORD = settings.MYSQL_PASSWORD
MYSQL_PORT = settings.MYSQL_PORT
MYSQL_DB = settings.MYSQL_DB#这几条是链接MySql数据库的,端口密码,都在setting文件里面设定好了

cnx = mysql.connector.connect(user = MYSQL_USER,password= MYSQL_PASSWORD,host =MYSQL_HOSTS,database=MYSQL_DB)#创建链接
cur = cnx.cursor(buffered=True)
class Sql:#这里的sql语句为下面数据插入以及去重做准备
    @classmethod
    def insert_tenement_message(cls,title,rental,distance,area,room_number,floor,direction,year_build):
        sql = 'INSERT INTO tenement_message(`title`,`rental`,`distance`,`area`,`room_number`,`floor`,`direction`,
`year_build`) 
VALUES
 (%(title)s,%(rental)s,%(distance)s,%(area)s,%(room_number)s,%(floor)s,%(direction)s,%(year_build)s)'
        value = {
            'title':title,
            'rental':rental,
            'distance':distance,
            'area':area,
            'room_number':room_number,
            'floor':floor,
            'direction':direction,
            'year_build':year_build,
        }
        cur.execute(sql,value)#执行语句,插进数数据库
        cnx.commit()
    @classmethod
    def select_title(cls,title):#这个是利用标题去重的,虽然按照区域划分应该不会重复,只是预防万一
        sql= 'SELECT EXISTS (SELECT 1 FROM tenement_message WHERE title = %(title)s)'
        value = {
            'title':title
        }
        cur.execute(sql,value)
        return  cur.fetchall()[0]



class LianjiaPipeline(object):
    def process_item(self, item, spider):
        title = item['title']
        ret = Sql.select_title(title)
        if ret[0] ==1:

            print('房子已经存在')
        else:
            rental = item['rental']
            distance = item['distance']
            area = item['area']
            room_number = item['room_number']
            floor = item['floor']
            direction = item ['direction']
            year_build = item['year_build']
            Sql.insert_tenement_message(title,rental,distance,area,room_number,floor,direction,year_build)
            print('开始存租房信息')

下面是链家lianjia主爬虫程序脚本

import scrapy
from bs4 import BeautifulSoup
from scrapy.http import Request
from lianjia.items import LianjiaItem
import requests
import re

class myspider(scrapy.Spider):
    name = 'lianjia'
    allowed_domains =['sz.lianjia.com']



    def start_requests(self):
        theme_url = 'http://sz.lianjia.com/zufang/luohuqu/pg1/'#爬虫开始的页面
        html = requests.get(theme_url)
        content = BeautifulSoup(html.text, 'lxml')

        urls = []
        links = content.find('div', class_='option-list').find_all('a')#找出所有区域的链接
        for link in links:
            i = re.findall(r'g/(.*)/', link['href'])
            if i:
                urls.extend(i)#提取每个区域的链接
        all_url = ['http://sz.lianjia.com/zufang/{}/pg1/'.format(i) for i in urls]#构造出每一个区域的链接
        for url in all_url:
            print(url)
            yield Request(url,self.parse)#对每个链接调用parse函数
    def parse(self, response):
        page = BeautifulSoup(response.text, 'lxml').find('div', class_='page-box house-lst-page-box')#找
        出每个区域最大的页数,
        然后遍历
        max_page = re.findall('Page":(\d+)."cur', str(page))[0]
        bashurl = str(response.url)[:-2]
        for num in range(1,int(max_page)+1):
            url = bashurl+str(num)+'/'
            #print(url)
            yield Request(url,callback=self.get_message)
    def get_message(self,response):
        item = LianjiaItem()
        content = BeautifulSoup(response.text, 'lxml')

        house_list = content.find_all('div', {'class': 'info-panel'})#找到所以租房信息所在的标签里

        for li in house_list:
            try:
                data = li.find('span', class_='fang-subway-ex').find('span').get_text()
                item['distance'] = re.findall(r'(\d+)', data)[1]  # 将离地铁站的距离多少米提取出来,切片选
                取第二个数字是因为第一个是地铁线号,要提出
            except:
                item['distance'] = "没有附近地铁数据"
              # 取出楼层,因为里面用/分割了多段文字,所以用split提取
            try:
                item['year_build'] = re.findall(r'(\d+)', li.find('div', class_='con').get_text().split('/')[-1])[0]  # 把房

                屋的建造年份提取出来

            except:
                item['year_build'] = '没有建造年份'
            item['title'] = li.find('h2').find('a').attrs['title']
            item['rental'] = li.find('div', class_='price').find('span').get_text()
            item['area'] = re.findall(r'(\d+)', li.find('span', class_='meters').get_text().replace('&nbsp', ''))[
                0]  # 将面积数据提取出来
            item['room_number'] = li.find('span', class_='zone').find('span').get_text().replace('\xa0','')
            item['floor'] = li.find('div', class_='con').get_text().split('/')[1]  # 取出楼层,因为里面用/分割了多段文字,
            所以用split提取
            item['direction'] = li.find('div', class_='where').find_all('span')[-1].get_text()  # 提取房屋朝向,
            先找到这个标签在提取文字

            yield item

来看看运行结果吧

Paste_Image.png

一共差不多7000间房出租,第一次看到惊呆了,这也太少了吧比我想得,哈哈
绘制了一下价格跟地铁距离关系的图,以后再补上,顺便一提,如果遍历深圳链家租房主页,是只有100个页面的,爬的数据是不全的,只有5000套左右

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

推荐阅读更多精彩内容