爬取贝壳网的40000条基本数据
总共分为四部分:
1.获得网页URL
2.获得网页数据
3.过滤数据,获得需要的数据
4.完整代码
一,获得网页URL
#先导入库
import urllib.request,urllib.error
from bs4 import BeautifulSoup
import re
#建立一个主函数,该代码都所有函数都在主函数执行
def main():
baseurl="https://sjz.ke.com/ershoufang/pg/" #获得贝壳网网址
def Geturl(baseurl):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59"}
repo=urllib.request.Request(baseurl,headers=headers)
html=''
try:
reponse=urllib.request.urlopen(repo)
html=reponse.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
User-Agent数据在右击检查中的network里面截取:
如果头不对,会报404
二,通过beautifulsoup过滤网页数据
def GetDate(baseurl):
for i in range(0,1): #页数
url=baseurl+str(i*30) #每页的数量
html=Geturl(url)
soup = BeautifulSoup(html, "html.parser") #建立soup对象
for item in soup.find_all("li", class_="clear"): #查找匹配的字符串 这里是找a标签的字符串 减少查找范围
data = []
item=str(item)
print(item)
for item in soup.find_all(“li”, class_=“clear”) 是缩短数据的筛选范围
三.通过re正则表达式 获得数据
#创建正则表达式对象 查找目标的对象
findTitle=re.compile(r'<img.*title="(.*?)"',re.S) #标题对象 re.S 让换行符包含在字符中
findImgSrc=re.compile(r'<img.*data-original="(.*?)"',re.S)#图标对象
findHref=re.compile(r'<a.*href="(.*?)"') #超链接对象
findpricemi=re.compile(r'<span>单价(\d*)元/平米</span>') #平方米/块
然后在GetDate函数里面用re去查找并保存数据
LinkTitle=re.findall(findTitle,item)[0] #将标题数据追加到列表
data.append(LinkTitle)
LinkSrc = re.findall(findImgSrc,item)[0] #通过正则表达式查看指定的字符串 [0]是表示只查取遇到的第一个字符串
data.append(LinkSrc)
LinkHref = re.findall(findHref, item)[0] #将超链接数据追加到列表
data.append(LinkHref)
Linkpricemi=re.findall(findpricemi,item)[0]
data.append(Linkpricemi)
datalist.append(data)
return datalist
四,完整代码
import urllib.request,urllib.error
from bs4 import BeautifulSoup
import re
import xlwt #进行excel操作
#保存所有的信息
datalist = []
def main():
baseurl="https://sjz.ke.com/ershoufang/pg/" #获得贝壳网网址
datalist=GetDate(baseurl)
# print(datalist)
savepath="贝壳网二手房"
# saveData(data)
#创建正则表达式对象 查找目标的对象
findTitle=re.compile(r'<img.*title="(.*?)"',re.S) #标题对象 re.S 让换行符包含在字符中
findImgSrc=re.compile(r'<img.*data-original="(.*?)"',re.S)#图标对象
findHref=re.compile(r'<a.*href="(.*?)"') #超链接对象
findpricemi=re.compile(r'<span>单价(\d*)元/平米</span>') #平方米/块
# #获取数据 过滤数据
def GetDate(baseurl):
for i in range(0,99): #页数
url=baseurl+str(i*30) #每页的数量
html=Geturl(url)
soup = BeautifulSoup(html, "html.parser") #建立soup对象
for item in soup.find_all("li", class_="clear"): #查找匹配的字符串 这里是找a标签的字符串 减少查找范围
data = []
item=str(item)
print(item)
LinkTitle=re.findall(findTitle,item)[0] #将标题数据追加到列表
data.append(LinkTitle)
LinkSrc = re.findall(findImgSrc,item)[0] #通过正则表达式查看指定的字符串 [0]是表示只查取遇到的第一个字符串
data.append(LinkSrc)
LinkHref = re.findall(findHref, item)[0] #将超链接数据追加到列表
data.append(LinkHref)
Linkpricemi=re.findall(findpricemi,item)[0]
data.append(Linkpricemi)
datalist.append(data)
return datalist
#得到指定一个URL的网页内容
def Geturl(baseurl):
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36 Edg/91.0.864.59"}
repo=urllib.request.Request(baseurl,headers=headers)
html=''
try:
reponse=urllib.request.urlopen(repo)
html=reponse.read().decode("utf-8")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
return html
if __name__=="__main__":
main()
然后可以把数据通过xlwt保存为excel 或者sqlite3保存为数据库
这里数据太多就没进行保存的
如果保存为excel可以看看这个博主https://blog.csdn.net/shancyr45/article/details/103381059