3.15 Python爬虫 (三)
上述获取了列表,下面用函数表示: 封装成函数,作用是获得列表页下面的所有租房页面的链接,返回一个链接列表
In [151]:
import requests
from bs4 import BeautifulSoup
封装成函数:
作用是,获取列表页(get_links)下面的所以租房页面的链接,返回一个链接列表。
In [180]:
def get_links(url):
responce = requests.get(url)
soup = BeautifulSoup(responce.text,'lxml')
links_div = soup.find_all('div',class_="pic-panel")
links = (div.a.get('href')for div in links_div)
return links
#返回的是一个链接列表
In [182]:
url = 'https://bj.lianjia.com/zufang/'
get_links(url)
Out[182]:
(['https://bj.lianjia.com/zufang/101102663605.html',
'https://bj.lianjia.com/zufang/101102657620.html',
'https://bj.lianjia.com/zufang/101102627382.html',
'https://bj.lianjia.com/zufang/101102562541.html',
'https://bj.lianjia.com/zufang/101102601891.html',
'https://bj.lianjia.com/zufang/101102612472.html',
………………
再定义一个url 叫 house_url :
house_url = 'https://bj.lianjia.com/zufang/101102627382.html'
responce = resquests.get(house_url)
soup = BeautifulSoup(responce.text,'lxml')
此时发现和上面的 links_url 做法相同,下面要想办法优化代码
responce = requests.get(url) 和 soup = BeautifulSoup(responce.text,'lxml') 前后都有,是一样的,封装成 get_page
#获取 url 下的页面内容,返回 soup 对象
In [229]:
def get_page(url): #获得页面
responce = requests.get(url)
soup = BeautifulSoup(responce.text,'lxml')
return soup
#封装成列表,作用是获得列表页下面的所有租房页面的链接,返回一个链接列表
def get_links(url):
soup = get_page(link_url)
links_div = soup.find_all('div',class_="pic-panel")
links = [div.a.get('href')for div in links_div]
return links
两个框合并,Shift + M
重新定义下面的( def get_house_info(house_url): ),才能运行出来,不报错
In [8]:
house_url='https://bj.lianjia.com/zufang/101102595781.html'
soup=get_page(house_url)
#因为下面要用到,要先运行一次
In [9]:
def get_house_info(house_url):
house_url = 'https://bj.lianjia.com/zufang/101101798181.html'
soup = get_page(house_url)
#找想要的原素
price = soup.find('span',class_='total').text # 价格
unit = soup.find('span',class_='unit').text.strip() # 单位
house_info = soup.find_all('p',class_='if') #可去掉'class_='if' 不影响查找
area = house_info[0].text[3:] #面积
layout = house_info[1].text[5:] #户型信息
floor = house_info[2].text[3:] #楼层
direction = house_info[3].text[5:] #方向
subway = infor_div[4].text[3:] #地铁
下面分步操作:
In [184]:
house_url = 'https://bj.lianjia.com/zufang/101102627382.html'
soup = get_page(house_url)
#价格
In [186]:
soup.find('span',class_ ='total').text
Out[186]:
'8200'
In [187]:
unit = soup.find('span',class_='unit').text
unit.strip
Out[187]:
‘元/月’
# 单位
In [189]:
unit = soup.find('span',class_='unit').text
unit
Out[189]:
'\n元/月\n'
# strip 函数作用切除字符串两边的空格、换行
# 应用strip函数 出来的应该是 ‘元/月’
# invalid syntax —— 无效的语法 , 语法错误
In [191]:
unit = soup.find('span',class_='unit').text
unit.strip()
Out[191]:
'元/月'
#class都在p里面,p里面又都是一样的lf所以只能find_all
In [192]:
house_info = soup.find_all('p',class_='lf')
house_info
#结果获得的5个信息:面积,房屋户型,楼层,房屋朝向,时间
Out[192]:
[<p class="lf"><i>面积:</i>101平米 (套内77平米)</p>,
<p class="lf"><i>房屋户型:</i>2室1厅1卫 整租</p>,
<p class="lf"><i>楼层:</i>低楼层 (共21层)</p>,
<p class="lf"><i>房屋朝向:</i>南 北</p>,
<p class="lf"><i>时间:</i>14天前发布</p>]
#我们对应面积是第一个,房屋户型是第二个……,就可以把这5个信息提取出来了
In [193]:
house_info = soup.find_all('p',class_='lf')
house_info[0].text
Out[193]:
'面积:101平米 (套内77平米)'
# 面积两个字不想要 字符串切片
In [194]:
house_info = soup.find_all('p',class_='lf')
house_info[0].text[3:]
Out[194]:
'101平米 (套内77平米)'
#户型 (第二个原素 1是户型)
In [195]:
house_info = soup.find_all('p',class_='lf')
house_info[1].text[5:]
Out[195]:
'2室1厅1卫 整租'
#楼层(2是楼层)
In [196]:
house_info = soup.find_all('p',class_='lf')
house_info[2].text[3:]
Out[196]:
'低楼层 (共21层)'
#房屋朝向 (3是房屋朝向)
In [197]:
house_info = soup.find_all('p',class_='lf')
house_info[3].text[5:]
Out[197]:
'南 北'
# (4是地铁位置)可去掉'class_='if' ,找地铁位置
In [199]:
house_info = soup.find_all('p')
house_info[4].text[3:]
Out[199]:
'距地铁15号线望京东858米'