拖動刷新的內容由Ajax加載且頁面的URL無變化,那麼應該到哪裏去查看這些Ajax請求呢?html
打開Ajax的XHR過濾器,而後一直滑動頁面以加載新的微博內容。能夠看到,會不斷有
Ajax請求發出。請求的參數有4個:type、value、containerid和page。python
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)
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,需要注
意的是這裏的用戶密碼並不表示訪問該項目需要驗證,而是登陸服務器用的。git
[settings] default = ScrapyProject.settings #demo用來標識項目, 可任意命名, 不指定時。標識名默認是default [deploy:demo] #部署爬蟲到目標服務器(url) url = http://localhost:6800/ project = ScrapyProject username = admin #訪問服務器所需的用戶名和密碼(若是不須要密碼能夠不寫) password = westos123
scrapyd-deploy部署項目github
#將本地爬蟲項目部署到遠程服務器端 scrapyd-deploy demo -p ScrapyProject #運行命令查看服務端狀態 curl http://localhost:6800/daemonstatus.json
查看項目spider
經過scrapyd-deploy -l 查看當前目錄下的可使用的部署方式(target)web
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=) 運行項目 能夠一次運行和定時週期運行。