爬取北京地区短租房信息
1.爬虫思路分析
(1)该博客将爬取小猪短租网北京地区短租房13页的信息。通过手动浏览以下为前四页的网址:
http://bj.xiaozhu.com/
http://bj.xiaozhu.com/search-duanzufang-p2-0/
http://bj.xiaozhu.com/search-duanzufang-p3-0/
http://bj.xiaozhu.com/search-duanzufang-p4-0/
但是我们发现把第一页的网址改为 http://bj.xiaozhu.com/search-duanzufang-p1-0/ 仍能浏览,(毕竟学爬虫是要善于发现规律的),因此只需更改p后面的数字即可,以此来构造其13页的网址。
(2)本次爬虫在详细页中进行,因此要先爬取进入详细页面的网址的链接,进而爬取数据。
(3)需要爬取的信息有:标题(tittle),地址(address),价格(price),房东名称(name),房东性别(sex),和房东头像(img)的链接,如下图所示:
2.爬虫代码分析
import requests
from bs4 import BeautifulSoup
import time #导入相应的库文件
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'} #加入请求头
def judgment_sex(class_name):
if class_name == ['member_icol']:
return '女'
else:
return '男' #定义判断用户性别的函数
def get_links(a): #定义获取详细页的url的函数
wb_data=requests.get(a,headers=headers)
soup=BeautifulSoup(wb_data.text,'lxml')
links=soup.select('#page_list > ul > li > a')
for link in links:
href=link.get('href')
get_info(href) #循环出的url函数,一次调用get_info函数
def get_info(url):
wb_data=requests.get(url,headers=headers)
soup=BeautifulSoup(wb_data.text,'lxml')
tittles=soup.select(' div.pho_info > h4 > em')
addresses=soup.select('span.pr5')
prices=soup.select('#pricePart > div.day_l > span')
imgs=soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > a > img')
names=soup.select('#floatRightBox > div.js_box.clearfix > div.w_240 > h6 > a')
sexs=soup.select('#floatRightBox > div.js_box.clearfix > div.member_pic > div')
for tittle,address,price,img,name,sex in zip (tittles,addresses,prices,imgs,names,sexs):
data={
'tittle':tittle.get_text().strip(),
'address':address.get_text().strip(),
'price':price.get_text(),
'img':img.get('src'),
'name':name.get_text(),
'sex':judgment_sex(sex.get('class'))
}
print(data) #获取信息并通过字典的形式打印出来
if __name__=='__main__': #程序的主入口
urls=['http://bj.xiaozhu.com/search-duanzufang-p{}-0/'.format(str(i)) for i in range(1,14)]#构造多页url
for url in urls:
get_links(url) #循环调用get_links()函数
time.sleep(2) #睡眠2秒
程序运行的部分结果如下图所示
本代码主要分析定义get_links函数那一块(16-22行)用于获取详细页的链接。
传入url 后,进行请求和解析。通过谷歌浏览器的‘检查’并‘Copy selector’,可以找到进入详细页的url 链接,但url并不是嵌套在标签中,而是在标签的属性当中。如下图所示:
我们知道用 get_text() 可以获取标签中的文本信息,但标签中的属性信息需要通过get(‘attr’)的方式获取得到,由上图可知,url链接在href中,这时用get(‘href’)便可获取得到网页的url。
注意:字典中的sex调用了judgment_sex()函数,用于判断房东性别
def judgment_sex(class_name):
if class_name == ['member_icol']:
return '女'
else:
return '男'
通过谷歌浏览器的检查可以发现女房东的性别为**
而男房东的性别为**,这是就可以通过class的属性来判断房东的性别。
再说:最后的代码
time.sleep(2)
,意思是每循环一次,让程序暂停两秒,防止请求网页频繁过快而导致爬虫失败。此篇为本人传作的第一篇代码,也是初来博客园,望各位多多关照
如有不理解可以留言啊