爬取旅游景区网站数据
任务:
我们国家有丰富的旅游资源,进入中国旅游信息资源网站 http://scenic.cthy.com/可以查
看到各种各样的旅游信息,例如选择查看 5A 景区,就可以看到全国 5A 景区的介绍,如图
1 所示,这个项目的任务是从这个网站中爬取部分 5A 景区的数据。
图 1 景区信息
一、 解析网站 HTML 代码
我们使用 Chrome 浏览器在网站中找到一个景区,点击鼠标右键弹出菜单选择“检查”
就可以看到如图 2 所示的 HTML 代码。
图 2 HTML 代码
我们可以看到景区的数据都在
的元素中,每个景区在一个
元素中,复制出一个景区的 HTML 代码,整理后得到:
1
二、爬取网站景区数据
访问景区的网站,获取 HTML 代码,创建一个 soup 的 BeautifulSoup 对象:
url="http://scenic.cthy.com/scenicSearch/0-0-201-0-0-1.html"
resp=urllib.request.urlopen(url)
html=resp.read().decode()
soup=BeautifulSoup(html,"lxml")
我们使用 soup 对象爬取数据。
1、 爬取景区列表
景区的数据都在
的元素中,这个元素包含很多
的景区项目,因此:
divs=soup.find("div",attrs={"class":"sightlist"}).find_all("div",attrs={"class":"sightshow"})
循环这个 divs 得到每个景区的
元素对象 div。
2、爬取景区名称
景区名称在
self.con.close()
def insertDB(self,sName,sType,sSource,sLevel,sTime,sHotel):
try:
sql="insert into scenes (sName,sType,sSource,sLevel,sTime,sHotel) values
(?,?,?,?,?,?)"
self.cursor.execute(sql,[sName,json.dumps(sType),json.dumps(sSource),sLevel,sTime,json.dumps(
sHotel)])
except:
pass
def spider(self,url):
try:
resp=urllib.request.urlopen(url)
html=resp.read().decode()
soup=BeautifulSoup(html,"lxml")
divs=soup.find("div",attrs={"class":"sightlist"}).find_all("div",attrs={"class":"sightshow"})
for div in divs:
dd=div.find("div",attrs={"class":"sightdetail"})
sName=dd.find("h4").find("a").text
lis = dd.find("ul", attrs={"class": "sightbase"}).find_all("li")
sType = []
if len(lis) > 0:
for link in lis[0].find_all("a"):
sType.append(link.text)
sSource=[]
if len(lis)>1:
for link in lis[1].find_all("a"):
sSource.append(link.text)
if len(lis)>2:
sLevel=lis[2].find("span").find("a").text
sTime = lis[2].find("a",recursive=False).text
else:
sLevel=""
sTime=""
lis = dd.find("ul", attrs={"class": "sighthotel"}).find_all("li")
sHotel = []
for li in lis:
h = {}
h["name"] = li.find("a").text
h["price"] = li.find("span").text
sHotel.append(h)
8