python爬虫爬取房源信息

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 写这篇博客的原因是在我爬取房产这类数据信息的时候,发现csdn中好多博主写的关于此类的文章代码已经不适用,因为好多房产网站代码已经更改,使用老的代码明显爬取不到所需要的房产信息。......

   目录

一、数据获取与预处理

二、csv文件的保存

三、数据库存储

四、爬虫完整代码

五、数据库存储完整代码


写这篇博客的原因是在我爬取房产这类数据信息的时候,发现csdn中好多博主写的关于此类的文章代码已经不适用,因为好多房产网站代码已经更改,使用老的代码明显爬取不到所需要的房产信息。这篇博客是根据58同城中的二手房源代码进行爬取的,有遇到问题的伙伴可以借鉴一下,由于博主水平有限,所以有什么错误的地方还望各位伙伴评论区指正,谢谢~

一、数据获取与预处理

1、导入模块

python爬取网站信息采用的几种库和方法分别问beautifulsoup、Xpath、正则表达式,而此处我使用的是xpath。原因很简单,房源网站源代码使用xpath比较好提取数据,建议所有python学习者将爬虫方法都学一遍,这样的话遇到不同的网站就可以使用不同的方法来达到简单爬取所需信息的目的。

代码如下所示:

import csv
from lxml import etree
import requests

image.gif

其中csv模块是用来将爬取的信息存入到Excel表格中

而从lxml中导入的etree模块是用来接下来进行的xpath提取

requests模块是用来向网站进行请求

2、请求头

众所周知,大部分比较完善的网站会有反爬虫机制,所以如果想要爬取该类网站信息,就必须模拟浏览器向网站发送请求,这样才能得到网站回应,爬取到所需要的数据信息。

代码如下所示:

head = {
        "Cookie": "f=n; commontopbar_new_city_info=556%7C%E6%B4%9B%E9%98%B3%7Cluoyang; commontopbar_ipcity=luoyang%7C%E6%B4%9B%E9%98%B3%7C0; userid360_xml=63226CD4C488B4612A7CCA415FEE6165; time_create=1661081634551; id58=CocIJ2LOv3m4X1fRhY/DAg==; aQQ_ajkguid=3EDCDC81-7B5E-4F6F-8C2F-7DABDAFD1348; sessid=ABBD4809-9E9F-45ED-95C1-862EEAFB53D7; ajk-appVersion=; ctid=556; fzq_h=91e3ec8f25dd1406bc61b2a97f769b73_1658489614032_98fa3aa955c544e78ef3d56396c75d7b_47896385561765975701177718252511739399; 58tj_uuid=94e99d7b-f5fd-490e-9527-8d4e7244e894; new_uv=1; utm_source=; spm=; init_refer=; als=0; 58home=luoyang; f=n; new_session=0; xxzl_cid=44f564fa5d724ccd91387882f148211b; xzuid=fbd94eca-007c-4a45-b357-3f5c108e2646",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.7062 SLBChan/103"
    }

image.gif

3、提取网站信息

代码如下所示:

baseurl = "https://{0}.58.com/ershoufang/p{1}/?PGTID=0d200001-0022-c260-609a-771473e6f2e5&ClickID=1".format(city,page)
req = requests.get(baseurl, headers = head)
req_xpath = etree.HTML(req.text)

image.gif

4、数据清洗

代码如下所示:

# 获取名字
    housename = req_xpath.xpath('//h3[@class="property-content-title-name"]/@title')
    # 获取房产链接
    houselink = req_xpath.xpath('//a[@data-action="esf_list"]/@href')
    # 获取建造时间
    housedate = req_xpath.xpath('//p[@class="property-content-info-text"]/text()')
    Housedate = ','.join(housedate)
    Housedate = Housedate.replace('\n', '')
    Housedate = Housedate.replace(' ', '')
    HouseData = []
    HouseDataend = []
    hstring = ''
    for i in Housedate:
        hstring += i
        if i == ',':
            HouseData.append(hstring)
            hstring = ''
    for k in range(0, len(HouseData), 3):
        for j in range(k+3, len(HouseData), 3):
            HouseData1 = ''.join(HouseData[k:j])
            HouseDataend.append(HouseData1)
            break
    # 获取户型
    housetype = req_xpath.xpath('//p[@class="property-content-info-text property-content-info-attribute"]/span[@data-v-f11722e6]/text()')
    allhousetype = []
    temp = ''
    for i in housetype:
        temp += i
        if len(temp) == 6:
            allhousetype.append(temp)
            temp = ''
    # 获取价格
    houseprice = req_xpath.xpath('//p[@class="property-price-average"]/text()')
    # 获取房地产名称
    houseName = req_xpath.xpath('//p[@class="property-content-info-comm-name"]/text()')
    # 获取房地产地段
    houseaddress = req_xpath.xpath('//p[@class="property-content-info-comm-address"]/span[@data-v-f11722e6]/text()')
    Houseaddress = []
    for k in range(0, len(houseaddress), 3):
        for j in range(k+3, len(houseaddress),3):
            houseaddress1 = "-".join(houseaddress[k:j])
            Houseaddress.append(houseaddress1)
            break

image.gif

爬取结果如下所示:

image.gif编辑

二、csv文件的保存

一般我们从网站上爬取到的信息都要存入Excel这种表格中,才能够再存入数据库,至少我是这么做的,可能有更高明的技术人员会更简单的方法。

代码如下所示:

headers = ['房产相关信息', '房产名称' , '房产链接','户型', '价格', '建造岁月和面积等', '地段']
rows = zip(housename, houseName,houselink, allhousetype, houseprice, HouseDataend, Houseaddress)
with open(csvfilepath, 'w', encoding='utf-8', newline= '') as f:
    f_csv = csv.writer(f)     # 创建csv.writer对象
    f_csv.writerow(headers)
    for row in rows:
        f_csv.writerow(row)

image.gif

在此我使用的是csv文件存储,当然也可以使用别的如xlwt模块等等。

三、数据库存储

1、模块导入

代码如下所示:

import pymysql
import pandas as pd

image.gif

由于我使用的是mysql数据库存储,所以导入了pymysql模块,当然如果有人使用sqlite3也是可以的,没有太大影响。

而pandas模块则是用来从csv文件中提取信息存储到数据库中去的。

2、数据库连接

connect = pymysql.connect(host = "127.0.0.1", port = 3306, user = "root", 密码(password) = " ", database = "housedata", charset = "utf8" )
cursor = connect.cursor()

image.gif

数据库存储必须先进行数据库的连接,一般的框架和我的差不多,大家只需要按此输入自己的mysql信息即可。

3、csv文件读取

# 读取csv文件数据
    csv_name = r'E:\pythonProjectSpider\house.csv'
    data = pd.read_csv(csv_name, encoding = "utf-8")
    data = data.where(data.notnull(), None)
    Data = list(data.values)

image.gif

4、数据库表头创建

# 创建数据库表头
    query = "drop table if exists house"  # 若已有数据表hose,则删除
    cursor.execute(query)
    sql = "create table if not exists house(description varchar (100), housename varchar (100), houselink varchar (1000), housetype varchar (100), houseprice varchar (100), mainmessage varchar (100), houseaddree varchar (100)) default charset=utf8;"
    cursor.execute(sql)
    connect.commit()

image.gif

5、数据库信息导入

# 写入数据库
    for data in Data:
        for index in range(len(data)):
            data[index] = '"' + str(data[index]) + '"'
        sql = """insert into house values(%s)""" % ",".join(data)
        cursor.execute(sql)
        connect.commit()
    print("植入成功")

image.gif

所有操作完成后记得关闭数据库,这是必要操作。

# 关闭数据库
    connect.close()
    cursor.close()

image.gif

四、爬虫完整代码

import csv
from lxml import etree
import requests
def main():
    csvfilepath = 'E:\pythonProjectSpider\house.csv'
    getData(csvfilepath)
def getData(csvfilepath):
    head = {
        "Cookie": "f=n; commontopbar_new_city_info=556%7C%E6%B4%9B%E9%98%B3%7Cluoyang; commontopbar_ipcity=luoyang%7C%E6%B4%9B%E9%98%B3%7C0; userid360_xml=63226CD4C488B4612A7CCA415FEE6165; time_create=1661081634551; id58=CocIJ2LOv3m4X1fRhY/DAg==; aQQ_ajkguid=3EDCDC81-7B5E-4F6F-8C2F-7DABDAFD1348; sessid=ABBD4809-9E9F-45ED-95C1-862EEAFB53D7; ajk-appVersion=; ctid=556; fzq_h=91e3ec8f25dd1406bc61b2a97f769b73_1658489614032_98fa3aa955c544e78ef3d56396c75d7b_47896385561765975701177718252511739399; 58tj_uuid=94e99d7b-f5fd-490e-9527-8d4e7244e894; new_uv=1; utm_source=; spm=; init_refer=; als=0; 58home=luoyang; f=n; new_session=0; xxzl_cid=44f564fa5d724ccd91387882f148211b; xzuid=fbd94eca-007c-4a45-b357-3f5c108e2646",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.7062 SLBChan/103"
    }
    city = input("请输入你要查看的城市: ")
    page = input("请属于你要查询的页数: ")
    baseurl = "https://{0}.58.com/ershoufang/p{1}/?PGTID=0d200001-0022-c260-609a-771473e6f2e5&ClickID=1".format(city,page)
    req = requests.get(baseurl, headers = head)
    req_xpath = etree.HTML(req.text)
    # 获取名字
    housename = req_xpath.xpath('//h3[@class="property-content-title-name"]/@title')
    print(housename)
    # 获取房产链接
    houselink = req_xpath.xpath('//a[@data-action="esf_list"]/@href')
    print(houselink)
    # 获取建造时间
    housedate = req_xpath.xpath('//p[@class="property-content-info-text"]/text()')
    Housedate = ','.join(housedate)
    Housedate = Housedate.replace('\n', '')
    Housedate = Housedate.replace(' ', '')
    HouseData = []
    HouseDataend = []
    hstring = ''
    for i in Housedate:
        hstring += i
        if i == ',':
            HouseData.append(hstring)
            hstring = ''
    for k in range(0, len(HouseData), 3):
        for j in range(k+3, len(HouseData), 3):
            HouseData1 = ''.join(HouseData[k:j])
            HouseDataend.append(HouseData1)
            break
    print(HouseDataend)
    # 获取户型
    housetype = req_xpath.xpath('//p[@class="property-content-info-text property-content-info-attribute"]/span[@data-v-f11722e6]/text()')
    allhousetype = []
    temp = ''
    for i in housetype:
        temp += i
        if len(temp) == 6:
            allhousetype.append(temp)
            temp = ''
    print(allhousetype)
    # 获取价格
    houseprice = req_xpath.xpath('//p[@class="property-price-average"]/text()')
    print(houseprice)
    # 获取房地产名称
    houseName = req_xpath.xpath('//p[@class="property-content-info-comm-name"]/text()')
    print(houseName)
    # 获取房地产地段
    houseaddress = req_xpath.xpath('//p[@class="property-content-info-comm-address"]/span[@data-v-f11722e6]/text()')
    Houseaddress = []
    for k in range(0, len(houseaddress), 3):
        for j in range(k+3, len(houseaddress),3):
            houseaddress1 = "-".join(houseaddress[k:j])
            Houseaddress.append(houseaddress1)
            break
    print(Houseaddress)
    # csv文件保存
    headers = ['房产相关信息', '房产名称' , '房产链接','户型', '价格', '建造岁月和面积等', '地段']
    rows = zip(housename, houseName,houselink, allhousetype, houseprice, HouseDataend, Houseaddress)
    with open(csvfilepath, 'w', encoding='utf-8', newline= '') as f:
        f_csv = csv.writer(f)     # 创建csv.writer对象
        f_csv.writerow(headers)
        for row in rows:
            f_csv.writerow(row)
if __name__ == '__main__':
    main()

image.gif

五、数据库存储完整代码

import pymysql
import pandas as pd
def saveDB():
    connect = pymysql.connect(host = "127.0.0.1", port = 3306, user = "root", 密码(password) = "", database = "housedata", charset = "utf8" )
    cursor = connect.cursor()
    # 读取csv文件数据
    csv_name = r'E:\pythonProjectSpider\house.csv'
    data = pd.read_csv(csv_name, encoding = "utf-8")
    data = data.where(data.notnull(), None)
    Data = list(data.values)
    # 创建数据库表头
    query = "drop table if exists house"  # 若已有数据表hose,则删除
    cursor.execute(query)
    sql = "create table if not exists house(description varchar (100), housename varchar (100), houselink varchar (1000), housetype varchar (100), houseprice varchar (100), mainmessage varchar (100), houseaddree varchar (100)) default charset=utf8;"
    cursor.execute(sql)
    connect.commit()
    # 写入数据库
    for data in Data:
        for index in range(len(data)):
            data[index] = '"' + str(data[index]) + '"'
        sql = """insert into house values(%s)""" % ",".join(data)
        cursor.execute(sql)
        connect.commit()
    print("植入成功")
    # 关闭数据库
    connect.close()
    cursor.close()
if __name__ == '__main__':
    saveDB()

image.gif

数据库存储结果:

image.gif编辑


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
18天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
24天前
|
数据采集 安全 Python
python并发编程:Python实现生产者消费者爬虫
python并发编程:Python实现生产者消费者爬虫
25 0
python并发编程:Python实现生产者消费者爬虫
|
4天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
13 0
|
8天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
14天前
|
开发者 索引 Python
实践:如何使用python在网页的表格里抓取信息
实践:如何使用python在网页的表格里抓取信息
|
15天前
|
机器学习/深度学习 数据可视化 数据挖掘
用Python进行健康数据分析:挖掘医疗统计中的信息
【4月更文挑战第12天】Python在医疗健康数据分析中扮演重要角色,具备数据处理、机器学习、可视化及丰富生态的优势。基本流程包括数据获取、预处理、探索、模型选择与训练、评估优化及结果可视化。应用案例包括疾病预测、药物效果分析和医疗资源优化,例如使用RandomForestClassifier进行疾病预测,Logit模型分析药物效果,以及linprog优化医疗资源配置。
|
19天前
|
数据采集 存储 前端开发
Python爬虫如何快速入门
写了几篇网络爬虫的博文后,有网友留言问Python爬虫如何入门?今天就来了解一下什么是爬虫,如何快速的上手Python爬虫。
21 0
|
1月前
|
数据采集 存储 Web App开发
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
一键实现数据采集和存储:Python爬虫、Pandas和Excel的应用技巧
|
10月前
|
数据采集 Python
python使用aiohttp通过设置代理爬取基金数据
python使用aiohttp通过设置代理爬取基金数据