1. 程式人生 > >Scrapy_redis+scrapyd搭建分散式架構爬取知乎使用者資訊

Scrapy_redis+scrapyd搭建分散式架構爬取知乎使用者資訊

相關準備

win10作業系統,騰訊雲伺服器,redis,redis dedktop manager,Mongodb
1.在專案開始之前,請確保win10以及伺服器都安裝了redis以及mongodb,並且以win10為主機,win10的redis能夠遠端連線伺服器的redis。
win 10安裝Redis:https://github.com/rgl/redis/downloads
centos 安裝Redis:直接執行命令:

yum install redis -y

即可,安裝完成後預設啟動redis伺服器。
2.安裝完成之後都需要把redis.conf檔案中的bind 127.0.0.1註釋掉
這裡寫圖片描述


修改後,重啟redis伺服器
systemctl restart redis

3.centos中的redis需要設定密碼,用於win10的redis desktop遠端連線:
這裡寫圖片描述

4.用Redis Desktop Manager連線Redis(CentOS):

分散式原理:

scrapy-redis實現分散式,其實從原理上來說很簡單,這裡為描述方便,我們把自己的核心伺服器稱為master,而把用於跑爬蟲程式的機器稱為slave。

我們知 道,採用scrapy框架抓取網頁,我們需要首先給定它一些start_urls,爬蟲首先訪問start_urls裡面的url,再根據我們的具體邏輯,對裡面的元素、或者是其他的二級、三級頁面進行抓取。而要實現分散式,我們只需要在這個starts_urls裡面做文章就行了。

我們在master上搭建一個redis資料庫(注意這個資料庫只用作url的儲存,不關心爬取的具體資料,不要和後面的mongodb或者mysql混淆),並對每一個需要爬取的網站型別,都開闢一個單獨的列表欄位。通過設定slave上scrapy-redis獲取url的地址為master地址。這樣的結果就是,儘管有多個slave,然而大家獲取url的地方只有一個,那就是伺服器master上的redis資料庫。

並且,由於scrapy-redis自身的佇列機制,slave獲取的連結不會相互衝突。這樣各個slave在完成抓取任務之後,再把獲取的結果彙總到伺服器上(這時的資料儲存不再在是redis,而是mongodb或者 mysql等存放具體內容的資料庫了)

這種方法的還有好處就是程式移植性強,只要處理好路徑問題,把slave上的程式移植到另一臺機器上執行,基本上就是複製貼上的事情。

分析思路:

1.使用兩臺機器,一臺是win10,一臺是centos7的伺服器,分別在兩臺機器上部署scrapy來進行分散式抓取一個網站.
2.centos7的ip地址為139.199.57.248,用來作為redis的slave端,win10的機器作為master.
3.master的爬蟲執行時會把提取到的url封裝成request放到redis中的資料庫:“dmoz:requests”,並且從該資料庫中提取request後下載網頁,再把網頁的內容存放到redis的另一個數據庫中“dmoz:items”.
4.slave從master的redis中取出待抓取的request,下載完網頁之後就把網頁的內容傳送回master的redis.
5.重複上面的3和4,直到master的redis中的“dmoz:requests”資料庫為空,再把master的redis中的“dmoz:items”資料庫寫入到mongodb中.
6.master裡的reids還有一個數據“dmoz:dupefilter”是用來儲存抓取過的url的指紋(使用雜湊函式將url運算後的結果),是防止重複抓取的.

實現步驟:

1.先從Github上把前幾天寫的程式碼,clone到本地:

git clone https://github.com/dik111/Zhihu.git

2.新建分支,以便不影響之前的程式碼:

git checkout -b distributed#新建分支
git branch#切換到分支

3.修改setting.py檔案:

SCHEDULER = "scrapy_redis.scheduler.Scheduler"#修改排程器
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#用於去重的class
 'scrapy_redis.pipelines.RedisPipeline': 301#爬取結果儲存到Redis
REDIS_URL = 'redis://root:[email protected]:6379'

執行爬蟲程式,可以看到Redis中多了zhihu這個檔案
這裡寫圖片描述
這裡寫圖片描述

其中zhihu:dupefilter就是上文所說的用來儲存抓取過的url的指紋(使用雜湊函式將url運算後的結果),是防止重複抓取的。

4.把分支程式碼更新到Github:

git status
git add -A
git commit -m "add distributed"
git push origin distributed

5.把程式碼部署到伺服器:
5.1首先開啟mongodb的配置檔案mongodb.conf,把blind1270.0.1註釋掉,以便遠端連線mongodb。
5.2在linux系統下建立新的資料夾,並且把專案clone下來。

sudo git clone https://github.com/Germey/Zhihu.git -b distributed

6.執行爬蟲程式

scrapy crawl zhihu

到這裡一個簡單的分散式框架已經搭建完成啦!

7.因為已經遠端連線了mongodb,因此主機上面的redis已經不需要把從機的資料遠端過來了,所以把之前的redis pipelines註釋掉

#'scrapy_redis.pipelines.RedisPipeline': 301

相關進階

在上面的例子中,我們是用git來更新部署程式碼的,但是當主機非常多的時候,這樣的操作顯示有點繁瑣,因此,在這裡我推薦使用scrapyd來進行分散式的部署。
這裡寫圖片描述

1.安裝scrapyd:

pip install scrapyd

2.啟動scrapyd,並且訪問遠端埠:
這裡寫圖片描述
3.修改scrapy.cfg檔案:

url = http://http://127.0.0.1:6800/addversion.json
project = zhihuuser

相關推薦

Scrapy_redis+scrapyd搭建分散式架構使用者資訊

相關準備: win10作業系統,騰訊雲伺服器,redis,redis dedktop manager,Mongodb 1.在專案開始之前,請確保win10以及伺服器都安裝了redis以及mongodb,並且以win10為主機,win10的redis能夠

基於webmagic的爬蟲小應用--使用者資訊

最近跟舍友@小瘋一起研究爬蟲 他寫了個小應用-CSDN部落格爬蟲 有興趣的朋友可以點進去看看哦~ 一起學習。 一起進步。 想要原始碼的朋友點選這裡下載哦~ 聽到“爬蟲”,是不是第一時間想到python/php ? 多

python scrapy框架提問資訊

前文介紹了python的scrapy爬蟲框架和登入知乎的方法. 這裡介紹如何爬取知乎的問題資訊,並儲存到mysql資料庫中. 首先,看一下我要爬取哪些內容: 如下圖所示,我要爬取一個問題的6個資訊: 問題的id(question_id) 標題(title) 問題描述

python requests 使用者資訊

今天嘗試了爬取知乎使用者資訊來練習爬蟲,學到了很多東西,在這裡總結一下心得我沒有使用爬蟲框架,就只用了requests模組,應為爬取的都是json資料,連BeautifulSoup都沒能用上爬取知乎使用者資訊,可以不用模擬登入也能獲取使用者資訊,只有一些設定了隱私才需要登入,

某個問題下所有的圖片

user count view default os.chdir make selenium pytho use 最近在逛知乎時,看到這麽一個問題 最高贊的答案寫了個爬蟲,把所有的照片都爬下來了。 嘿嘿嘿,技術的力量 正好自己也在學習,加上答主的答案是很久之前的,知乎

Scrapy分布式爬蟲打造搜索引擎(慕課網)--(二)

false pat 模塊 text 文件的 服務 協議 .py execute 通過Scrapy模擬登陸知乎 通過命令讓系統自動新建zhihu.py文件 首先進入工程目錄下 再進入虛擬環境 通過genspider命令新建zhihu.py scrap

用PHP的100萬用戶

nbsp 維修 知乎 發現 body class 直接 blog 爬蟲 http://blog.jobbole.com/88788/ 突然發現 大數據 Python的爬蟲能力很強 爬取到的數據 直接可以用於維修QQ營銷 精準營銷用PHP爬取知乎的100萬用戶

利用 Scrapy 用戶信息

oauth fault urn family add token post mod lock   思路:通過獲取知乎某個大V的關註列表和被關註列表,查看該大V和其關註用戶和被關註用戶的詳細信息,然後通過層層遞歸調用,實現獲取關註用戶和被關註用戶的關註列表和被關註列表,最終實

Python中文社區信息

urlencode RR amp AD pos LV off In encoding 爬取知乎Python中文社區信息,https://zhuanlan.zhihu.com/zimei 1 import requests 2 from urllib.parse

話題async使用協程

ret header tps mob ans print __name__ next and import requests import json import time from pyquery import PyQuery import pandas as pd f

scrapy問答

登陸 參考 https://github.com/zkqiang/Zhihu-Login # -*- coding: utf-8 -*- import scrapy import time import re import base64 import hmac import hashlib impor

python scrapy問題和收藏夾下所有答案的內容和圖片

上文介紹了爬取知乎問題資訊的整個過程,這裡介紹下爬取問題下所有答案的內容和圖片,大致過程相同,部分核心程式碼不同. 爬取一個問題的所有內容流程大致如下: 一個問題url 請求url,獲取問題下的答案個數(我不需要,因為之前獲取問題資訊的時候儲存了問題的回答個數) 通過答案的介面去獲取答案(如果一次獲取5

教程+資源,python scrapy實戰最性感妹子的爆照合集(12G)!

一.出發點: 之前在知乎看到一位大牛(二胖)寫的一篇文章:python爬取知乎最受歡迎的妹子(大概題目是這個,具體記不清了),但是這位二胖哥沒有給出原始碼,而我也沒用過python,正好順便學一學,所以我決定自己動手搞一搞. 爬取已經完成,文末有 python的原始碼和妹子圖片的百度雲地址 二.準備:

python專欄使用者評論資訊

工具:python3,pycharm,火狐瀏覽器 模組:json,requests,time 登入知乎,進入專欄。 進入後隨便選擇一個專欄,我們選擇一個粉絲比較多的。點選進去。 其實,我們可以爬取這個專欄的所有文章,開啟開發者工具F12,點選重新整理 找

爬蟲登陸後首頁

package zhihu; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.jsoup.Connection; import org.

用python中的圖片

首先,我們檢視一下知乎的robots協議。 User-agent: * Disallow: / 知乎是不允許爬取其根目錄的。 但是,我們只是用於實驗,而且訪問頻率和正常訪問差距不大,所以可以爬取。 先明確目的: 對手動輸入的網址進行解析 把爬取到的圖片儲存到指定目

超簡易Scrapy問題,標籤的爬蟲

上課的作業,備份一下,以免不時之需。 知乎的問題的網頁都是 https://www.zhihu.com/question/ 帶8位神祕數字,我們只需要依次遍歷就解決問題啦,遇到404的情況就直接跳過。用scrapy框架快速開發。 獲取知乎問題標題的程式碼 ti

python3某話題下的若干個問題及其回答

思路:通過selenium的webdriver實現頁面的點選、下來等操作。頁面完全載入後通beautifulsoup來查詢相應的標籤。將資料放到列表中,然後通過xlwt建立excel,並把資料存進去。 缺點:容易遇到效能問題。可能一個話題有很多的回覆,而對於往excel中插

用於某個話題下的精華問題中所有回答的爬蟲

思路 我的整個演算法的思路還是很簡單的,文字版步驟如下:1、通過話題廣場進入某個話題的頁面,避免了登陸註冊頁面的驗證,查詢到對應要爬取的話題,從 url 中得到話題id2、該頁面的所有資源採用了延遲載入,如果採用模擬瀏覽器進行載入的話還是很麻煩,經研究後發現知乎有前後端資料傳輸的api,所以獲取資料方面

python專欄文章標題及URL

# -*- coding:utf-8 -*- from selenium import webdriver import time # 執行程式要安裝selenium模組,並下載Chrome瀏覽器驅動