python爬蟲無需登陸爬取知乎問題的首答

python爬蟲無需登陸爬取知乎問題的首答

爬知乎的文章,有個好處就是可以在路途沒網的時候看,但是在知乎上用爬蟲會違法嗎?

看了一下知乎的robot文件,發現並沒有限制 ,網址zhihu.com/robot.text

而且這個教程的是類人行為,並不會對其伺服器造成太大負荷,因此就大膽的試了。

看了好幾個教程,發現爬知乎並不像想像中那麼容易,把別人的代碼複製粘貼下,運用就萬事大吉。

網上找的是教程,不過沒有一個能夠直接運行出結果的


一陣失望後,自己折騰了一番,還算是整出了個大概。下面就以這個問題為例。

準備爬的內容,和之後爬下來之後的效果。

假如爬這個網頁

問題目錄

其中的回答

廢話不多說,把代碼奉上:

#encoding:utf-8 import requestsimport refrom bs4 import BeautifulSoupimport osurl=https://www.zhihu.com/question/25906401 #把你的爬的網址輸入kv={User-Agent: Mozilla/5.0} #模擬登陸,r=requests.get(url,headers=kv) #獲取網頁print r.status_code#print(len(r.text))print(r.text) q=r.textbs=BeautifulSoup(q,"html.parser") #把獲取的網頁q熬成湯bs,便於後面解析print(bs)title=bs.title # 獲取標題filename_old=title.string.strip()filename=re.sub([/:*?"<>|], -, filename_old) # 用來保存內容的文件名,因為文件名不能有一些特殊符號,所以使用正則表達式過濾掉print filenameanswernum=bs.find("h4", class_="List-headerText") #總回答數answernum2=answernum.find(span).get_text() #獲取標籤外的內容的中文方法print(answernum2)subtitle=bs.find("div", class_="ContentItem-meta") #回答人的名字c=subtitle.find_all(meta)d=c[0].attrs[content]print(d) #< meta itemprop="name" content="春雨醫生">這種標籤內形式的查找與篩選出中文goodcount=bs.find("div", class_="List-item") #<meta content="31213" itemprop="upvoteCount"/>點贊數goodcount2=goodcount.find_all(meta)for each_goodcount2 in goodcount2: itemprop=each_goodcount2.attrs[itemprop] if itemprop=="upvoteCount": goodcount3=each_goodcount2.attrs[content] print(goodcount3)answer=bs.find("div",class_="RichContent-inner") #找到這段附近的內容print(answer)sub_folder=os.path.join(os.getcwd(), "the_key_to_question") #專門用於存放下載的電子書的目錄,名字命名為問題名if not os.path.exists(sub_folder): os.mkdir(sub_folder)os.chdir(sub_folder)k = 0index = 0name=filename + ".txt" #文件名命名為小題目with open(name, a+)as f: #增加a+從而增加文本內容,而不是重寫 f.write(answernum2.encode(utf-8)+
) for each_answer in answer: f.write([+d.encode(utf-8)+]+
) f.write(goodcount3.encode(utf-8)+點贊+
) for a in each_answer.strings: # 循環獲取每一個答案的內容,然後保存到文件中 f.write(a.encode(utf-8)+
) #選出中文大段寫入 k=k+1 index=index+1f.close()

我們拆成幾部分來說,思路大概是這樣:

  1. 先獲取目標網頁源代碼,
  2. 然後對源代碼的內容進行解析,
  3. 抽提出需要的信息,
  4. 分類保存。

1.先獲取目標網頁源代碼,

  • 寫上標識中文代碼的字元串,導入需要用的模板

  • 用request庫來獲取你要的網頁,這裡把第一行引號內的網址的最後的代碼變成你要爬的知乎問題的網址,把訪問的改成是標準的Mozilla/5.0來訪問,直接訪問的話,相當告訴知乎,我是爬蟲,就不會給你進入。如果訪問成功,就會返回200,如果返回了其它,就是不成功。

  • 把獲取的網頁用BeautifulSoup庫來解析,通俗地說,就是把源代碼熬成湯(soup),方便後處理,這個庫是很優秀的爬蟲庫。這裡可以看到是否有輸出網頁的源代碼。

2.然後對源代碼的內容進行解析,抽提出需要的信息,

  • 解析用BeautifulSoup庫獲取內容里的標題,使用re庫中的正則表達式暴力獲取裡面的中文字,其實就是篩選出標點符號過濾掉。在瀏覽器中按F12看網站的審查元素,想要爬哪部分就在代碼中搜索相應的欄位,然後判斷其所處的位置,以及是用什麼方式包裝的,網站的html有自己的包裝方式。

可以搜索,也可以把滑鼠放在對應的部分也會顯示

源代碼中的部分

標題爬取代碼

  • 獲取總回答數,用BeautifulSoup庫這裡找了兩次代碼的位置,先是找到了List-headerText這部分的代碼,再從中找到span標籤,並用.get_text()的方法去掉了。

源代碼中的部分

總回答數爬取代碼

  • 獲取回答人的名字,同樣是BeautifulSoup庫的方法,這裡篩選的方法又不一樣。先是找到的contentItem-meta的下的代碼,然後找到所有包含meta標籤的括弧里的語句,把其中的第一個meta標籤找出來(對應c[0],在python中0代表第一個),再獲取content等號後面的值。(也是BeautifulSoup庫里的函數,看到這碗湯的強大了吧。)

爬取回答人名的爬蟲代碼

  • 獲取這篇文章的點贊數,這裡的方法和上面那個類似,但是不同的是,這裡不再數meta標籤是第幾個,而找到其中的itemprop等於upvoteCount(點贊數的標誌),再取出content後的數,也就是點贊數。

源代碼

爬取代碼

  • 尋找答案,與上面類似

源代碼

爬取代碼

3.分類保存。

  • 創建文件夾並把路徑改成文件夾內,你可以改名,改綠色的部分

  • 往新建的txt里寫入爬下來的內容。文件名以問題名命名,以(『a+』打開,可以使每次在後面寫入,而不是更新文件。)可以看到,這裡的嵌套關係是:

總問題-->每個回答-->每個回答的每一行

到這裡總算大功告成啦!誒,頭髮呢?


Python是通往新世界的大門,它讓你以新的視界去看待網路,計算機,甚至得到平常人沒辦法得到的數據。

題主雖然利用業餘時間學習Python的時間總共不超過兩個月,也有一些個人的小技巧推薦一些,換你們的點贊。下面介紹一些參考:

1.《A Byte of Python》是快速入門Python好書,裡面還包括了安裝教程,書是這麼自我介紹的:這是一本由Swaroop C H編寫,旨在於介紹如何使用Python語言進行編 程的自由圖書。它以教材與指南的形式為入門者介紹Python言。如果你對電腦知識的了解僅限於如何保存文本文件的話,那這本書就是為你準備的。

2.《Python網路數據採集》講了python爬蟲的方方面面的知識,包括常用庫BeautifulSoup,超級大爬蟲的框架Scrapy,正則表達式,API,js動態庫的獲取,內容挺全,不過需要有一定的基礎會看的更明白些。

3.還是就北京理工大學在慕課上課程,嵩天老師講的明明白白,是個讓你快速入門爬蟲的方法,有python基礎的話兩三天就可以自己寫一些好玩的爬蟲了。

Python網路爬蟲與信息提取_北京理工大學_中國大學MOOC(慕課)?

www.icourse163.org圖標

4.廖雪峰的教程也挺受歡迎的,有兩種版本,2.x和3.x版本,也可以看看。有人把它爬成了PDF,不過要注意爬取速度哦。

Python 爬蟲:把廖雪峰教程轉換成 PDF 電子書?

foofish.net

預祝你的Python學習之路能一路暢通無阻,攜堅持與毅力出發,最後滿載而歸。

終於碼完啦,覺得不錯就點個贊吧~

推薦閱讀:

新一代Avalon 這款車終於國產了!一直稱霸北美市場,售價20萬,科技含量遠勝邁騰
iPhone X之後是什麼?——2018年新iPhone:照片、價格及傳聞
安防監控視頻編碼技術再升級, 巨峰科技進入H.265X時代
AI 晶元,邊緣計算之魂
miniblink介面使用文檔

TAG:python爬蟲 | Python | 科技 |