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

如有不理解可以留言啊

相关文章: