![dcda03a13a852eb8d1d68d92dc8bbe88.png](https://i-blog.csdnimg.cn/blog_migrate/f4ce073356f406aae5c990a0e13491c5.jpeg)
一、加载三方包
import urllib.request,urllib.error #制定URL,获取网页数据
from bs4 import BeautifulSoup #网页解析
import re #正则表达式
import xlwt #进行Excel操作
二、定义主函数
def main():
baseurl = 'https://sz.lianjia.com/zufang/longhuaqu/pg'#第一个页面的网址
datalist = getdata(baseurl)#爬取和解析的函数
savepath = '深圳龙华区租房.xls'#给结果取个名字
savedata(datalist,savepath)##3.保存数据的函数
三、定义爬取和解析的函数
3.1 正则化
findTarget = re.compile(r'target="_blank">(.*?)</a>',re.S)#r包涵所有的特殊符号
findI = re.compile(r'<i>/</i>(.*?)<i>/</i>',re.S) #re.S换行符包涵在字符串中
findHide = re.compile(r'<i>/</i>.*<i>/</i>.*<i>/</i>(.*?)<span class="hide"',re.S)
findApartment = re.compile(r'<i class="content__item__tag--authorization_apartment">(.*?)</i>')
findBrand = re.compile(r'<span class="brand">(.*?)</span>',re.S)
findTime = re.compile(r'<span class="content__list--item--time oneline">(.*?)</span>')
findM = re.compile(r'<span class="content__list--item-price"><em>(.*?)</em> 元/月</span>',re.S)
3.2 解析函数
def getdata(baseurl):
datalist=[]
for i in range(0,10): #调用10次
url = baseurl + str(i+1)#每调用一次网址+1
html = askURL(url) #保存获取到的网页源码
# 逐一解析数据
soup = BeautifulSoup(html,'html.parser')
for item in soup.find_all('div',class_="content__list--item--main"): #查找符合要求的内容
print(item)#测试用,看看得到的item是否符合要求
data = []#定义一个列表临时储存得到的数据
item = str(item)#将得到的item转换为字符串类型
target = re.findall(findTarget,item)[0]#标题提取
data.append(target)
I = re.findall(findI,item)[0]#面积提取
data.append(I)
hide = re.findall(findHide,item)#房间数目提取
if len(hide) != 0:
hide = hide[0]
data.append(hide)
else:
data.append(" ")
apartment = re.findall(findApartment, item)#房屋类型提取
if len(apartment) != 0:
apartment = apartment[0]
data.append(apartment)
else:
data.append(" ")
brand = re.findall(findBrand, item)#品牌提取
if len(brand) != 0:
brand = brand[0]
data.append(brand)
else:
data.append(" ")
time = re.findall(findTime,item)#最近维护时间提取
if len(time) != 0:
time = time[0].replace("。","")
data.append(time)
else:
data.append(" ")
m = re.findall(findM, item)[0]#租金提取
data.append(m)
print(m)#测试用,看看得到的m是否符合要求,上面的每一项都可以随意加print打印看看是不是合适
datalist.append(data)#将一个流程走完后的data数据导入datalist
print(datalist)#测试用,看看datalist是否符合要求
return datalist#返回datalist
四、定义网页获取函数
def askURL(url):
head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
#使用用户代理进行爬虫伪装
request = urllib.request.Request(url,headers=head)#获取
html = ""
try:
response = urllib.request.urlopen(request)#打开
html = response.read().decode('utf-8')#使用utf-8方式读取
print(html)#测试用,可以看看过程,用来打印完整网页代码
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)#如果有错误,打印错误代码
if hasattr(e, "reason"):
print(e.reason)#如果有错误,打印错误原因
return html
五、定义保存函数
def savedata(datalist,savepath):
print('save...')#保存开始
book = xlwt.Workbook(encoding="utf-8",style_compression=0)#生成一个工作本
sheet = book.add_sheet('深圳龙华区租房',cell_overwrite_ok=True)#生成一个excel表
col = ('标题',"面积","房间数","房屋类型","品牌","上次维护","租金")#列名
for i in range(0,7):
sheet.write(0,i,col[i])#写入列名
for i in range(0, 300):
print("第%d条"%(i+1))#告诉我们保存到了第几条数据
data = datalist[i]
for j in range(0,7):
sheet.write(i+1,j,data[j])#写入上面的到的数据
book.save(savepath)#保存
六、调用主函数
if __name__ == '__main__': #当程序执行时调用函数
main()
print('爬取完成')
七、结果
![7691638756bc89c0ae1a3967059a97ff.png](https://i-blog.csdnimg.cn/blog_migrate/3552dff34f447b6b61f364ae3b54af70.png)
![997ecefe5e0a64678d978419e114ab40.png](https://i-blog.csdnimg.cn/blog_migrate/1c3e4e3fa5ff8fe881a708a593aa6141.jpeg)
八、重点
正则化和解析函数,说难也难,说简单也简单,多试几次就会了,祝好运。