【實戰視頻教程】使用scrapy爬知乎live信息

【公眾號:大鄧python】用scrapy爬取知乎live_騰訊視頻 https://v.qq.com/x/cover/u0551wi70m1/u0551wi70m1.html

一、知乎Live抓包分析

打開知乎Live網址

zhihu.com/lives

打開瀏覽器開發者工具(F12)

我們直接拖動頁面向下滾動,Network中就出現了很多網址和數據。 其中如下圖的網址

數據與網頁直播的title對應上了。說明找到了對應的網址。而且這數據還是json格式,使用起來特別方便。

網址如下

api.zhihu.com/lives/hom{offset}&includes=live

只需要更改offset即可請求相應網址對應live信息

為了節約時間,今天我就只爬live標題和演講者。

二、創建scrapy項目

打開終端命令行輸入

scrapy startproject livespider [項目存放的文件夾的路徑]n

我在桌面上首先新建了一個scrapysqlite文件夾,然後才在終端創建livespider,項目存放於scrapysqlite文件夾中

現在我們用Pycharm打開livespider項目

現在我們看下打開後的文件目錄

三、livespider項目解讀

上圖打開的項目目錄,都是scrapy startproject livespider這個命令行回車後自動生成的。

文件或文件夾功能spiders文件夾是用來存放爬蟲邏輯的文件夾items.pyspider文件夾中的爬蟲腳本解析的數據,通過items.py組織數據形式pipelines.py爬蟲解析出的數據,通過items封裝後傳遞給管道,流到資料庫或數據文件。pipelines實際上就是配置資料庫或數據文件的settings.py整個爬蟲項目的配置文件middleware.py一般不怎麼用,忽略。

四、創建spider

我們要在spiders文件夾里創建一個zhihu.py 爬蟲(spider)。我們可以通過點擊Pycharm下方的Terminal,輸入

scrapy genspider zhihu zhihu.comn

生成zhihu.py文件,爬蟲允許爬的域名為zhihu.com

五、settings.py設置

現在我們要開始對項目進行全局配置。 打開settings.py文件,將

ROBOTSTXT_OBEY = Truen改為(不遵守機器人協議,方便爬取數據)nROBOTSTXT_OBEY = Falsen

取消DOWNLOAD_DELAY的注釋符#,並賦值為1。 此處為限制爬蟲的訪問網站速度。

取消DEFAULTREQUESTHEADERS的注釋,並填寫zhihu頁面解析時的headers請求頭

DEFAULT_REQUEST_HEADERS = {n User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36,n Authorization:oauth 8274ffb553d511e6a7ffffffn}n

這裡注意,經過測試發現,如果沒有Authorization,只有useragent,是無法正常訪問知乎網站的。所以自己查找並填寫。

取消ITEM_PIPELINES的注釋符#

六、items.py配置

因為今天為了省事,我們就只爬知乎Live的標題和演講者。

items.py功能相當於爬蟲解析出的數據需要一個結構化的容器封裝,方便傳遞給pipelines使用。

形象一點的比喻就是,items將數據打包,方便運輸。本項目中的zhihu.py爬蟲將網站中得到的數據通過items的形式打包數據,傳遞給pipelines水管,並將數據流入資料庫保存。

打開items.py文件,將文件修改為

from scrapy import Field,Itemnnclass LivespiderItem(Item):n # define the fields for your item here like:n # name = scrapy.Field()n title = Field()n speaker = Field()n

現在開始我們先創建好資料庫,然後在配置pipelines.py Pycharm實際上可以可視化操作sqlite。

七、SQLite在PyCharm中的使用

7.1配置SQLite

步驟如下:

  1. 打開pycharm,在最右側點擊Database按鈕,如圖中的紅色數字1位置

然後依次點擊2、3

2. sqlite資料庫要能在Pycharm中第一次使用,需要先安裝驅動。

圖中底部紅線指示,點擊Download即可

7.2 創建sqlite資料庫

選擇scrapy創建好的livespider項目路徑,並將資料庫命名為zhihulive.db ,點擊apply和ok

7.3 創建表

按照圖中的123,依次點擊Database 、zhihulive.db 、main

點擊圖中紅框,先設置Table表名為LiveTable。 點擊加號,依次設置了id為主鍵整數型自增序號。title和speaker均為TEXT格式數據

創建好資料庫和表,後面我們就要在pipeline.py中操作數據。

八、pipelines.py配置

打開pipelines.py你會看到如下默認代碼

import sqlite3

class LivespiderPipeline(object): def process_item(self, item, spider): pass

我們應該首先知道,pipelines是為了將數據存入數據的。

  • 爬蟲啟動時候,要打開資料庫。
  • 爬蟲運行時候要將數據寫入資料庫。
  • 爬蟲結束的時候要關閉資料庫。

依次對應的scrapy默認的功能函數為

def open_spider(self,spider): n pass nndef process_item(self, item, spider): n #寫入資料庫或數據文件 n return itemn ndef close(self,spider): n #關閉資料庫 n passn

根據上面的知識,我們完成了下面的pipelines.py 的配置。注意format傳遞值的時候,前面的變數是要用 {}。

import sqlite3nnclass LivespiderPipeline(object): nn def open_spider(self,spider):n #初始化爬蟲,開啟資料庫或者新建一個csv文件 n self.con = sqlite3.connect(zhihulive.db)n self.cur = self.con.cursor() nn n def process_item(self, item, spider): n #寫入資料庫或數據文件n title = item[title]n speaker = item[speaker]n sql_command = "INSERT INTO LiveTable (title,speaker) VALUES ({title},{speaker})".format(title=title, speaker=speaker)n self.cur.execute(sql_command)n self.con.commit() return itemn n def close_spider(self,spider): #關閉資料庫或者數據文件n self.con.close()n

九、spider的書寫

前面所有的準備都是為了這一刻,我們能夠將爬到的數據存起來。現在我們開始爬蟲的邏輯,也是最關鍵的部分。spiders文件夾下的zhihu.py

在ZhihuSpider類中,scrapy框架有默認的請求函數start_requests ,該函數對網址發起請求,yield方式返回的相應數據傳遞給該ZhihuSpider類中的parse函數解析。

9.1 start_requests函數

callback是回調,也就是說start_requests得到的網頁數據要傳輸給parse函數解析。

def start_requests(self):n starturl = https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live n yield Request(url=starturl, callback=self.parse)n

9.2 parse函數

parse函數負責解析數據,將數據以item形式封裝,並以yield方式傳輸給pipelines,最終寫入資料庫。

yield其實很像return,只不過,return後會結束函數。而yield的函數相當於生成器,返回結果後並不直接結束函數,而是保留狀態,下次運行函數會按照上次的位置繼續迭代下去。

from scrapy import Spider,Requestnfrom livespider.items import LivespiderItemnimport jsonnnclass ZhihuSpider(Spider):n name = zhihun allowed_domains = [zhihu.com]n start_urls = [http://zhihu.com/] nn def start_requests(self):n starturl = https://api.zhihu.com/lives/homefeed?limit=10&offset=10&includes=live n yield Request(url=starturl, callback=self.parse) nn def parse(self, response):n item = LivespiderItem()n result = json.loads(response.text)n records = result[data] n for record in records:n item[title] = record[live][subject]n item[speaker] = record[live][speaker][member][name] n #將item傳給pipelines.py保存到資料庫 n yield itemn n next_page_url = result[paging][next]+&includes=live n yield Request(url=next_page_url, callback=self.parse)n

全部寫好了。現在在Pycharm終端Terminal中輸入

scrapy crawl zhihu

開始愉悅的爬數據,而且還能用Pycharm看到資料庫中的數據

這部分寫的很粗糙,不懂的可以反覆看我的視頻。

項目代碼在這期公眾號的文章末尾

公眾號:大鄧帶你玩Python

推薦閱讀:

玩轉貼吧
Python 爬蟲|深入請求(二):URL

TAG:Python | Python入门 | 爬虫 |