python爬取二手房库存,存数据库,生成折线图(中)
中篇会介绍爬去房价的信息,然后存入数据库
第一步 基本的配置信息
html页面 免不了会加载一些自己的js,css之类的。
- 新建自己的static文件夹,存放js等
- 打开settings文件
- 修改 STATIC_URL和STATICFILES_DIRS配置
此时在html通过如下的方式导入js
- 修改第一行 {% load static %}
- 导入自己的js路径 <script src="{% static “js/echarts-all-3.js” %}">
第二步 通过orm model生成表结构
通过如下的方式连接数据库 pymysql.install_as_MySQLdb()
修改settings 的数据库连接信息
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql', # 或者使用 mysql.connector.django
'NAME': 'spiderpy', # 数据库的名称
'USER': 'root',
'PASSWORD': '123456',
'HOST':'localhost',
'PORT':'3306',
}
}
最后修改我们的model用于关联数据库表
class houseinfo(models.Model):
# db_table = 'houseinfo'
id=models.AutoField(primary_key=True)
selling_house_number = models.IntegerField(default=0)
trade_number_last90day = models.IntegerField(default=0)
house_avg_price = models.IntegerField(default=0)
increase_house = models.IntegerField(default=0)
increase_people = models.IntegerField(default=0)
people_seehouse_number = models.IntegerField(default=0)
create_time = models.DateTimeField(auto_now_add=True)
最后通过命令进行orm映射
执行如下的两次命令,即可开始进行orm映射
-
python manage.py makemigrations house
-
python manage.py migrate house
结果如下
第三部 通过前台点击按钮到后台执行爬取入库
前台按钮执行如下的请求。我们需要去配置一个该url的路由
修改对应url的path
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5cBIaC9K-1588946657552)(https://i.loli.net/2020/05/08/XaH2rCNUupcE8em.png)]
在views里面增加对应的方法
重点是 getHouseNumber_Price_hot 这段爬取信息的代码。爬取之后通过orm对象的object的各种方法可以实现crud。
调用create方法即可存入数据库
getHouseNumber_Price_hot 代码如下,爬取代码不是重点
import requests
import re
from bs4 import BeautifulSoup
from house import models
def getHouseNumber_Price_hot():
url ="https://cd.lianjia.com/fangjia/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE",
"Referer": "https://cd.lianjia.com/chengjiao/",
"Host": "cd.lianjia.com",
"Connection":"close"
}
content = requests.get(url, headers=headers,verify=False).content.decode()
soup = BeautifulSoup(content, 'html.parser')
houseinfo = models.houseinfo;
groups = re.search('>在售房源(.*?)套<', content, re.S)
houseinfo.selling_house_number = groups.group(1)
groups = re.search('>最近90天内成交房源(.*?)套<', content, re.S)
houseinfo.trade_number_last90day = groups.group(1)
numClass = soup.find_all(class_="num")
for index, val in enumerate(numClass):
if(index==0):
houseinfo.house_avg_price = val.string
if(index==1):
# print(val.span.string)
houseinfo.increase_house = val.span.string
if (index == 2):
# print(val.span.string)
houseinfo.increase_people = val.span.string
if (index == 3):
# print(val.span.string)
houseinfo.people_seehouse_number = val.span.string
return houseinfo;