爬虫
python
复制代码
# python库
# requests 用来获取页面内容
# BeautifulSoup 用来提取页面中的元素
# 1.获取页面中的每一个链接
# 2.进入每个链接获取对应元素
# pip install requests
# pip install bs4
python
复制代码
import time
import pymysql
import requests
from bs4 import BeautifulSoup
python
复制代码
#获取url下的页面内容,返回soup对象
def get_page(url):
response = requests.get(url)
soup = BeautifulSoup(response.text,'lxml')#提供一种lxml的解析格式
return soup
# 封装成函数,作用是获取列表页下面的所有租房页面的链接,返回一个链接列表
def get_links(link_url):
soup = get_page(link_url)
links_div = soup.find_all('div',class_ = "content__list--item")
links = [div.a.get('href') for div in links_div] #使用列表推导式构建一个新的列表
return links
#shift + M:框向下合并
#获取房屋详细信息
def get_house_info(house_url):
soup = get_page(house_url)
div = soup.find('div',class_ = "content__aside--title")
if div != None:
price = soup.find('div',class_ = "content__aside--title").span.text#价格
unit = soup.find('div',class_ = "content__aside--title").text[5:8]#单价
info_div = soup.find('div',class_ = "content__article__info")
house_info = info_div.ul.find_all('li', class_ = 'fl oneline')
area = house_info[1].text[3:]#面积
direction = house_info[2].text[3:]#朝向
floor = house_info[7].text[3:]#楼层
layout_div = soup.find('ul',class_ = "content__aside__list")
layout_li = layout_div.find_all('li')
layout = layout_li[2].text[5:].strip() #户型
info = {
'价格':price,
'单价':unit,
'面积':area,
'朝向':direction,
'楼层':floor,
'户型':layout
}
return info
else:
return 'None'
def get_db(setting):
return pymysql.connect(**setting)
def insert(conn, house):
vaules = "'{}',"*5 + "'{}'"
sql_values = vaules.format(house['价格'],house['单价'],house['面积'],
house['朝向'],house['楼层'],house['户型'])
sql = """
insert into house_info(price,unit,area,direction,floor,layout)
values({});
""".format(sql_values)
#打印插入语句
print(sql)
#创建游标
cursor = conn.cursor()
#执行sql插入
cursor.execute(sql)
#提交sql插入语句
conn.commit()
python
复制代码
values = "'{}',"*5+"'{}'"
svalues = values.format(1,2,3,4,5,6)
svalues
sql = "{}".format(svalues)
sql
python
复制代码
DATABASE = {
'host':'127.0.0.1',
'database':'lianjia',
'user':'root',
'password':'123qwe'
}
conn = get_db(DATABASE)
links = get_links('https://bj.lianjia.com/zufang/')
for link in links:
time.sleep(2)#设置两秒读取一个页面
link = 'https://bj.lianjia.com' + link
house = get_house_info(link)
if house != 'None':
print('获取一个房子信息成功')
print('网址为:%s'%(link))
print(house, end='\r')#\r代表回车符
insert(conn, house)
pass
else:
print('获取一个房子信息失败')
pass
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1889968478874501120.html
{'价格': '6800', '单价': '元/月', '面积': '83.00㎡', '朝向': '南 北', '楼层': '高楼层/22层', '户型': '南/北 高楼层/22层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('6800','元/月','83.00㎡','南 北','高楼层/22层','南/北 高楼层/22层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1892882486606692352.html
{'价格': '5500', '单价': '元/月', '面积': '76.00㎡', '朝向': '南 北', '楼层': '低楼层/28层', '户型': '南/北 低楼层/28层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('5500','元/月','76.00㎡','南 北','低楼层/28层','南/北 低楼层/28层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1776912742876184576.html
{'价格': '5388', '单价': '元/月', '面积': '95.00㎡', '朝向': '南 北', '楼层': '低楼层/24层', '户型': '南/北 低楼层/24层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('5388','元/月','95.00㎡','南 北','低楼层/24层','南/北 低楼层/24层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1890316563584647168.html
{'价格': '6200', '单价': '元/月', '面积': '63.00㎡', '朝向': '南', '楼层': '高楼层/4层', '户型': '南 高楼层/4层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('6200','元/月','63.00㎡','南','高楼层/4层','南 高楼层/4层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1734931428581310464.html
{'价格': '4223', '单价': '元/月', '面积': '89.31㎡', '朝向': '南 北', '楼层': '低楼层/7层', '户型': '南/北 低楼层/7层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('4223','元/月','89.31㎡','南 北','低楼层/7层','南/北 低楼层/7层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1889174856377827328.html
{'价格': '3800', '单价': '元/月', '面积': '95.75㎡', '朝向': '南', '楼层': '低楼层/5层', '户型': '南 低楼层/5层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('3800','元/月','95.75㎡','南','低楼层/5层','南 低楼层/5层');
获取一个房子信息失败
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1892484578489139200.html
{'价格': '4100', '单价': '元/月', '面积': '92.00㎡', '朝向': '南 北', '楼层': '中楼层/7层', '户型': '南/北 中楼层/7层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('4100','元/月','92.00㎡','南 北','中楼层/7层','南/北 中楼层/7层');
获取一个房子信息失败
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1892808790579871744.html
{'价格': '5000', '单价': '元/月', '面积': '86.51㎡', '朝向': '南 北', '楼层': '中楼层/14层', '户型': '南/北 中楼层/14层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('5000','元/月','86.51㎡','南 北','中楼层/14层','南/北 中楼层/14层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1773955754940694528.html
{'价格': '4120', '单价': '元/月', '面积': '39.63㎡', '朝向': '南', '楼层': '低楼层/5层', '户型': '南 低楼层/5层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('4120','元/月','39.63㎡','南','低楼层/5层','南 低楼层/5层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1893328913262706688.html
{'价格': '6000', '单价': '元/月', '面积': '48.90㎡', '朝向': '北', '楼层': '高楼层/21层', '户型': '北 高楼层/21层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('6000','元/月','48.90㎡','北','高楼层/21层','北 高楼层/21层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1890995106006171648.html
{'价格': '6500', '单价': '元/月', '面积': '75.08㎡', '朝向': '南 北', '楼层': '高楼层/18层', '户型': '南/北 高楼层/18层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('6500','元/月','75.08㎡','南 北','高楼层/18层','南/北 高楼层/18层');
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1861392335263236096.html
{'价格': '2850', '单价': '元/月', '面积': '103.54㎡', '朝向': '南 北', '楼层': '低楼层/12层', '户型': '南/北 低楼层/12层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('2850','元/月','103.54㎡','南 北','低楼层/12层','南/北 低楼层/12层');
获取一个房子信息失败
获取一个房子信息失败
获取一个房子信息成功
网址为:https://bj.lianjia.com/zufang/BJ1893939431702790144.html
{'价格': '3550', '单价': '元/月', '面积': '42.42㎡', '朝向': '南', '楼层': '中楼层/5层', '户型': '南 中楼层/5层'}
insert into house_info(price,unit,area,direction,floor,layout)
values('3550','元/月','42.42㎡','南','中楼层/5层','南 中楼层/5层');
获取一个房子信息失败
获取一个房子信息失败