bs4爬取重庆链家在售二手房房源信息(总共爬取3000条)
写这篇博客两个目的,第一是总结复习最近一个月工作学习的爬虫内容,第二是给想学习python或者爬虫,但是没有python基础的童鞋们一些建议(不要怕,python是一门工具(或者是手艺),学习手艺最关键的就是做事情(写爬虫入门吧)。我是非CS出身,之前学过半年R语言,因为现在工作需要用到python,所以先学爬虫,大致了解一下python语言。
链家的网站目前是不设防的(没有反爬机制),所以爬起来是非常轻松的,也能够增加大家初学python或爬虫的信心。
准备阶段
第一步,工具准备
1.安装好python,然后我的编译器是pycharm。
2.选取爬取网站 https://cq.lianjia.com/ershoufang/
第二步,安装好需要的库,我这里是用BeautifulSoup爬取的,所以安装requests、bs4、 re、time(也可以用Xpath爬取,需要安装相应的库,time是设置访问频率的,两秒,太频繁可能禁止访问)
第三步,观察所需要爬取的网页信息
我这里筛选信息是区域:江北,然后选取区域后,最多可以显示100页,每页有房源30条,我现在是处于第二页和第三页,所以网页URL分别是是https://cq.lianjia.com/ershoufang/jiangbei/pg2/
https://cq.lianjia.com/ershoufang/jiangbei/pg3/
网页URL包含了筛选的区域即jiangbei,还有第二页pg2和第三页pg3,这就是网页URL变化的规律(如果要爬取南岸区的在售二手房房源信息,可以把jiangbei改成nanan)。
开始爬取
爬虫就是抓取网页解析的数据,然后提取自己想要的信息
1.解析网页,这里是用的是BeautifulSoup解析网页
URL = "https://cq.lianjia.com/ershoufang/jiangbei/pg2"
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3766.400 QQBrowser/10.6.4163.400"}
res = requests.get(URL, headers=header)
soup = BeautifulSoup(res.text, "lxml")
2.我们先爬取江北第二页30条房源的标题信息(鼠标悬在所选信息上,单击右键,点检查就可以看到网页代码)
可以看到,标题信息是在div class="title"下面的,抓取第一个房源标题信息
title = soup.select(".title")[1].text
抓取第二个房源标题信息
title = soup.select(".title")[2].text
这个网页共有30条房源信息,所以只需要一个for循环就可以全部抓取
for i in range(0, 30, 1):
title = soup.select(".title")[i].text
print(title)
效果如下
依旧葫芦画瓢,抓取其它剩下的房源信息(总价、单价、位置、户型、面积、朝向、装修、楼层,还有两个信息我就没有爬下来了,其实我最关心的就是单价)
链家每套房源都有自己唯一的房源编号,房源编号的信息在div class="tilte"下面能够找到
就是这串数字,提取第一套房源编号
numbers = soup.select(".title")
t = str((list(numbers))[1])
number = "N" + re.findall('\d+', t)[0]
3.写一个for循环,从第一页循环到第101页
现在所有房源信息都已经提取,然后写入json就可以了。效果如下
刚好30*100=3000条房源信息
下面附上所有代码
import requests
from bs4 import BeautifulSoup
import re
import time
URL_B = "https://cq.lianjia.com/ershoufang/jiangbei/pg"
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3766.400 QQBrowser/10.6.4163.400"}
for j in range(1,101,1):
URL = URL_B+str(j)
time.sleep(2)
html = requests.get(URL,headers = header)
soup = BeautifulSoup(html.text,"lxml")
for i in range(0, 30, 1):
numbers = soup.select(".title")
t = str((list(numbers))[i])
number = "N"+re.findall('\d+', t)[0]
title = soup.select(".title")[i].text
total = soup.select(".totalPrice")[i].text
unit = soup.select(".unitPrice")[i].text
huxing = str(soup.select(".houseInfo")[i].text.split("|")[0])
mianji = str(soup.select(".houseInfo")[i].text.split("|")[1])
chaoxiang = str(soup.select(".houseInfo")[i].text.split("|")[2])
zhuangxiu = str(soup.select(".houseInfo")[i].text.split("|")[3])
louceng = str(soup.select(".houseInfo")[i].text.split("|")[4])
with open(r'重庆江北二手房在售房源信息' + '.json', 'a', encoding='utf-8') as f:
f.write(str(
{"房屋编号": number, "标题": title, "总价": total, "单价": unit, "户型": huxing,
"面积": mianji,
"朝向": chaoxiang,
"装修":zhuangxiu,
"楼层":louceng,}) + '\n')
小结
链家江北在售二手房房源远远不止3000条,只是筛选条件之后只能展示100页的信息,如果要爬更多的江北房源信心,需要将筛选条件细分,可能筛选之后的信息不会像URL中jiangbei这个参数这么明显了,可能要再filter中寻找信息,但是能够爬下来链家房源信息对于新手来讲,肯定是信心大增。但是现在网站反爬机制越来越多,比如房天下的重定向,某查查的动态网页,爬取这些网站需要更多的技巧,等以后有时间了再写怎么爬取这两个网站的。最后附上镇宇镇楼