26-爬取链家二手房成交的房产信息【简单】

目的:爬取链家二手房成交的信息,包括:['cjxiaoqu','cjdanjia','cjhuxing','cjmianji','cjshijian','cjlouceng','cjchaoxiang','cjzhouqi'],即为['成交小区','成交单价','成交户型','成交面积','成交时间','成交楼层','成交朝向','成交周期']

结果呈现:(1)数据保存到lianjia.csv 【然后在文章分类“数据分析”中加上一篇数据分析:https://my.oschina.net/pansy0425/blog/3031736】

                    【!!!这个数据分析值得一看!!!】

                 (2)数据存放到数据库中【不难,只是平常多使用下数据库,可以增加记忆】

注:这个爬取比较简单,没有遇到反爬,而且网页信息都可以在相应的html文件中找到,所以就直接放代码啦~~~

#下面为本实例的爬虫代码,若有问题可以给我留言,或者有更好的解决方法也可以私信我~

前期mysql中的操作:【都是这个套路,是最基本的】

"""
#在数据库中进行的操作
首先打开数据库管理权限:net start mysql56
                    C:\WINDOWS\system32>mysql -u root -p
                    Enter password: ********
                    进入MySQL
新建数据库LianJiaInfo
新建表chengjiao   字段:id INT; cjxiaoqu VARCHAR(225); cjdanjia FLOAT;  cjhuxing VARCHAR(225); cjmianji VARCHAR(225); 
                       cjshijian VARCHAR(225);cjlouceng VARCHAR(225); cjchaoxiang VARCHAR(225), cjzhouqi INT;


mysql> CREATE DATABASE IF NOT EXISTS LianJiaInfo DEFAULT CHARSET utf8 COLLATE utf8_general_ci;  #创建数据库
mysql> USE LianJiaInfo;
mysql> CREATE TABLE chengjiao(
    -> id INT PRIMARY KEY AUTO_INCREMENT,
    -> cjxiaoqu VARCHAR(225),
    -> cjdanjia FLOAT,
    -> cjhuxing VARCHAR(225),
    -> cjmianji VARCHAR(225),
    -> cjshijian VARCHAR(225),
    -> cjlouceng VARCHAR(225),
    -> cjchaoxiang VARCHAR(225),
    -> cjzhouqi INT);
mysql> DESCRIBE chengjiao;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      | NO   | PRI | NULL    | auto_increment |
| cjxiaoqu    | varchar(225) | YES  |     | NULL    |                |
| cjdanjia    | float        | YES  |     | NULL    |                |
| cjhuxing    | varchar(225) | YES  |     | NULL    |                |
| cjmianji    | varchar(225) | YES  |     | NULL    |                |
| cjshijian   | varchar(225) | YES  |     | NULL    |                |
| cjlouceng   | varchar(225) | YES  |     | NULL    |                |
| cjchaoxiang | varchar(225) | YES  |     | NULL    |                |
| cjzhouqi    | int(11)      | YES  |     | NULL    |                |
+-------------+--------------+------+-----+---------+----------------+  
"""

爬虫代码:【简单】

import json
import re
import csv
import requests
from bs4 import BeautifulSoup
import os
import pymysql

class SJK():
    def __init__(self,db_name,table_name):
        self.db_name=db_name  #数据库名称
        self.table_name=table_name  #表名
    def save_to_database(self,info):
        db=pymysql.connect(host='localhost',port=3306,user='root',passwd='12345678',db=self.db_name,charset='utf8')
        cursor=db.cursor()
        sql="""INSERT INTO {} (cjxiaoqu,cjdanjia,cjhuxing,cjmianji,cjshijian,cjlouceng,cjchaoxiang,cjzhouqi) VALUES('{}','{}','{}','{}','{}','{}','{}','{}')""".format(self.table_name,info[0],info[1],info[2],info[3],info[4],info[5],info[6],info[7])
        try:
            cursor.execute(sql)
            db.commit()
            print('{}------存入数据库成功'.format(info[0]))
        except Exception as e:
            print(e)
            db.rollback()
            print('{}------存入数据库失败'.format(info[0]))

class LJ():
    def __init__(self):
        self.headers={'user-agent':'Mozilla/5.0'}
        self.start_url='https://nj.lianjia.com/chengjiao/'
        self.sjk=SJK('LianJiaInfo','chengjiao')  #这边传入的数据库以及表名,我自己固定死
        self.path_name='lianjia.csv'

    def get_page(self,url):
        try:
            r = requests.get(url, headers=self.headers)
            r.raise_for_status()
            r.encoding = r.apparent_encoding
            return r.text
        except Exception as e:
            print(e)

    def get_num(self,url):
        html=self.get_page(url)
        soup=BeautifulSoup(html,'html.parser')
        page=soup.find('div',{'class':{'house-lst-page-box'}})
        page_info=json.loads(page['page-data'])
        page_num=page_info["totalPage"]  #int类型
        return page_num

    def get_info(self,url):
        html=self.get_page(url)
        soup=BeautifulSoup(html,'html.parser')
        ul=soup.find('ul',{'class':'listContent'})
        for li in ul('li'):
            href=li('a')[0]['href']  #每个的成交记录的链接
            html=self.get_page(href)
            soup=BeautifulSoup(html,'html.parser')
            info1=soup.find('div',{'class':{'deal-bread'}})
            cjxiaoqu=info1('a')[2].text.strip()[0:-7]  #成交小区  str  【从后往前取,小区名称的个数不相同】
            info2=soup.find('div',{'class':{'price'}})
            cjdanjia=float(info2('b')[0].text.strip())  #成交单价 float
            info3=soup.find('div',{'class':{'wrapper'}})
            h1=info3('h1')[0].text.strip().split(' ')
            cjhuxing=h1[1]          #成交户型  str
            cjmianji=h1[-1]         #成交面积  str
            cjshijian=info3('span')[0].text.strip().split(' ')[0]  #成交时间 str
            info4=soup.find('div',{'class':{'content'}})
            cjlouceng=info4('ul')[0]('li')[1].text.strip()[4:]  #成交楼层  str
            cjchaoxiang = info4('ul')[0]('li')[6].text.strip()[4:]  #成交朝向 str
            info5=soup.find('div',{'class':{'msg'}})
            cjzhouqi=info5('span')[1].text.strip()
            cjzhouqi=int(re.findall('(\d+)',cjzhouqi)[0])   #成交周期  int
            info=[cjxiaoqu,cjdanjia,cjhuxing,cjmianji,cjshijian,cjlouceng,cjchaoxiang,cjzhouqi]
            self.save_to_csv(info)  #保存到csv文件,做后续的数据分析
            self.sjk.save_to_database(info)  #保存到数据库,之后方便存取

    def save_to_csv(self,info):
        with open(self.path_name,'a',encoding='utf-8',newline="")as csv_f:
            csv_write=csv.writer(csv_f)
            if os.path.getsize(self.path_name)==0:
                csv_write.writerow(['cjxiaoqu','cjdanjia','cjhuxing','cjmianji','cjshijian','cjlouceng','cjchaoxiang','cjzhouqi'])
            else:
                csv_write.writerow(info)
                print('{}-----存入csv成功'.format(info[0]))
        csv_f.close()

    def main(self):
        page_num=self.get_num(self.start_url)
        for i in range(1,page_num+1):  #page_num+1
            try:
                print('开始爬取第{}页'.format(i))
                page_url=self.start_url+'pg{}/'.format(i)
                self.get_info(page_url)
            except:
                continue

lianjiao=LJ()
lianjiao.main()

屏幕显示:240a1b50c98b7b3d0e5cf1fff59568fa76b.jpg【部分显示】

lianjia.csv文件中显示:b7a66a7067203d377c2d934ba70e13c38b2.jpg【部分显示】

数据库中显示:53e3e2a3292b47c877de1c0eccee4bbdfb5.jpg【部分显示】

---------(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)----------

今日爬虫完成!

今日鸡汤:眼光放长远,格局拓宽点,见识独到些,千万不要人云亦云,随波逐流,自己的风格自己负责,自己的境界自己造就。

加油ヾ(◍°∇°◍)ノ゙

转载于:https://my.oschina.net/pansy0425/blog/3031621

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值