Python 如何通过网络爬虫 简单爬取“安居客”网站的租房信息

  • 爬虫准备

本次爬取使用的python版本是3.6,由于代码以及爬取规则较为简单,基本都能够运行

使用Pycharm进行编写

编写前安装好requests库和bs4库以及lxml(若已经安装好Pycharm的同学,可以很简单的通过自带IDE进行安装)

方法1:

(直接在代码编辑界面写requests,若没有安装或者导入,会出现红色波浪线,鼠标光标放在红色波浪线,按下Alt+Enter,下列表选择import或者选择install)

方法2:

在Pycharm选择File->setting,然后Project Interpreter,这里出现你已经安装的库,点击+号,在这里搜索需要的库,找到后选择install package ,等待完成后就可以使用这个库了。

(由于在python的编写中会用到大量的库,很多时候有些库Pycharm不一定会安装成功,这时候就需要手动安装,本文用到的request和bs4都可以直接安装)

  • 爬虫原理

最简单的爬虫也就是理解为模拟一个人去访问一个网站,然后服务器会回应你的请求,返回一个response包回来,而我们要做的就是如何解析这个包,把这个包中的信息提取出来,而这个包,我们就可以广义的理解为一个html5文档,所以作为爬虫,最重要的核心部分就是它的爬取规则,接下来会详细说到

  • 爬取过程

整个爬取的过程,我用流程的方式来描述,假若是python爬虫大佬,对于这个爬取想必易如反掌,但是对于初学的同学,我还是一步步的编写来介绍整个爬取的过程。

首先打开Pycharm,新建一个项目,我这里的项目名字是new,因为这个爬虫是我项目的一部分,我这里把它揪出来详说,(实际开发不能这么乱取名字),新建一个文件夹叫crawler,在这个文件夹下新建一个.py文件

因为我今天爬取的网站是“安居客”,就直接找的是宁波鄞州区的数据,同学可以选择自己所在城市网站的数据。我这里爬取的网址是:https://nb.zu.anjuke.com/fangyuan/yinzhou/p1/

我们仔细分析这个网页的数据,我们需要四个数据,房屋描述,房屋细节,房屋地址,房屋租金。

我们浏览器按F12,查看html文档,发现每个租房的信息都是放在一个div中,这样就可以通过BeautifulSoup库的find_all都找到。

下面回到Pycharm中进行实现,在class类中定义一个叫get_crawler_infomation的方法,具体方法名可以取,通过requests库得到html信息,这里一定要注意,一定要添加headers和cookie的信息,我试验过若不加入头信息,“安居客”网站反爬虫检测到非法访问以后会禁止这台电脑访问它的站点,具体headers和cookies信息可以在浏览器中找到

假如这个时候我们打印获取到的信息,print(resp.text),控制台会输出这个URL的html5页面

然后我们运用BeautifulSoup的find_all()方法得到所有的div,每一个div相当于一条信息,过滤掉其他不要信息,比如广告,脚本等其他代码。

接下来分析html5页面,可以看到这个大红框中就是一条房屋信息,而每个紫色的框就是我要的内容

对应到python,我们for一个循环,每一次循环相当于得到一条房屋的信息,最后遍历完所有房屋信息,编写具体的爬取规则如下:

核心的爬取方法还是运用find_all()方法,如有不清楚为什么这么用,可以参考这个说明文档的网站,https://beautifulsoup.readthedocs.io/zh_CN/latest/

最后控制台输出就可以得到我所要爬取的信息,过程中运用了简单正则表达式,看不懂的同学可以先照着打,然后去好好补习一下,这里的主要目的还是为了使得到的信息更干净,去除一些不想要的字眼。

所有代码如下:

# 宁波租房房价爬虫类
import re
import time

import bs4
import requests


class nignbo_housing_price_crawler:
    def get_crawler_infomation(self, url):
        # 一定要设置headers信息
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
        }

        cook = {
            'Cookie': ''  # 这里的Cookie信息根据自己浏览器具体情况来设置
        }

        resp = requests.get(url, cookies=cook, headers=headers)
        resp.encoding = resp.apparent_encoding
        soup = bs4.BeautifulSoup(resp.text, "lxml")

        # 通过find_all找到所有div元素
        zoom_info = soup.find_all(name="div", class_="zu-itemmod")

        for item in zoom_info:
            # 房屋简介
            zoom_describe = item.a["title"]

            # 房屋超链接
            zoom_link = item.a["href"]

            # 房屋规模、楼层、售楼人信息
            zoom_details_find = item.p.text.strip()
            pat = re.compile(r'[\u4e00-\u9fa50-9]+')
            zoom_details_find_list = pat.findall(zoom_details_find)
            zoom_details_final_result = '-'.join(zoom_details_find_list)

            # 房屋地址
            zoom_address_find = item.find_all(name="address", class_="details-item")[0].text.strip()
            zoom_address_result_list = pat.findall(zoom_address_find)
            zoom_address_final_result = "-".join(zoom_address_result_list)

            # 房屋售价
            zoom_price = item.find_all(name="strong")[0].text

            # 打印爬取信息
            print(zoom_describe, zoom_link, zoom_details_final_result, zoom_address_final_result, zoom_price)

            time.sleep(0.2)
            pass
        pass

    pass


if __name__ == '__main__':
    # 设置url
    url = "https://nb.zu.anjuke.com/fangyuan/yinzhou/p1/"

    # main函数调用方法,传入url参数
    nignbo_housing_price_crawler().get_crawler_infomation(url)

    pass

猜你喜欢

转载自blog.csdn.net/weixin_38362180/article/details/89308430