前文介紹了python的scrapy爬蟲框架和登陸知乎的方法.
這裏介紹如何爬取知乎的問題信息,並保存到mysql數據庫中.html
以下圖所示,我要爬取一個問題的6個信息:python
爬取結果我保存到mysql數據庫中,表名爲:zhihu_question
以下圖中,紅框裏的就是上圖是有人爲個人穿着很輕浮,我該如何迴應?
問題的信息.
(回答個數,關注着和瀏覽次數數據不一致是由於我是在爬取文章信息以後的一段時間才抽出來時間寫的文章,在這期間回答個數,關注着和瀏覽次數都會增加.)
mysql
我用的是scrapy框架中自帶的選擇器selectors
.
selectors經過特定的 XPath
或者 CSS 表達式來「選擇」 HTML文件中的某個部分。
XPath 是一門用來在XML文件中選擇節點的語言,也能夠用在HTML上。 CSS 是一門將HTML文檔樣式化的語言。
XPath最最直觀的介紹:
例如:知乎問題頁面上的標題的XPath以下:
圖中紅框裏就是標題的XPath.(這只是一個直觀的介紹,還有一些細節能夠在代碼中看到)
sql
爬取問題的相關信息只須要問題url便可,我這裏把收集的問題url寫到文件中,爬蟲程序去遍歷文件,而後依次爬取.
我是在登陸成功知乎後的check_login
這個方法裏面構造的起始url,因此讀文件的方法也在這裏,代碼以下:chrome
def check_login(self, response): # 驗證登陸成功以後構造初始問題url file = open("/root/py_project/zhihu/zhihu/conf/start_questions.txt") while 1: line = file.readline() line = line.strip('\n') #去掉最後的換行 if not line: break if(line[0:1] == "#"): #若是是#開頭的url, 跳過 print line pass else: print("current url : " + line) yield scrapy.Request(line,callback=self.parse_question, headers=self.headers) file.close()
其中最重要的一行是:
yield scrapy.Request(line,callback=self.parse_question, headers=self.headers)
yield scrapy.Request 表明開始爬取一條url,若是有多個url就yield屢次. 這裏的次數等同於start_question.txt
中非#開頭的url
以下:
數據庫
callback=self.parse_question
是請求url地址後,返回的response的回調處理函數,也是整個爬取過程當中最核心的代碼.
以下:框架
def parse_question(self,response): item = QuestionItem() url = response.url questionid=url[url.rindex("/")+1:] item['questionid']=questionid item['title']=response.selector.xpath('//*[@class="QuestionHeader-title"]/text()')[0].extract() descarr=response.selector.xpath('//span[@itemprop="text"]/text()') if len(descarr) > 0: item['desc']=descarr[0].extract() else: item['desc']="-" item['answer_num']=response.selector.xpath('//*[@id="QuestionAnswers-answers"]/div/div/div[1]/h4/span/text()[1]')[0].extract().replace(',','') item['attention_uv']=response.selector.xpath('//strong[@class="NumberBoard-itemValue"]/text()')[0].extract().replace(',','') item['read_pv']=response.selector.xpath('//strong[@class="NumberBoard-itemValue"]/text()')[1].extract().replace(',','') yield item
其中主要代碼是用selectors.xpath
選取咱們須要的問題信息(注意:這裏的路徑並不必定與 chrome的debug模式中複製的xpath一致,直接複製的xpath通常不太能用,本身看html代碼結構寫的),
獲取到問題的信息以後放到item.py
中定義好的QuestionItem
對象中,而後yield 對象
, 會把對象傳遞到配置的pipelines中.
pipelines通常是在配置文件中配置,
由於這裏爬取問題只保存到mysql數據庫,並不下載圖片,(而爬取答案須要下載圖片)因此各自在在爬蟲程序中定義的pipelines
,以下:scrapy
custom_settings = { 'ITEM_PIPELINES' : { 'zhihu.mysqlpipelines.MysqlPipeline': 5 #'scrapy.pipelines.images.ImagesPipeline': 1,#這個是scrapy自帶的圖片下載pipelines } }
以上是爬取知乎問題的整個大體過程.
後文介紹爬取收藏夾下的回答 和 問題下的回答(包括內容和圖片).函數