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),意思是每循环一次,让程序暂停两秒,防止请求网页频繁过快而导致爬虫失败。此篇为本人传作的第一篇代码,也是初来博客园,望各位多多关照
如有不理解可以留言啊