目的:爬取链家二手房成交的信息,包括:['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()
屏幕显示:【部分显示】
lianjia.csv文件中显示:【部分显示】
数据库中显示:【部分显示】
---------(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)(。・ω・。)----------
今日爬虫完成!
今日鸡汤:眼光放长远,格局拓宽点,见识独到些,千万不要人云亦云,随波逐流,自己的风格自己负责,自己的境界自己造就。
加油ヾ(◍°∇°◍)ノ゙