爬取我的愛書
阿新 • • 發佈:2018-12-10
一、機制:例如在瀏覽器中輸入www.baidu.com回車,實際是由瀏覽器找到這個網址所對應的IP地址,向IP地址的伺服器傳送一個請求,伺服器會給一個響應,通過HTTP協議進行通訊。
二、HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是從WWW 伺服器傳輸超文字到本地瀏覽器的傳送協議
HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法,HTTP是一個客戶端和伺服器端請求和應答的標準(TCP)。客戶端是終端使用者,伺服器端是網站。通過使用Web流量器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠的HTTP請求。
三、爬蟲爬取資料的原理:
- 構造一個請求
- 傳送請求,獲取伺服器端的響應
- 從響應內容裡提取我們所需要的特定資料
四、爬蟲的作用和應用場景:
在資訊時代,面對海量資料,我們需要一種高效便捷的手段來幫助我們進行資料分析和獲取。
五、原始碼:
#!/usr/bin/python #coding:utf-8 ''' 爬取書籍 ''' import urllib2 import re from bs4 import BeautifulSoup #根據指定url獲取伺服器端響應 def OpenPage(url): Myheaders = {} #urllib2.Request 構造請求 req = urllib2.Request(url,headers=Myheaders) #相當於,在瀏覽器的位址列,輸入了網址,url是網址,headers=Myheaders用關鍵字引數賦值(因為Request不只2個引數,如果不用關鍵字引數賦值,有可能會賦到別的引數上) #啟用請求,獲取響應,獲取類文字檔案物件 f = urllib2.urlopen(req) #伺服器端響應類文字物件,通過read()方法讀取響應內容 data = f.read() #ignore replace xml..replace return data.decode("GBK",errors="ignore").encode("utf-8") def Test1(): url = "http://www.shengxu6.com/book/2967.html" print OpenPage(url) #從主頁解析資料,獲取各個章節的跳轉連結url def ParseMainPage(page): #呼叫爬蟲庫提供的相關方法,進行資料分析 #print type(page)#解析之前列印標籤格式(是字串) #html.parser, python自帶的html解析引擎,Beaut ifulSoup是爬蟲庫的一種 soup = BeautifulSoup(page,"html.parser") #print type(soup)#解析之後列印標籤格式(格式化之後變成BeautifulSoup類)格式化目的是給我們提供操作方法html #find_all方法在全文內容裡搜尋符合內容的標籤,返回一個列表 #檢索所有的href屬性(鍵值對)值中包含read字串的標籤 GetA = soup.find_all(href=re.compile("read"))#compile是正則表示式物件編譯成字串 #因為標籤內部屬性是鍵值對的方式href="" #print GetA[0]["href"]列印href屬性值,不管什麼屬性都可以取 #UrlList = []空的是可以往裡面追加 #for item in GetA:遍歷item,取到遍歷元素的類 #UrlList.append("http://www.shengxu6.com" + item["href"]) #return UrlList return ["http://www.shengxu6.com" + item["href"] for item in GetA]#和上面4行一個意思,等價 def Test2(): url = "http://www.shengxu6.com/book/2967.html" page = OpenPage(url) print ParseMainPage(page) #解析一個章節內容,獲取標題和正文 def ParseDetailPage(page): #先進行格式化 soup = BeautifulSoup(page,"html.parser") #find_all方法在全文內容裡搜尋符合內容的標籤,返回一個列表 #get_text() 方法,用於獲取標籤正文 Title = soup.find_all(class_="panel-heading")[0].get_text() Content = soup.find_all(class_="content-body")[0].get_text() #正文 #<div class="panel-body content-body content-ext">正文</div> #Div標籤,class類=“panel-body” return Title,Content def Test3(): url = "http://www.shengxu6.com/read/2967_2008175.html" page = OpenPage(url) print ParseDetailPage(page) #寫到檔案 def WriteDataToFile(data): #f = open("output.txt","a+") #f.close() #忘記關閉檔案,提供一個上下文管理器with open()as f with open("output.txt","a+") as f:#用追加寫(原因是不可能只有一個章節) f.write(data) def Test4(): WriteDataToFile("dnaidnasod") if __name__ == "__main__": url = raw_input("請輸入要爬取的小說地址:") #開啟主頁獲取主頁內容 page = OpenPage(url)#根據指定url獲取伺服器端響應 print "Clone Begin"#列印開始爬取 UrlList = ParseMainPage(page)#從主頁解析資料,獲取各個章節的跳轉連結url for item in UrlList:#遍歷 #每個item都是一個章節的url地址 detail = OpenPage(item)#開啟每一個章節 #解析章節內容,獲取標題和正文 Title,Content = ParseDetailPage(detail) print "Clone " + Title#列印進度,爬到哪一章 data = "\n\n" + Title + "\n\n" + Content#“\n\n”空格,串起來有問題,Title Content在網頁上響應的內容是Unicode碼,我們自己寫的是ascii碼“\n\n” #將資料寫入檔案 WriteDataToFile(data.encode("utf-8"))#解決上面問題 print "Clone Done"#列印關閉爬取