【實戰視頻教程】使用scrapy爬知乎live信息
一、知乎Live抓包分析
打開知乎Live網址
https://www.zhihu.com/lives
打開瀏覽器開發者工具(F12)
我們直接拖動頁面向下滾動,Network中就出現了很多網址和數據。 其中如下圖的網址
數據與網頁直播的title對應上了。說明找到了對應的網址。而且這數據還是json格式,使用起來特別方便。
網址如下
https://api.zhihu.com/lives/homefeed?limit=10&offset={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文件,爬蟲允許爬的域名為http://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
步驟如下:
- 打開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
推薦閱讀: