你是否遇到过需要查看某个城市、某个小区、某个户型的新房信息,但是不想人工逐个浏览链家网站每一个页面的情况?那么接下来我们将介绍如何使用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`。在执行过程中,我们使用循环将获取到的数据写入数据库中。
六、总结
通过以上步骤,我们可以实现自动化获取并存储所需链家房产信息的目标。这样不但方便了我们的查找,而且提高了工作效率。