首页 > 编程知识 正文

用Python爬取链家新房数据

时间:2023-11-20 05:25:57 阅读:291463 作者:NEQX

你是否遇到过需要查看某个城市、某个小区、某个户型的新房信息,但是不想人工逐个浏览链家网站每一个页面的情况?那么接下来我们将介绍如何使用Python爬取链家新房数据,实现自动化数据获取。

一、获取页面HTML

首先需要获取待爬取页面的HTML源码。这可以通过Python的requests库实现。我们可以使用requests.get()方法来获取页面HTML代码,并使用BeautifulSoup库解析页面HTML代码,方便我们后续的信息提取。

import requests
from bs4 import BeautifulSoup

url = 'https://bj.fang.lianjia.com/loupan/pg1/'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

上述代码中,我们设置一个url变量作为目标URL,使用requests库的get()方法发送GET请求,获取到对应网页的HTML代码,再用BeautifulSoup库将其解析为soup对象。

二、解析页面数据

在获取到页面的HTML之后,我们需要从中提取出相关的信息。与requests和BeautifulSoup配合使用的是正则表达式(re)库。在按照页面进行解析时,我们通常需要使用正则表达式来提取特定的信息。

import re

house_items = soup.select('.resblock-desc-wrapper')
house_titles = [item.select('a')[0].get_text() for item in house_items]
house_prices = [item.select('.main-price')[0].get_text() for item in house_items]
patterns = re.compile(r'(?<=href=").+?(?=">)')
house_links = [patterns.findall(str(item))[0] for item in house_items]

上述代码中的`.select()`方法用来定位soup对象中的具体标签或者标签组,`get_text()`方法用来获取标签内的文本,`re.compile()`方法用来获取特定字符串,本例中获取的是所在楼盘的链接。由于每个标签的结构都是类似的,所以我们可以使用列表推导式将所需的信息一一提取出来。

三、构建信息列表

将提取出来的信息进行组合,并将其存储到一个列表中,方便之后进行处理和存储到数据库中。

info_list = []
for i in range(len(house_items)):
    info_dict = {}
    info_dict['house_title'] = house_titles[i]
    info_dict['house_price'] = house_prices[i]
    info_dict['house_link'] = house_links[i]
    info_list.append(info_dict)

上述代码中,我们定义了一个空列表`info_list`用于储存所有的信息,随后使用一个for循环遍历每个节点,将提取到的结构化信息储存在一个名为`info_dict`的字典对象中,并将字典对象存储到`info_list`列表中。

四、多页爬取

如果我们需要爬取的房产信息比较多,那么往往需要多页进行遍历。这里我们可以使用一个封装好的函数,用于自动生成待爬行的URL。

def get_url_list(city, page):
    url = 'https://{0}.fang.lianjia.com/loupan/pg{1}/'.format(city, page)
    return url

city = 'bj'
start_page = 1
end_page = 10
url_list = []
for i in range(start_page, end_page + 1):
    url = get_url_list(city, i)
    url_list.append(url)

上述代码中,我们定义了一个`get_url_list()`函数来自动生成待爬页面URL,这里默认输入了要爬取的城市和页码。而后使用for循环遍历每页页面,并将其放进一个列表中。

五、保存数据至数据库

最后,我们将获取到的数据存储到数据库中。这里我们使用的是MySQL数据库。首先需要安装好对应的库,即pymysql库,安装完成之后可以使用下面的代码实现数据保存。

import pymysql

database = 'house'
host = 'localhost'
username = 'root'
password = 'password'
port = '3306'
conn = pymysql.connect(host=host, port=int(port), user=username, password=password, db=database, charset='utf8')
cursor = conn.cursor()
sql = '''
CREATE TABLE IF NOT EXISTS `house_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `house_title` varchar(300) NOT NULL,
  `house_price` varchar(100) NOT NULL,
  `house_link` varchar(500) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
'''
# 创建数据表
cursor.execute(sql)
# 插入数据
for data in info_list:
    values = tuple(data.values())
    cursor.execute('INSERT INTO house_info(house_title, house_price, house_link) VALUES(%s, %s, %s)', values)
    conn.commit()
cursor.close()
conn.close()

上述代码中,我们首先定义了一些MySQL数据库连接的参数,包括数据库名称、主机地址、用户名、密码、端口号等。然后将这些参数传入到`pymysql.connect()`函数中来创建一个连接对象`conn`。接着我们可以使用`cursor()`方法获得一个数据库相关的操作游标`cursor`。在执行过程中,我们使用循环将获取到的数据写入数据库中。

六、总结

通过以上步骤,我们可以实现自动化获取并存储所需链家房产信息的目标。这样不但方便了我们的查找,而且提高了工作效率。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。