网络爬虫Python试验
網絡爬蟲
這次去杭州參加阿里巴巴的離線大數據處理暑期課,得到一個思路。
之前一直糾結于沒有數據要怎么訓練我的旅行個性化推薦。畢設木有頭緒啊,做不粗來要人命呀!
現在覺得可以在網上爬一些數據下來,看看能不能分析出各個景點之間的關系。
現在 開貼記錄自己的工作。
?2013.7.24
使用urllib。(3.0以后urllib2就整合到urllib中了,見【這里】)
import urllib.request c = urllib.request.urlopen('http://www.baidu.com') contents = c.read() print(contents[0:50])代碼參考自《集體智慧編程》,然后根據python3.2做了一些改動。
可以看到爬下來的一些東西
除了爬蟲以外,我們還需要HTML和XML的解析器。
http://www.crummy.com/software/BeautifulSoup/bs4/doc/
安裝好以后,我們試一下beautiful soup 4
?現在安裝一下python和mysql的連接器。地址見?http://dev.mysql.com/downloads/connector/python/
鏈接數據庫的方法見?http://smilejay.com/2013/03/python3-mysql-connector/
?過濾字母和數字
之前的構想是打算濾掉字母、數字、空白標示符、HTML標簽,只留下中文字符和最基本的標點符號。今早醒來想一想,覺得這樣不行,因為濾掉的這些部分其實含有豐富的信息。比如a標簽的路徑和內容都是文章與其他網頁的重要關聯。h標簽和em標簽也是同理。而且css部分,看似無用,其實可以用來判斷這個站點是否夠新鮮(通過它使用的css技術,例如是否使用了自適應、聲明的doc類型是否夠潮。當然,站點的新鮮程度與內容的重要程度是不太有關系的)。總之,今天需要做一些改動,把完整的網頁信息保存下來,而不是只保存文本的部分。以后要用到哪些,再拿來分析和提取。
————————————————————
2013.7.26?代碼備份
#2013-7-26 import mysql.connector import sys, os from bs4 import BeautifulSoup from urllib.request import urlopen from html.parser import HTMLParser import re#數據庫相關操作 class DBconnector:user = 'root'pwd = 'root'host = '127.0.0.1'db = 'test'cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = cnx.cursor()def __init__(self):passdef __del__(self):self.cursor.close()self.cnx.close()def createTable():create_table_sql = "CREATE TABLE IF NOT EXISTS testpages ( \url varchar(100) , \title varchar(50), content varchar(10000) ) \CHARACTER SET utf8"try:self.cursor.execute(create_table_sql)except mysql.connector.Error as err:print("create table 'pages' failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def insert(self,url, title, content):sql = "REPLACE INTO pages (url, title, content) VALUES ('{}', '{}', '{}')".format(url, title, content)try:self.cursor.execute(sql)except mysql.connector.Error as err:print("replace into table 'pages' - failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()#從html中刪去標簽 class MLStripper(HTMLParser):def __init__(self):super().__init__()self.reset()self.fed = []def handle_data(self, d):self.fed.append(d)def get_data(self):return ''.join(self.fed)def strip_tags(html):s = MLStripper()s.feed(html)return s.get_data()class Crawler:initURL = "http://lvyou.baidu.com/"conn = DBconnector()def webCapture(self):c = urlopen(self.initURL).read()c1 = "你好啊fdfdafd123456,.fdle)("soup = BeautifulSoup(c)links = soup('a')links.append(self.initURL)for link in links:c_temp = urlopen(link.href).read()print(link.href)soup = BeautifulSoup(c_temp)temp_links = soup('a')links += temp_linkstemplate = re.compile(r'\d|[a-z]|[A-Z]|\\|\/|<.*>|{|}|\s|-|#|"|\'')#body = template.sub('',strip_tags(c))body = template.sub('',str(soup.body))print(body)self.conn.insert(link, soup('title'), body)crawler = Crawler() crawler.webCapture()————————————————————
2013.7.27
今天更新了一些代碼
#20130727 import mysql.connector import sys, os from bs4 import BeautifulSoup from urllib.request import urlopen from html.parser import HTMLParser import re import hashlib#數據庫相關操作 class DBconnector:user = 'root'pwd = 'root'host = '127.0.0.1'db = 'test'cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = cnx.cursor()def __init__(self):passdef __del__(self):self.cursor.close()self.cnx.close()def createTable():create_table_sql = "CREATE TABLE IF NOT EXISTS testpages ( \url varchar(100) , \title varchar(50), content varchar(10000) ) \CHARACTER SET utf8"try:self.cursor.execute(create_table_sql)except mysql.connector.Error as err:print("create table 'pages' failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def insert(self,url, title, content):sql = "REPLACE INTO pages (url, title, content) VALUES ('{}', '{}', '{}')".format(url, title, content)try:self.cursor.execute(sql)except mysql.connector.Error as err:print("replace into table 'pages' - failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def select(self, url):select_sql = "select content from pages where url ='{}'".format(url)try:self.cursor.execute(select_sql)for content in self.cursor:return contentexcept mysql.connector.Error as err:print("query table 'mytable' failed.")print("Error: {}".format(err.msg))sys.exit()#從html中刪去標簽 class MLStripper(HTMLParser):def __init__(self):super().__init__()self.reset()self.fed = []def handle_data(self, d):self.fed.append(d)def get_data(self):return ''.join(self.fed)def strip_tags(html):s = MLStripper()s.feed(html)return s.get_data()class Crawler:conn = DBconnector()#判斷一個頁面是否已經爬過def pageExist(self, url):charge = self.conn.select(url)print('---charge---',charge)if charge:return Trueelse:return False#將頁面內容寫入文件中,以url的sha256命名,并返回文件名def writeToFile(self, url, content):location = 'G:\\pages\\'m = hashlib.sha256()m.update(url.encode('utf-8'))f = open(location + m.hexdigest(),'wb')f.write(content)f.closeprint('writing file: ' + url)return m.hexdigest()#將路徑、網頁標題、文件名存入數據庫中def writeToDB(self, conn, url, title, filename):self.conn.insert(url, title, filename)#解析網頁,分析出標題、鏈接、內容,并返回def parsePage(self, url):content = urlopen(url,timeout=5000).read()soup = BeautifulSoup(content)links = []tempLinks = [soup.a['href'],]print('--tempLinks--',tempLinks)for tempLink in tempLinks:if self.pageExist(tempLink):continueelse:#判斷是否是一條完整的路徑print('tempLink->' + tempLink)protocol = re.findall(r'http|https',tempLink)if len(protocol) == 0:print('none protocal has found')#從8開始找是因為https://的最后一個/剛好在第七位end = url.find('/',8)domain = url[0:end + 1]tempURL = ''.join(domain + tempLink)else:tempURL = tempLinkprint('tempURL->' + tempURL)links += [''.join(tempURL),]title = soup.titlereturn (title, links, content)def webCapture(self):links = ['http://www.cnblogs.com',]#"http://xian.cncn.com/"for link in links:print("current link->" + link)#解析頁面(title, addlinks, content) = self.parsePage(link)links += addlinks#將頁面內容寫入文件filename = self.writeToFile(link, content)#將url、標題、頁面對應的文件名寫入數據庫中 self.writeToDB(self.conn, link, title, filename)crawler = Crawler() crawler.webCapture()————————————————————
2013.7.29
今天的爬蟲,因為編碼的原因整得人焦頭爛額
1、URL open timeout 是一種常態,一定要寫try catch來處理這種情況,不能讓爬蟲因為鏈接超時而退出
2、urllib的urlopen貌似只接受ascii型的參數,查了半天也沒找到什么好辦法, 最后還是進python33/lib/http/下面改了
client.py文件的953行
request.encode('ascii')為request.encode('utf-8')才終于跑起來了……
今天更新的代碼:(PS:晚上待著實驗室真是一種喂蚊子的節奏……T_T)
#2013.7.29 import mysql.connector import sys, os from bs4 import BeautifulSoup import urllib from urllib.request import urlopen from html.parser import HTMLParser import re import hashlib import socket import imp#數據庫相關操作 class DBconnector:user = 'root'pwd = 'root'host = '127.0.0.1'db = 'test'cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = cnx.cursor()def __init__(self):passdef __del__(self):self.cursor.close()self.cnx.close()def createTable():create_table_sql = "CREATE TABLE IF NOT EXISTS testpages ( \url varchar(100) , \title varchar(50), content varchar(10000) ) \CHARACTER SET utf8"try:self.cursor.execute(create_table_sql)except mysql.connector.Error as err:print("create table 'pages' failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def insert(self,url, title, content):sql = "REPLACE INTO pages (url, title, content) VALUES ('{}', '{}', '{}')".format(url, title, content)try:self.cursor.execute(sql)except mysql.connector.Error as err:print("replace into table 'pages' - failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def select(self, url):select_sql = "select content from pages where url ='{}'".format(url)try:self.cursor.execute(select_sql)for content in self.cursor:return contentexcept mysql.connector.Error as err:print("query table 'mytable' failed.")print("Error: {}".format(err.msg))sys.exit()#從html中刪去標簽 class MLStripper(HTMLParser):def __init__(self):super().__init__()self.reset()self.fed = []def handle_data(self, d):self.fed.append(d)def get_data(self):return ''.join(self.fed)def strip_tags(html):s = MLStripper()s.feed(html)return s.get_data()class Crawler:conn = DBconnector()#判斷一個頁面是否已經爬過def pageExist(self, url):charge = self.conn.select(url)if charge:return Trueelse:return False#將頁面內容寫入文件中,以url的sha256命名,并返回文件名def writeToFile(self, url, content):location = 'G:\\pages\\'m = hashlib.sha256()m.update(url.encode('utf-8'))f = open(location + m.hexdigest(),'wb')f.write(content)f.closeprint('writing file: ' + m.hexdigest())return m.hexdigest()#將路徑、網頁標題、文件名存入數據庫中def writeToDB(self, conn, url, title, filename):self.conn.insert(url, title, filename)#解析網頁,分析出標題、鏈接、內容,并返回def parsePage(self, url):socket.setdefaulttimeout(2)try:content = urlopen(url).read()except urllib.error.URLError:print('URL open time out!')return None, None, Noneexcept socket.timeout:print('socket time out!')return None, None, Nonesoup = BeautifulSoup(content)links = []tempLinks = []atags = soup.findAll('a', attrs={'href': re.compile("^http://|https://")})print('len of atags->', len(atags))#從a標簽中提取出路徑放入tempLinks中for atag in atags:tsoup = BeautifulSoup(str(atag))turl = tsoup.a['href']if turl in tempLinks:continueelse:tempLinks += [turl]for tempLink in tempLinks:if self.pageExist(tempLink):continueelse:#判斷是否是一條完整的路徑#print('tempLink->' + tempLink)protocol = re.findall(r'http|https',tempLink)if len(protocol) == 0:#從8開始找是因為https://的最后一個/剛好在第七位end = url.find('/',8)domain = url[0:end + 1]tempURL = ''.join(domain + tempLink)else:tempURL = tempLinklinks += [''.join(tempURL),]title = soup.titlereturn (title, links, content)def webCapture(self):links = ['http://lvyou.baidu.com/xian',]#"http://xian.cncn.com/"for link in links:#print("current link->" + link)#解析頁面(title, addlinks, content) = self.parsePage(link)if title == None and addlinks == None and content == None:continueelse:links += addlinks#將頁面內容寫入文件filename = self.writeToFile(link, content)#將url、標題、頁面對應的文件名寫入數據庫中temp = re.compile(r'<.*>')title = temp.sub('',str(title))self.writeToDB(self.conn, link, title, filename)crawler = Crawler() crawler.webCapture()————————————————————
2013.7.31
今天重寫了links循環的部分,抓網頁的量也上去了。不過抽查一部分抓到的網頁發現,基本上全被ajax占領了。最后紀念一下這些天的代碼。明天改用Scrapy框架來抓。
#20130731 import mysql.connector import sys, os from bs4 import BeautifulSoup import urllib from urllib.request import urlopen from html.parser import HTMLParser import re import hashlib import socket import imp#數據庫相關操作 class DBconnector:user = 'root'pwd = 'root'host = '127.0.0.1'db = 'test'cnx = mysql.connector.connect(user=user, password=pwd, host=host, database=db)cursor = cnx.cursor()def __init__(self):passdef __del__(self):self.cursor.close()self.cnx.close()def createTable():create_table_sql = "CREATE TABLE IF NOT EXISTS testpages ( \url varchar(100) , \title varchar(50), filename varchar(64) ) \CHARACTER SET utf8"try:self.cursor.execute(create_table_sql)except mysql.connector.Error as err:print("create table 'pages' failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def insert(self,url, title, filename):sql = "REPLACE INTO pages (url, title, filename) VALUES ('{}', '{}', '{}')".format(url, title, filename)try:self.cursor.execute(sql)except mysql.connector.Error as err:print("replace into table 'pages' - failed.")print("Error: {}".format(err.msg))sys.exit()self.cnx.commit()def select(self, url):select_sql = "select filename from pages where url ='{}'".format(url)try:self.cursor.execute(select_sql)for filename in self.cursor:return filenameexcept mysql.connector.Error as err:print("query table 'pages' failed.")print("Error: {}".format(err.msg))sys.exit()#從html中刪去標簽 class MLStripper(HTMLParser):def __init__(self):super().__init__()self.reset()self.fed = []def handle_data(self, d):self.fed.append(d)def get_data(self):return ''.join(self.fed)def strip_tags(html):s = MLStripper()s.feed(html)return s.get_data()class Crawler:conn = DBconnector()#判斷一個頁面是否已經爬過def pageExist(self, url):charge = self.conn.select(url)if charge:return Trueelse:return False#將頁面內容寫入文件中,以url的sha256命名,并返回文件名def writeToFile(self, url, filename):location = 'G:\\pages\\'m = hashlib.sha256()m.update(url.encode('utf-8'))f = open(location + m.hexdigest(),'wb')f.write(filename)f.closeprint('writing file: ' + m.hexdigest())return m.hexdigest()#將路徑、網頁標題、文件名存入數據庫中def writeToDB(self, conn, url, title, filename):self.conn.insert(url, title, filename)#解析網頁,分析出標題、鏈接、內容,并返回def parsePage(self, url):socket.setdefaulttimeout(2)try:content = urlopen(url).read()except urllib.error.URLError:print('URL open time out!')return None, None, Noneexcept socket.timeout:print('socket time out!')return None, None, Noneexcept ConnectionAbortedError:print('socket time out!')return None, None, Nonesoup = BeautifulSoup(content)links = []tempLinks = []atags = soup.findAll('a', attrs={'href': re.compile("^http://|https://")})print('len of atags->', len(atags))#從a標簽中提取出路徑放入tempLinks中for atag in atags:tsoup = BeautifulSoup(str(atag))turl = tsoup.a['href']if turl in tempLinks:continueelse:tempLinks += [turl]while len(tempLinks) != 0:tempLink = tempLinks.pop()if self.pageExist(tempLink):continueelse:#判斷是否是一條完整的路徑#print('tempLink->' + tempLink)protocol = re.findall(r'http|https',tempLink)if len(protocol) == 0:#從8開始找是因為https://的最后一個/剛好在第七位end = url.find('/',8)domain = url[0:end + 1]tempURL = ''.join(domain + tempLink)else:tempURL = tempLinklinks += [''.join(tempURL),]title = soup.titlereturn (title, links, content)def webCapture(self):links = ['http://lvyou.baidu.com/search?word=%E8%A5%BF%E5%AE%89&type=1']#"http://xian.cncn.com/"while len(links) != 0:link = links[0]print('links array length:',len(links))addlinks = self.handlePage(link)del links[0]if addlinks != None:links += addlinksdef handlePage(self,link):(title, addlinks, content) = self.parsePage(link)if title == None and addlinks == None and content == None:return Noneelse:#將頁面內容寫入文件filename = self.writeToFile(link, content)#將url、標題、頁面對應的文件名寫入數據庫中temp = re.compile(r'<.*>')title = temp.sub('',str(title))self.writeToDB(self.conn, link, '', filename)return addlinkscrawler = Crawler() crawler.webCapture()現在爬蟲的帶處理網頁list有鏈接7W多條
之前最高有大到26W。不過爬到的質量太差,有很多被掛馬的、廣告的,還有很頭疼的ajax的。哎,有點傷感。還是用框架吧。時間來不及精雕細琢一個自己的爬蟲了。
?——————————————
2013.08.01
今天換上scrapy。 方式參考其官網。
發現scrapy是不能自動解析ajax的。還需要一個模擬人類操作的東東。叫selenium RC。安裝和測試的方式見 oscarxie的博客 http://www.cnblogs.com/oscarxie/archive/2008/07/20/1247004.html
【這邊】還有老外?wynbennett?寫的一段爬帶有js代碼網頁的代碼。
?
?——————————————
2013.08.02
?selenium RC python下的【手冊】
_______________________
2013.8.3
今天的代碼,完全跟以前不一樣了。selenium真是一個深藏功與名的爬蟲利器啊。
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import hashlib import randomclass ScrapyPages:#網頁內容保存目錄contentDir = "G:\\pages\\"#網頁鏈接保存目錄atagsDir = "G:\\atags\\"#保存網頁與文件名對應關系的文件mappingFile = "G:\\mapping"#已處理的鏈接handledLinks = []#待處理的鏈接unhandledLinks = []#打開瀏覽器驅動,默認為火狐def openPage(self, url):driver = webdriver.Firefox()driver.get(url)return driver#根據url獲得文件名def urlToFilename(self, url):m = hashlib.sha256()m.update(url.encode('utf-8'))filename = m.hexdigest()tfile = open(self.mappingFile, 'wb+')tfile.write(filename + ', ' + url + '\n')return filename#保存頁面內容(僅文字)def savePageContent(self, filename, content):tfile= open(self.contentDir + filename,'wb')tfile.write(content)print('writing file-',filename)tfile.close()#處理頁面中的a標簽:#1、將a標簽存入相應的文件中#2、將其更新如links中 def handleAnchor(self, filename, anchors):hrefs = self.extractHrefFromAnchor(anchors)self.addHrefsToLinks(hrefs)self.saveAnchor(filename, hrefs)#將新提取到的鏈接(未出現過的)加入待處理鏈接中def addHrefsToLinks(self, hrefs):for href in hrefs:if href in self.handledLinks or href in self.unhandledLinks:continueelse:self.unhandledLinks += [href]#保存頁面鏈接def saveAnchor(self, filename, hrefs):afile= open(self.atagsDir + filename,'wb')afile.write('\n'.join(hrefs))afile.close()#從a標簽中提取鏈接def extractHrefFromAnchor(self, anchors):hrefs = []for anchor in anchors:try:href = anchor.get_attribute('href').encode('utf-8')if href in hrefs:continueelse:hrefs += [href]except AttributeError:passexcept selenium.common.exceptions.StaleElementReferenceException:passreturn hrefs#爬取網頁的入口函數def scrapy(self, initURL):self.unhandledLinks += [initURL]while len(self.unhandledLinks) != 0:pos = random.randint(0,len(self.unhandledLinks) - 1)print('-pos-',pos)link = self.unhandledLinks[pos]del self.unhandledLinks[pos]driver = self.openPage(link)content = str(driver.find_element_by_xpath(".//html").text.encode('utf-8'))if len(content) > 2*1024: atags = driver.find_elements_by_tag_name("a")filename = self.urlToFilename(link)self.handleAnchor(filename, atags)self.savePageContent(filename,link + '\n' + content)driver.close()pageScrapy = ScrapyPages() pageScrapy.scrapy('http://lvyou.baidu.com/notes/36b629d671563fe1e8927d6a')selenium爬出來的質量那是杠杠的。就是每次都要打開火狐代理會有些慢。沒事,掛機吧!
除了改用selenium以外,在算法上還有2個改動。
1、以前每次取當次要處理的link時,都是從待選link list的第一個取出。這樣很容易爬到什么登陸界面啊,廣告鏈接啊之類的。后來想,如果從中間取會不會好一點?畢竟網頁的中間一般都是有用的內容,可誰知,還有很多引用圖片的網頁,完全陷入圖片的沼澤中了,姐要的是文字文字呀!后來一拍腦袋,哎,用隨機不就好了
?2、對爬到的網頁的文字部分的長度做判斷,小于2k的就直接舍棄了,畢竟真正有用的文章怎么會那么小。這樣做有一大損失,就是網頁直接的若鏈接被打斷了。但也有一大好處,不會老是爬到廣告頁上了!不過若鏈接的損失也蠻痛惜的
等等!似乎可以限制路徑的范圍,在幾個固定的網站里,這樣就可以調低接受的字符長度從而獲得站內的若鏈接了!!
回宿舍前再記錄一下這靈機一動的改變:
# -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Keys import hashlib import randomclass ScrapyPages:#網頁內容保存目錄contentDir = "G:\\pages\\"#網頁鏈接保存目錄atagsDir = "G:\\atags\\"#保存網頁與文件名對應關系的文件mappingFile = "G:\\mapping"#已處理的鏈接handledLinks = []#待處理的鏈接unhandledLinks = []#打開瀏覽器驅動,默認為火狐def openPage(self, url):driver = webdriver.Firefox()driver.get(url)return driver#根據url獲得文件名def urlToFilename(self, url):m = hashlib.sha256()m.update(url.encode('utf-8'))filename = m.hexdigest()tfile = open(self.mappingFile, 'wb+')tfile.write(filename + ', ' + url + '\n')return filename#保存頁面內容(僅文字)def savePageContent(self, filename, content):tfile= open(self.contentDir + filename,'wb')tfile.write(content)print('writing file-',filename)tfile.close()#處理頁面中的a標簽:#1、將a標簽存入相應的文件中#2、將其更新如links中 def handleAnchor(self, filename, anchors):hrefs = self.extractHrefFromAnchor(anchors)self.addHrefsToLinks(hrefs)self.saveAnchor(filename, hrefs)#將新提取到的鏈接(未出現過的)加入待處理鏈接中def addHrefsToLinks(self, hrefs):for href in hrefs:if href in self.handledLinks or href in self.unhandledLinks:continueelse:if href.find('http://lvyou.baidu.com') != -1:self.unhandledLinks += [href]#保存頁面鏈接def saveAnchor(self, filename, hrefs):afile= open(self.atagsDir + filename,'wb')afile.write('\n'.join(hrefs))afile.close()#從a標簽中提取鏈接def extractHrefFromAnchor(self, anchors):hrefs = []for anchor in anchors:try:href = anchor.get_attribute('href').encode('utf-8')if href in hrefs:continueelse:hrefs += [href]except AttributeError:passexcept selenium.common.exceptions.StaleElementReferenceException:passreturn hrefs#爬取網頁的入口函數def scrapy(self, initURL):self.unhandledLinks += [initURL]while len(self.unhandledLinks) != 0:pos = random.randint(0,len(self.unhandledLinks) - 1)print('-pos-',pos)link = self.unhandledLinks[pos]del self.unhandledLinks[pos]driver = self.openPage(link)content = str(driver.find_element_by_xpath(".//html").text.encode('utf-8'))if len(content) > 512: atags = driver.find_elements_by_tag_name("a")filename = self.urlToFilename(link)self.handleAnchor(filename, atags)self.savePageContent(filename,link + '\n' + content)driver.close()pageScrapy = ScrapyPages() pageScrapy.scrapy('http://lvyou.baidu.com/xian')數據是從百度旅游爬的,只是做畢設,希望百度不要把我ip加入黑名單…… 23:15
?__________________________
2013.8.4
昨晚雖然沒有設定最長等待時間,導致在掛機的時候被一個圖片頁面卡住了,不過還是收集到了一些網頁。今晚改進后,再繼續爬好了。
今天進入分詞階段。在網上搜了一下python下面的分詞工具,一個叫“結巴”的映入眼簾,一看是掛著github上的就很有好感,嘿嘿。
先隨便拿一個昨天爬下來的網頁試試。
?文件1.txt
http://lvyou.baidu.com/notes/2b55cfda9f42fb3bf11afb27 登錄 | 注冊 目的地|游記 百度一下 首頁 目的地指南 攻略下載 游記 畫冊 首頁 >游記攻略 >長沙鳳凰張家界9日之旅 長沙鳳凰張家界9日之旅 滿園含香 2013年07月出發 從上海到 張家界 9天 人均:1000-3000(元) 分享到: 回 復 3 | 瀏 覽 47 0 0 發表游記攻略 互動交流 只看游記 游記大圖 選中文字,就可以引用到回復中,試試吧:) 滿園含香 前言 長沙 - 鳳凰 - 張家界 - 天門山 - 猛洞河漂流 - 芙蓉鎮之旅 第一天:張家界游記之第一站--長沙完美終結篇 長沙 - 岳麓書院 - 橘子洲 第二天:張家界游記第二站---鳳凰古城之浪漫魅惑篇 鳳凰 - 虹橋 - 楊家宅 - 陳斗南故居 - 沱江 第三天:張家界游記之第三站--作別鳳凰挺進張家界篇 鳳凰沱江 - 張家界大成山水 第四天:張家界游記之第四天--金鞭溪邊畫中游篇 張家界國家森林公園 - 金鞭溪 第五天: 張家界游記之第五天--天子山景區唯美篇 老屋場 - 神兵聚會 - 天子山景區'賀龍公園` - 十里畫廊 - 黃龍洞 - 寶峰湖 選中文字加入計劃 隨時收集有效信息 只看樓主 | 回復 關注 滿園含香 發表于2013-08-04 02:37 前言 長沙- 鳳凰- 張家界- 天門山- 猛洞河漂流- 芙蓉鎮之旅 1樓7/13.1)上航FM9395 上海虹橋9:05起飛,10:45到達長沙到達長沙后在大廳集合,一共8人,先到酒店登記入住,放行李。入住錦江之星(長沙火車站店)地址:長沙市芙蓉區車站北路46號(近長沙火車站) 酒店電話:0731-88316888.阿波羅廣場是大巴去鳳凰的集合點,我們住的酒店離阿波羅廣場非常近,步行100米左右。2) 坡子街----火宮殿,品味長沙小吃1-2.長沙火車站到坡子街:可以坐旅3路(至坡子街站下),368路(至解放西路口站下步行300M左右到坡子街),112路(至解放西路口站下步行260M左右到坡子街)。約30-40分鐘。 長沙火車站到南門口:可以乘坐202路、108路在南門口下。約30分鐘。 3.這兩個地方距離不遠,都離黃興步行街很近。123路就3站,10分鐘左右。建議天氣不曬可以選擇步行。實際上我們后來沒有去坡子街,看完岳麓書院,橘子洲頭,就順路找了一家在湘江邊的飯店,一邊欣賞煙花一邊吃晚飯,倒也不錯。3) 中國四大名亭之一—愛晚亭,遠眺指點江山的橘子洲頭,岳麓書院4) 游輪暢游湘江。(周六晚湘江有煙火)PS: 提前定第二天到鳳凰的車票 ,我們去鳳凰的票是在網上訂的,只是定個位子,上車再付錢,感覺比較放心。導游提前一天電話通知我集合時間及地點。7/14 1)一早乘旅游大巴到鳳凰,估計5.5小時。我們是早上7點半發車,下午2點才到鳳凰。晚上入住鳳凰江天旅游度假村,酒店地址:沱江鎮虹橋路2號(古城內,近虹橋)也是在藝龍上定的。我們入住后發現這家酒店位置非常好,就在虹橋頭,屬于鬧中取靜的位置,第二天導游集合的地點就在我們這家酒店,說明咱選的位置好呀。2)晚飯后,欣賞鳳凰古城的夜景 7/15 1) 清晨的鳳凰一定不能錯過,在鳳凰吃過中飯后,采購食物,出發到張家界。2)在鳳凰縣城北汽車站乘車,大約4小時,到張家界。實際上我們是早8點半發車,下午2點半才到張家界。一路上顛簸不停,沒有走高速,我還暈車,非常的難受。這里說明一下,酒店可以預定鳳凰到張家界的長途車票,這樣可以保證第二天到了汽車站就走,不會落空。票價70元。3)晚上入住張家界大成山水國際大酒店,酒店地址:張家界市大庸西路,酒店電話:0744-8889999。大成山水是5星級酒店,可以在藝龍,攜程上預定酒店的限時限購優惠,我們酒店在7月的旺季,才419元一間,可謂超值。當然要早下手。 7/16 1)在酒店享用一頓豐盛的早餐,和張家界客棧老板碰頭,開始4天的張家界之旅,2)具體行程安排有張老板制定,張老板的電話是150-744-23210挺實誠的土家漢子一早帶我們去張家界森林公園,沿著金鞭溪一直走,走到白龍天梯,上袁家界,看哈利路亞山,之后乘環保車到天子山丁香榕,他的客棧就在那里,晚上我們入住他的客棧。民居,挺有家的感覺,坐在院落里吃西瓜,吃晚飯,用WIFI看快本,還是很不錯的。山上的居住條件一般,大家不要想象的有多好,只是住一晚而已。 7/17 早上5點我們到老屋場看日出,神兵點將,空中田園,我們給了他包車費200元,貌似他也沒賺,直接給了包車的司機。一大早陪我們看日出,辛苦了。 在他家吃過早飯后,我們乘環保車到賀龍公園。游覽天子山的十里畫廊,下午去了黃龍洞,寶峰湖,這一天的行程可謂安排的緊湊呀。晚上回到張家界市區,住在天門山索道對面的緯地酒店,掛4星,是張老板定的房間。7/18 因為酒店就在天門山景區的對面,所以不用趕早,吃過酒店的自助早餐之后再上山。,天門山門票包含大索道的費用,它這個索道有上站,中站,下站。張導建議我們先乘索道到上站,看玻璃棧道,之后乘上站索道下行至中站,乘景區環保車去天門洞,爬999級臺階上到天門洞,之后乘環保車到中站,乘索道到下站。我們因為有他領路沒走冤枉路。在景區碰到一對自助游的夫妻倆,多買了小索道的往返票,還走了好多路。晚上接著住在緯地酒店。 7/19 一早張導包車帶我們去猛洞河漂流,中午在芙蓉鎮吃飯,順便到芙蓉鎮看看。本來不報太大希望,去了以后才發現這個景點還是很不錯的。大人80元一張,小孩不要錢。到這里張導就完成了歷史使命了,他本來送我們到火車站,一來我們的火車是第二天下午13點鐘的,再一個張家界的出租車很便宜也好叫,所以我們就不麻煩他了,讓他早點回家見他的小女兒吧。說明一下,我們和他談的價錢是1人1600元,4天3晚的行程,包吃包住包車包門票,小孩的門票也是退還我們的。所以我們8個人實際支出11472元。之前看網上都說導游會把我們散團轉賣給其他的團,還好,我們張導一直陪著我們,晚上入住張家界逸塵國際大酒店。酒店地址:永定區濱河路188-186號。酒店電話:0744-8222222. 這家酒店是來之前我在藝龍上定的,4星,319元一間。7/20 睡到自然醒,享受酒店的豐盛早餐,外出采購火車上的食物,下午13點乘火車到上海。我們住的酒店附近有一家賣進口食品的超市,東西都比上海便宜,品質也是一樣一樣的。 7/21 中午時分抵達上海南站,回到溫馨的家,結束張家界和鳳凰之旅。以上就是我們長沙鳳凰張家界一行的住宿旅游行程單,我負責訂酒店訂機票訂車票訂導游,總之一切和錢打交道的事;含煙負責花枝招展,一切小資的事情,我們行程游記也是她一路記載一路上傳,她寫得那么好,我就不用班門弄斧了。看下段游記 | 只看樓主 | 回復 關注 0 0 共10篇帖子 | 回復(3) | 瀏覽(47) 分享到: 回復 您尚未登錄哦,請登錄后回復。 登錄 | 注冊 發布 評論 0 0 分享到 快速導航 相關目的地 張家界 相關游記 煙雨鳳凰——遇見,就是一生的眷戀(&張家界,黃龍洞,長沙) 78113 pichai_305 2012至2013兩個2B青年的鳳凰、張家界時光記憶 31123 愛旅行的y小姐 【湖了個南】張家界-鳳凰-長沙漫畫游記~重磅回歸,勿容錯過··· 40832 貓火火 如何寫出精華游記 關注微博 下載APP ?2013 Baidu 使用百度前必讀 百度旅游用戶協議 聯系我們 【免費】臺灣9日自由行,美景美食美人,應有盡有借助“結巴”寫的分詞測試代碼
# -*- coding: utf-8 -*- import jieba import jieba.analyse from collections import Counterjieba.load_userdict('dict.txt') handler = open('1','r') content = handler.read() handler.close() seg_list = jieba.cut(content) after = '\n'.join(seg_list).encode('utf-8') wfile = open('2','wb') wfile.write(after) wfile.close()tags = jieba.analyse.extract_tags(content,100) counts = [] countTags = '' splitAfter = after.split('\n') tfile = open('count','wb+') for tag in tags:words = tag.encode('utf-8')count = splitAfter.count(words)tfile.write('{},{}\n'.format(words,count)) tfile.close()使用的自定義詞典 dict.txt
阿波羅廣場 5 坡子街 5 黃興步行街 3 橘子洲頭 3 愛晚亭 1 城北汽車站 2 大成山水國際大酒店 2 大庸西路 2 哈利路亞山 3 寶峰湖 2 緯地酒店 2 天門山景區 2 逸塵國際大酒店 1分詞并排序后的結果 count.txt
張家界,30 鳳凰,21 酒店,21 游記,16 我們,30 長沙,12 坡子街,6 索道,7 入住,7 天子山,4 環保車,4 長沙火車站,4 張導,4 2013,4 天門山,4 回復,6 行程,5 導游,4 虹橋,4 黃龍洞,3 藝龍,3 含香,3 10,3 芙蓉鎮,4 晚上,6 之旅,4 金鞭,3 猛洞河,3 岳麓書院,3 登錄,4 步行,4 第二天,5 滿園,3 景區,4 攻略,3 包車,3 地址,4 下午,5 電話,5 漂流,3 老板,4 客棧,3 湘江,3 車票,3 百度,3 門票,3 早餐,3 旅游,4 目的地,3 可以,7 阿波羅廣場,2 緯地酒店,2 點半,2 橘子洲頭,2 日之旅,2 寶峰湖,2 口站,2 鳳凰古城,2 上定,2 47,2 30,2 13,2 0744,2 一早,3 上海,5 分享,3 老屋,2 這家,3 樓主,2 發車,2 第五天,2 大巴,2 分鐘,3 神兵,2 沱江,2 首頁,2 第四天,2 賀龍,2 畫廊,2 不錯,3 門洞,2 選中,2 前言,2 吃晚飯,2 豐盛,2 之后,4 飯后,2 日出,2 西路,2 位置,3 十里,2 說明,3 預定,2 山水,2 大成,2 一路上,2 火車,2 小孩,2 欣賞,2 集合,2在自己的問題域內定義個詞典還是挺有用的,不然很多詞會被拆掉。python的list.count()還是相當給力的。本來有個Counter函數應該更厲害的,不過試了一下,似乎是只能統計字母的個數,憂傷……
總結
以上是生活随笔為你收集整理的网络爬虫Python试验的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Excel表格防止重复录入数据
- 下一篇: 苹果手机测试手机电平软件,用*3001#
