如何從零基礎開始寫一個關於搜索知乎答案的python爬蟲?

本人下學期由於課程需要用到python,現在打算先開始自學一下。都說直接動手做一個小project比先學syntax什麼的效率快,所以我現在打算做一個如下的小程序,不知道實現難度如何和需要什麼知識點,希望大神們可以給點指引,萬分感謝:

在知乎數學分類的答案裡面,篩選出所有問題超過10個擁有500贊的答案(就是說如果一個問題下面有10個答案超過500贊,條件滿足)。

本人最高水平只在能用java寫一個類似俄羅斯方塊的小遊戲。也會一點C++。從沒接觸過python, 也沒有網頁截取鏈接之類的經驗。不知道以上的想法對於新手來說有多大難度,希望大家可以給我一些指引。例如所需知識點的鏈接和博客之類什麼的。萬分感謝。


謝邀。
這個問題不算小。不過題主也不算是伸手黨,也就不用給出所有一步一步的代碼了。
我給出大概的介紹、思路和一些關鍵部分的代碼,題主再自行嘗試怎麼實現你的項目吧。

把一些坑放在前面…提醒你注意並自行解決。

編碼問題
Python2 Python3 版本不同

首先來說爬蟲。
關於爬蟲一個不太嚴謹的理解就是,你可以給爬蟲程序設定一個初始的目標頁面,然後程序返回目標頁面的HTML文檔後,從中提取頁面中的超鏈接,然後繼續爬到下一個頁面中去。從這些頁面的HTML文檔中可以通過對標籤的處理解析出你想要的具體內容。

所以我們可以這麼來簡單定義一個爬蟲的工作過程:
抓取目標頁面
解析頁面文檔獲得目的信息
繼續爬取下一個頁面
存儲結果

為了實現這些工作,你需要學習一些常用庫的簡單用法,包括但不限於:
urllib、urllib2、urllib.request、cookilib (Python的內置庫,用來處理HTTP請求)
requests (第三方庫,推薦使用requests來處理請求,比urllib方便一些)
re、beautifulsoup (正則表達式匹配內容、bs4解析html文檔)

其次呢,因為你要跟網頁的源碼打交道,尤其是解析HTML文檔,所以你最好對HTML和瀏覽器通信有點簡單的了解,會使用Firebug查看源碼定位信息在源碼中的位置。

落實到題主給出的示例

http://www.zhihu.com/topic/19554091/questions?page=1

這是知乎數學話題全部問題的URL構成。可以看到我們只要修改最後的數字就可以訪問到不同的頁數。
數學話題下一共有1254頁。所以你可以通過簡單的對page做循環遍歷獲得所有問題。
(這種做法是直接構造了地址,或者你可以在爬取每一頁以後從頁面中得到下一頁的鏈接,這樣更像是一個爬蟲)

得到列表頁的源碼後,你可以從其中獲取到每個問題的鏈接:

每頁有20個問題,所以你可以獲得到20個問題的鏈接。

之後就是對每個問題的處理:

能實現到這一步,剩下的就是循環、判斷和一些細節了。

我要出門交電費了……回來再看情況補充吧。

回來了…再寫一點。
上面說到了從話題列表提取問題鏈接。

import re
import requests
s = requests.session()
h = s.get("http://www.zhihu.com/topic/19554091/questions?page=1")
html = h.content
print html

這樣獲取到了頁面源碼以後,用正則表達式提取出問題的鏈接。

qurl = r"question/[_0-9_]{8}"
qurllist = re.findall(qurl,html)
print qurllist

如圖可以看到從源碼中抽取出的20個問題ID。
我們可以很容易地構造出問題地址。

for each in qurllist:
print "http://www.zhihu.com/"+each

到這一步以後就已經得到了問題鏈接,之後要做的就是對問題裡面的答案進行判斷了。
由於有現成的項目,我就不再重複了。你可以直接參考 @7sDream 的https://github.com/7sDream/zhihu-py3

大概就是這樣了…後面你通過對answer.upvote_num設置條件來判斷是否滿足要求就可以了。

忙完期末就開始準備考研,估計也沒太多時間接著鼓搗這些東西了…推薦你去讀上面提到的那個項目源碼就可以了,已經比較成熟了。

你也可以先參考一下我之前的一些回答:
如何入門 Python 爬蟲? - 段曉晨的回答
有誰知道對於一個菜鳥而言,學習網路爬蟲的最佳路線? - 段曉晨的回答
知乎將如何應對「狗日的知乎」計劃? - 段曉晨的回答
Python 爬蟲筆記(1):綜述 - 小段同學的雜記 - 知乎專欄


2016.4.3 update:這本書的中文版已經出了。
如果英語好,這裡有一本剛出版的 Web Scraping with Python (豆瓣) 比較全面的介紹了爬蟲的知識。這個本書採用的是 Python3 的版本。
補充:
完成題主的需求,需要 Python 的基礎知識,正則表達式基本知識,以及 Python 第三方庫 requests ,如果利用 cookie 不模擬登陸 100 行以內的代碼應該就可以做到了。


關於python爬蟲,無論百度搜索結果還是知乎里的答案都已經很多了,前人之述備矣。

我自己有一點建議,python爬蟲重點不是python,而是網路爬蟲。學習爬蟲你會把大量的精力放在網路技術和網頁製作上,什麼xpath啊css啊url啊,這些東西都不是純粹的python知識,但是卻是爬蟲最核心的事情。

所以,如果想要增進自己對python的了解,還是先找靠譜的教程看一看,不急著去做爬蟲。


從自己學習爬蟲的一點感悟來說,很同意匿名用戶答案那句:

python爬蟲重點不是python,而是網路爬蟲

私以為題主應該先了解爬蟲的原理,簡單來說你的工作大致可以分為以下幾步:

  1. 向知乎伺服器請求文檔
  2. 分析知乎伺服器給你返迴文檔
  3. 從中提取出自己想要的信息。

所以針對以上三步驟學習步驟就很快了:

  • 先了解HTTP,這裡可以用python的requests庫,知道GET和POST去請求頁面
  • 對響應的文檔做分析,所以你至少應該知道HTML,這個是很簡單的;在處理HTML文檔可以用的庫有BeautifulSoup和lxml等,搜一下這些庫的DOC
  • 學習BeautifulSoup等庫,用select等方法提取你要的信息;在這中間可能會碰到編碼問題或者需要學習正則表達式等

其實關於python爬蟲的答案知乎里已經有很多了,Google/Bing/百度也能搜出一大片視頻什麼的。我覺得題主關鍵是找一個然後動手練習,畢竟教程更加詳細。


一個寫了五年爬蟲的老coder轉行做marketing的默默路過

其實現在不管你是用什麼語言,都是可以做爬蟲的,只是現在在刮python的風,為什麼,因為有框架,因為效率高

而從HTTP協議來講,無非就是POST跟GET,請求下來的網頁,無非就是正則表達式分割字元串或xpath定位

然後從多IP,無非就是分散式採集或購買IP資源,

然後從驗證碼,無非就是圖像設別與打碼平台

然後這裡面的坑特別多,輕易別入爬蟲這一行啊啊,


http://www.zhihu.com/topic/19554091/top-answers?page=%d

這是爬取的url,簡單來說沿著頁數抓就行了。至於怎麼抓一頁的內容,有很多很多種方法。
Http請求有urllib2、scrapy 可以選,如果你想支持js,你還可以用上支持模擬瀏覽器的庫。解析頁面可以直接用xpath,可以用pyquery,可以用BS,還可以用lxml,以及還有很多庫可以用。如果你都不滿意,你還可以自己寫正則表達式解析。
如果你對爬取速度不滿意,可以用上spark。如果你想更好呈現數據,並且經常搜索,你還可以用上Elasticsearch。如果你還想存儲更多,你可以用一種關係型資料庫存一些基本信息(比如用MySQL存每個答案的question ID 和answer ID)。如果你還想存一些不怎麼規則的數據,還可以用到NoSQL(比如redis,mongoDB)。

總之你要做的就是,
從你的伺服器給指定的url發送一個Http請求,當你拿到這個這個請求的response之後,你可以從這個response中獲取你需要的任何信息,並且把他們解析出來。然後存到某個地方,當你需要這些數據的時候,最好能可視化地展現出來。

所以你需要懂,
HTTP協議,這是網路爬蟲的基礎
HTML結構,這是解析頁面的基礎
Chrome/Firefox的眾多插件用法
以及
一些資料庫的概率(如果你需要存儲)


建議題主先學習下python編程相關基礎知識,python零基礎,一來就要寫小程序,還是有點難
對於python的基礎知識,由於題主也是有編程基礎的人,所以可以直接看視頻教程學習,比如《Python編程基礎教程》
學完基礎,題主可以在網上在找一些python爬蟲實戰視頻教程來看,跟著教程一步一步學習,應該還是不難
建議題主在學習的過程中,可以順便學下django、redis、tornato、bootstrap等相關知識


人家說拿來練手 你們確說哪個語言好
太打擊題主了

所以
放心練吧
python的爬蟲 知呼很多介紹
我還想用java練手
但是
作為門外漢 根本就不知道路在哪裡


菜雞也來談談自己的想法。。。

爬蟲其實就和人瀏覽網頁是差不多的,只不過由程序代為完成,而人瀏覽網頁是通過瀏覽器這個專用的程序。
而瀏覽器實際上就是向伺服器發送HTTP 請求然後伺服器經過一系列程序動態或靜態地返回給瀏覽器資源,瀏覽器再解析。
所以爬蟲就是模擬瀏覽器的過程。。(應該是吧。。)
所以學習python爬蟲還要先了解HTTP,HTML。


先踩點,用瀏覽器的開發人員工具觀察知乎問答頁面的源碼結構吧


爬知乎用火車頭分分鐘搞定


我剛剛Python語言入門,各位大蝦都研究到這個東西了。


其實go更爽快,python並不好用,我自己寫了個簡單的,高並發,高匿代理,隨機休息,dom查詢,post可以識別驗證碼,預留了參數和介面,由於代碼風格垃圾,不想招噴,就不貼了。


推薦閱讀:

為什麼使用BeautifulSoup時,把解析器換成lxml就出錯?
如何用python 寫一個爬蟲用來爬P 站特定標籤下的高贊作品?
scrapy遇到問題,希望得到大家幫助?
對於爬蟲項目,python 2和3哪個好些?
有c#基礎,最近對爬蟲感興趣,開始轉學python,求指導?

TAG:編程語言 | Python | 編程 | 爬蟲計算機網路 | 零基礎 |