python學習之ajax和可視化管理工具

Ajax爬蟲

  1. 瀏覽器中可看到正常顯示的數據,但使用requests得到的結果並沒有。 這是什麼原因呢?
    requests獲取的是原始的HTML文檔,而瀏覽器中的頁面是經過JS處理數據後生成的結果。
  2. 這些數據的來源有哪些情況呢?
    Ajax加載、包含在HTML文檔中、經過JavaScript和特定算法計算後生成
    python學習之ajax和可視化管理工具
    Ajax(Asynchronous JavaScript and XML)異步的JS和XML。原理是: 利用JS在保證頁面
    不被刷新、頁面鏈接不改變的情況下與服務器交換數據並更新部分網頁的技術。
    python學習之ajax和可視化管理工具

    Ajax如何分析頁面?

    拖動刷新的內容由Ajax加載且頁面的URL無變化,那麼應該到哪裏去查看這些Ajax請求呢?

  3. 開發者工具(F12)->Network選項卡, 獲取頁面加載過程中Browser與Server之間請求和響
    應。
  4. 篩選出所有的Ajax請求。在請求的上方有一層篩選欄,直接點擊XHR(Ajax特殊的響應類型)
  5. 模擬Ajax請求,提取我們所需要的信息。

python學習之ajax和可視化管理工具
打開Ajax的XHR過濾器,然後一直滑動頁面以加載新的微博內容。可以看到,會不斷有
Ajax請求發出。請求的參數有4個:type、value、containerid和page。
python學習之ajax和可視化管理工具

基於Ajax和requests採集器的微博爬蟲

import os

import requests
from colorama import Fore
from fake_useragent import UserAgent
from requests import HTTPError

def download_page(url, parmas=None):
    """
    根據url地址下載html頁面
    :param url:
    :param parmas:
    :return: str
    """
    try:
        ua = UserAgent()
        headers = {
            'User-Agent': ua.random,
        }
        #請求https協議的時候, 回遇到報錯: SSLError
        #verify=Flase不驗證證書
        response = requests.get(url, params=parmas, headers=headers)
    except  HTTPError as e:
        print(Fore.RED + '[-] 爬取網站%s失敗: %s' % (url, str(e)))
        return None
    else:
        # content返回的是bytes類型, text返回字符串類型
        #response.json()方法會自動將字符串反序列爲python數據類型
        """
        html = response.text        # 字符串
        json.loads(html)            # 將字符串反序列化爲python數據類型
        """
        #return response.json()
        return response

def parse_html(html):
    """
    參考源代碼解析
    :param html:
    :return:
    """
    cards = html.get('data').get('cards')
    count = 0
    for card in cards:
        try:
            count += 1
            text = card['mblog'].get('text')
            pics = card['mblog'].get('pics')
            #todo: 1. 對於博客正文的內容進行處理: 刪除標籤(正則+re.sub)
            print("第%s篇微博正文內容: %s" % (count, text))
            if pics:
                for index, pic in enumerate(pics):
                    pic_url = pic.get('url')
                    pic_content = download_page(pic_url).content
                    #圖片網址-> 圖片名稱 https://wx1.sinaimg.cn/orj360/005N3SJDly1fyhlxakcj3j30dc0dcaa4.jpg
                    img_fname = os.path.join('weibo_pics', pic_url.split('/')[-1])
                    with open(img_fname, 'wb') as f:
                        f.write(pic_content)
                        print("下載第[%s]張圖片成功" % (index + 1))
        except Exception as e:
            print("下載博客失敗: %s" % (str(e)))

if __name__ == '__main__':
    uid = input("請輸入你要爬取微博博主的uid:")
    for page in range(10):
        url = 'https://m.weibo.cn/api/container/getIndex?uid=%s&type=uid&containerid=107603%s&page=%s' % (
        uid, uid, page)
        html = download_page(url).json()
        parse_html(html)

Scrapy可視化管理工具

Scrapyd
Scrapyd是一個用於部署scrapy項目和通過HTTP API控制爬蟲的服務軟件。
官方文檔:http://scrapyd.readthedocs.org/
Github項目地址: https://github.com/scrapy/scrapyd
Scrapyd使用教程
安裝pip install scrapyd
運行scrapyd命令,訪問127.0.0.1:6800可看到可視化界面
Scrapyd工作原理
服務器端(scrapyd): 運行客戶端部署的爬蟲。
客戶端(scrapyd-client):將本地的scrapy項目打包發送到scrapyd 這個服務端
安裝 scrapyd-client: pip install scrapyd-client
部署Scrapy項目使用教程
scrapy項目配置scrapy.cfg文件
其中的username 和 password 用於在部署時驗證服務器的HTTP basic authentication,須要注
意的是這裏的用戶密碼並不表示訪問該項目須要驗證,而是登錄服務器用的。

[settings]
default = ScrapyProject.settings
#demo用來標識項目, 可任意命名, 不指定時。標識名默認是default
[deploy:demo]
#部署爬蟲到目標服務器(url)
url = http://localhost:6800/
project = ScrapyProject
username = admin
#訪問服務器所需的用戶名和密碼(如果不需要密碼可以不寫)
password = westos123

scrapyd-deploy部署項目

#將本地爬蟲項目部署到遠程服務器端
scrapyd-deploy demo -p ScrapyProject
#運行命令查看服務端狀態
curl http://localhost:6800/daemonstatus.json

查看項目spider
通過scrapyd-deploy -l 查看當前目錄下的可以使用的部署方式(target)


scrapy list
scrapyd-deploy -l
scrapyd-deploy -L xxxx
```易錯點: scrapyd-deploy運行時顯示無此命令, 在Linux/Mac系統不會出現該報錯, 那麼
Windows系統的特殊設置:
#獲取Python路徑:   where Python
#編輯文件: Python路徑\Scripts\scrapyd-deploy.bat
@echo off
"D:\Software\Anaconda3\envs\electricity\python.exe"
"D:\Software\Anaconda3\envs\electricity\Scripts\scrapyd-deploy" %*

Scrapyd API接口
scrapyd的web界面比較簡單,主要用於監控,所有的調度工作全部依靠接口實現.
官方文檔: http://scrapyd.readthedocs.org/en/stable/api.html
開啓爬蟲 schedule
curl http://localhost:6800/schedule.json -d project=項目名稱 -d spider=爬蟲名稱
停止 cancel
curl http://localhost:6800/cancel.json -d project=項目名稱 -d job=jobID
列出爬蟲
curl http://localhost:6800/listspiders.json?project=項目名稱
刪除項目
curl http://localhost:6800/delproject.json -d project=項目名稱
SpiderKeeper可視化部署
SpdierKeeper通過配合scrpyd管理爬蟲,支持一鍵式部署,定時採集任務,啓動,暫停等一系列的操作.原理
是: 對scrapyd的api進行封裝,最大限度減少你跟命令行交互次數.
依賴包安裝
scrapy
scrapyd
SpiderKeeper
啓動SpiderKeeper
spiderkeeper --server=http://localhost:6800
啓動成功後, 在瀏覽器訪問127.0.0.1:5000,效果如下:
![](https://s4.51cto.com/images/blog/202004/22/e2dd23205d0eca01c1130ac40ae5ba65.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
### 創建項目
若使用scrpayd-deploy工具部署後,spiderkeeper無法自動識別出部署的項目,必須在網頁中手動部
署.
在scrpay項目中scrapy.cfg文件中寫好scrapyd服務器信息
生成egg文件命令:
scrapyd-deploy --build-egg output.egg
### 上傳文件
![](https://s4.51cto.com/images/blog/202004/22/4557082762a55acd287d320fe3b7c9d9.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
運行項目
可以一次運行和定時週期運行。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章