本次爬取使用的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