python爬虫实战——爬取北京地区短租房信息(基于BS4)

2018-12-26  本文已影响0人  libdream

目标

爬取小猪短租网北京地区短租房13页的信息,包括标题、地址、价格、房东名称、房东性别和房东头像的链接。

爬虫思路分析

(1)手动浏览小猪短租网北京地区(http://bj.xiaozhu.com/),往后翻页查看url地址构造,发现第2-4页的url地址分别是:

http://bj.xiaozhu.com/search-duanzufang-p2-0/

http://bj.xiaozhu.com/search-duanzufang-p3-0/

http://bj.xiaozhu.com/search-duanzufang-p4-0/

不难看出url地址的规律,将p后面的数字改为1http://bj.xiaozhu.com/search-duanzufang-p1-0/),发现可以正常打开第一页,因此,只要修改p后面的数字就可以构造出待爬取的13页url

image

(2)本次要爬取的信息在详细页面,因此需要先爬取详细页面的网址链接,进而爬取需要的数据。

右击第一个房源图片,点击审查元素,可以找到第一个房源详细页面的链接是"http://bj.xiaozhu.com/fangzi/31059118103.html"。老办法,右击该链接,选择Copy > Copy selector ,得到selector选择器的目标“#page_list > ul > li:nth-child(1) > a”。同样的办法,得到第二个房源的链接selector选择器的目标是"#page_list > ul > li:nth-child(2) > a",第三个是"#page_list > ul > li:nth-child(3) > a",我们可以使用“#page_list > ul > li > a”得到所有的超链接列表,再循环遍历得到每一个房源的链接。

范例代码如下:

import requests
from bs4 import BeautifulSoup
import time

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 \
(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

def judgementSex(class_name):
    #判断性别
    if class_name == ['member_ico']:
        return '女'
    else:
        return '男'
    pass

def getLinks(url):
    #获取详细页URL
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    links = soup.select('#page_list > ul > li > a')  #links为url列表(注意>符号两边都有空格,没有空格会出错)
    for link in links:
        href = link.get('href')
        getInfo(href)          #循环出的url依次调用getInfo()函数获取房源详细信息
    pass

def getInfo(url):
    #获取房源详细信息
    r = requests.get(url, headers=headers)
    soup = BeautifulSoup(r.text, 'lxml')
    titles = soup.select('div.pho_info > h4')
    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 title,address,price,img,name,sex in zip(titles,addresses,prices,imgs,names,sexs):
        data = {
            'title':title.get_text().strip(),
            'address':address.get_text().strip(),
            'price':price.get_text(),
            'img':img.get('src'),
            'name':name.get_text(),
            'sex':judgementSex(sex.get('class')),
            }
        print(data)
    pass

#主函数
if __name__ == '__main__':
    #构造多页URL
    urls = ["http://bj.xiaozhu.com/search-duanzufang-p{}-0/".format(number) for number in range(1,14)]
    for single_url in urls:
        print('正在爬取'+single_url)
        getLinks(single_url)  #循环调用getLinks()函数
        time.sleep(2)
image
上一篇 下一篇

猜你喜欢

热点阅读