Python介绍(17)

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米'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demoatnes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值