1. 程式人生 > >爬取我的愛書

爬取我的愛書

一、機制:例如在瀏覽器中輸入www.baidu.com回車,實際是由瀏覽器找到這個網址所對應的IP地址,向IP地址的伺服器傳送一個請求,伺服器會給一個響應,通過HTTP協議進行通訊。

二、HTTP協議是Hyper Text Transfer Protocol(超文字傳輸協議)的縮寫,是從WWW 伺服器傳輸超文字到本地瀏覽器的傳送協議 

      HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法,HTTP是一個客戶端和伺服器端請求和應答的標準(TCP)。客戶端是終端使用者,伺服器端是網站。通過使用Web流量器、網路爬蟲或者其它的工具,客戶端發起一個到伺服器上指定埠的HTTP請求。

三、爬蟲爬取資料的原理:

  1. 構造一個請求
  2. 傳送請求,獲取伺服器端的響應
  3. 從響應內容裡提取我們所需要的特定資料

四、爬蟲的作用和應用場景:

       在資訊時代,面對海量資料,我們需要一種高效便捷的手段來幫助我們進行資料分析和獲取。

五、原始碼:

 #!/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"#列印關閉爬取