【爬蟲開發】爬蟲開發從0到1全知識教程第14篇:scrapy爬蟲框架,介紹【附代碼文檔】

本教程的知識點為:爬蟲概要 爬蟲基礎 爬蟲概述 知識點: 1. 爬蟲的概念 requests模塊 requests模塊 知識點: 1. requests模塊介紹 1.1 requests模塊的作用: 數據提取概要 數據提取概述 知識點 1. 響應內容的分類 知識點:了解 響應內容的分類 Selenium概要 selenium的介紹 知識點: 1. selenium運行效果展示 1.1 chrome瀏覽器的運行效果 Selenium概要 selenium的其它使用方法 知識點: 1. selenium標簽頁的切換 知識點:掌握 selenium控制標簽頁的切換 反爬與反反爬 常見的反爬手段和解決思路 學習目標 1 服務器反爬的原因 2 服務器常反什么樣的爬蟲 反爬與反反爬 驗證碼處理 學習目標 1.圖片驗證碼 2.圖片識別引擎 反爬與反反爬 JS的解析 學習目標: 1 確定js的位置 1.1 觀察按鈕的綁定js事件 Mongodb數據庫 介紹 內容 mongodb文檔 mongodb的簡單使用 Mongodb數據庫 介紹 內容 mongodb文檔 mongodb的聚合操作 Mongodb數據庫 介紹 內容 mongodb文檔 mongodb和python交互 scrapy爬蟲框架 介紹 內容 scrapy官方文檔 scrapy的入門使用 scrapy爬蟲框架 介紹 內容 scrapy官方文檔 scrapy管道的使用 scrapy爬蟲框架 介紹 內容 scrapy官方文檔 scrapy中間件的使用 scrapy爬蟲框架 介紹 內容 scrapy官方文檔 scrapy_redis原理分析并實現斷點續爬以及分布式爬蟲 scrapy爬蟲框架 介紹 內容 scrapy官方文檔 scrapy的日志信息與配置 利用appium抓取app中的信息 介紹 內容 appium環境安裝 學習目標

完整筆記資料代碼:https://gitee.com/yinuo112/Backend/tree/master/爬蟲/爬蟲開發從0到1全知識教程/note.md

感興趣的小伙伴可以自取哦~


全套教程部分目錄:


部分文件圖片:

scrapy爬蟲框架

介紹

我們知道常用的流程web框架有django、flask,那么接下來,我們會來學習一個全世界范圍最流行的爬蟲框架scrapy

內容

  • scrapy的概念作用和工作流程
  • scrapy的入門使用
  • scrapy構造并發送請求
  • scrapy模擬登陸
  • scrapy管道的使用
  • scrapy中間件的使用
  • scrapy_redis概念作用和流程
  • scrapy_redis原理分析并實現斷點續爬以及分布式爬蟲
  • scrapy_splash組件的使用
  • scrapy的日志信息與配置
  • scrapyd部署scrapy項目

scrapy官方文檔

[

scrapy中間件的使用

學習目標:
  1. 應用 scrapy中使用間件使用隨機UA的方法
  2. 應用 scrapy中使用ip的的方法
  3. 應用 scrapy與selenium配合使用

1. scrapy中間件的分類和作用

1.1 scrapy中間件的分類

根據scrapy運行流程中所在位置不同分為:

  1. 下載中間件
  2. 爬蟲中間件
1.2 scrapy中間的作用:預處理request和response對象
  1. 對header以及cookie進行更換和處理
  2. 使用ip等
  3. 對請求進行定制化操作,

但在scrapy默認的情況下 兩種中間件都在middlewares.py一個文件中

爬蟲中間件使用方法和下載中間件相同,且功能重復,通常使用下載中間件

2. 下載中間件的使用方法:

接下來我們對騰訊招聘爬蟲進行修改完善,通過下載中間件來學習如何使用中間件 編寫一個Downloader Middlewares和我們編寫一個pipeline一樣,定義一個類,然后在setting中開啟

Downloader Middlewares默認的方法:

  • process_request(self, request, spider):

  • 當每個request通過下載中間件時,該方法被調用。

  • 返回None值:沒有return也是返回None,該request對象傳遞給下載器,或通過引擎傳遞給其他權重低的process_request方法
  • 返回Response對象:不再請求,把response返回給引擎
  • 返回Request對象:把request對象通過引擎交給調度器,此時將不通過其他權重低的process_request方法

  • process_response(self, request, response, spider):

  • 當下載器完成http請求,傳遞響應給引擎的時候調用

  • 返回Resposne:通過引擎交給爬蟲處理或交給權重更低的其他下載中間件的process_response方法
  • 返回Request對象:通過引擎交給調取器繼續請求,此時將不通過其他權重低的process_request方法

  • 在settings.py中配置開啟中間件,權重值越小越優先執行

3. 定義實現隨機User-Agent的下載中間件

3.1 在middlewares.py中完善代碼
import random
from Tencent.settings import USER_AGENTS_LIST # 注意導入路徑,請忽視pycharm的錯誤提示class UserAgentMiddleware(object):def process_request(self, request, spider):user_agent = random.choice(USER_AGENTS_LIST)request.headers['User-Agent'] = user_agent# 不寫returnclass CheckUA:def process_response(self,request,response,spider):print(request.headers['User-Agent'])return response # 不能少!
3.2 在settings中設置開啟自定義的下載中間件,設置方法同管道
DOWNLOADER_MIDDLEWARES = {'Tencent.middlewares.UserAgentMiddleware': 543, # 543是權重值'Tencent.middlewares.CheckUA': 600, # 先執行543權重的中間件,再執行600的中間件
}
3.3 在settings中添加UA的列表
USER_AGENTS_LIST = ["Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)","Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)","Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)","Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6","Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1","Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0","Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5"
]
運行爬蟲觀察現象

4. ip的使用

4.1 思路分析
  1. 添加的位置:request.meta中增加proxy字段
  2. 獲取一個ip,賦值給request.meta['proxy']
  3. 池中隨機選擇ip
  4. ip的webapi發送請求獲取一個ip
4.2 具體實現

免費ip:

class ProxyMiddleware(object):def process_request(self,request,spider):# proxies可以在settings.py中,也可以來源于ip的webapi# proxy = random.choice(proxies) # 免費的會失效,報 111 connection refused 信息!重找一個ip再試proxy = ' request.meta['proxy'] = proxyreturn None # 可以不寫return

收費ip:

# 人民幣玩家的代碼(使用abuyun提供的ip)import base64# 隧道驗證信息  這個是在那個網站上申請的proxyServer = ' # 收費的ip服務器地址,這里是abuyun
proxyUser = 用戶名
proxyPass = 密碼
proxyAuth = "Basic " + base64.b64encode(proxyUser + ":" + proxyPass)class ProxyMiddleware(object):def process_request(self, request, spider):# 設置request.meta["proxy"] = proxyServer# 設置認證request.headers["Proxy-Authorization"] = proxyAuth
4.3 檢測ip是否可用

在使用了ip的情況下可以在下載中間件的process_response()方法中處理ip的使用情況,如果該ip不能使用可以替換其他ip

class ProxyMiddleware(object):......def process_response(self, request, response, spider):if response.status != '200':request.dont_filter = True # 重新發送的請求對象能夠再次進入隊列return requst
在settings.py中開啟該中間件

5. 在中間件中使用selenium

以github登陸為例

5.1 完成爬蟲代碼
import scrapyclass Login4Spider(scrapy.Spider):name = 'login4'allowed_domains = ['github.com']start_urls = [' # 直接對驗證的url發送請求def parse(self, response):with open('check.html', 'w') as f:f.write(response.body.decode())
5.2 在middlewares.py中使用selenium
import time
from selenium import webdriverdef getCookies():# 使用selenium模擬登陸,獲取并返回cookieusername = input('輸入github賬號:')password = input('輸入github密碼:')options = webdriver.ChromeOptions()options.add_argument('--headless')options.add_argument('--disable-gpu')driver = webdriver.Chrome('/home/worker/Desktop/driver/chromedriver',chrome_options=options)driver.get('time.sleep(1)driver.find_element_by_xpath('//*[@id="login_field"]').send_keys(username)time.sleep(1)driver.find_element_by_xpath('//*[@id="password"]').send_keys(password)time.sleep(1)driver.find_element_by_xpath('//*[@id="login"]/form/div[3]/input[3]').click()time.sleep(2)cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}driver.quit()return cookies_dictclass LoginDownloaderMiddleware(object):def process_request(self, request, spider):cookies_dict = getCookies()print(cookies_dict)request.cookies = cookies_dict # 對請求對象的cookies屬性進行替換
配置文件中設置開啟該中間件后,運行爬蟲可以在日志信息中看到selenium相關內容

小結

中間件的使用:

  1. 完善中間件代碼:

  2. process_request(self, request, spider):

    1. 當每個request通過下載中間件時,該方法被調用。
    2. 返回None值:沒有return也是返回None,該request對象傳遞給下載器,或通過引擎傳遞給其他權重低的process_request方法
    3. 返回Response對象:不再請求,把response返回給引擎
    4. 返回Request對象:把request對象通過引擎交給調度器,此時將不通過其他權重低的process_request方法
  3. process_response(self, request, response, spider):

    1. 當下載器完成http請求,傳遞響應給引擎的時候調用
    2. 返回Resposne:通過引擎交給爬蟲處理或交給權重更低的其他下載中間件的process_response方法
    3. 返回Request對象:通過引擎交給調取器繼續請求,此時將不通過其他權重低的process_request方法
  4. 需要在settings.py中開啟中間件 DOWNLOADER_MIDDLEWARES = { 'myspider.middlewares.UserAgentMiddleware': 543, }


scrapy_redis概念作用和流程

學習目標
  1. 了解 分布式的概念及特點
  2. 了解 scarpy_redis的概念
  3. 了解 scrapy_redis的作用
  4. 了解 scrapy_redis的工作流程

在前面scrapy框架中我們已經能夠使用框架實現爬蟲爬取網站數據,如果當前網站的數據比較龐大, 我們就需要使用分布式來更快的爬取數據

1. 分布式是什么

簡單的說 分布式就是不同的節點(服務器,ip不同)共同完成一個任務

2. scrapy_redis的概念

scrapy_redis是scrapy框架的基于redis的分布式組件

3. scrapy_redis的作用

Scrapy_redis在scrapy的基礎上實現了更多,更強大的功能,具體體現在:

通過持久化請求隊列和請求的指紋集合來實現:

  • 斷點續爬
  • 分布式快速抓取

4. scrapy_redis的工作流程

4.1 回顧scrapy的流程

思考:那么,在這個基礎上,如果需要實現分布式,即多臺服務器同時完成一個爬蟲,需要怎么做呢?
4.2 scrapy_redis的流程
  • 在scrapy_redis中,所有的待抓取的request對象和去重的request對象指紋都存在所有的服務器公用的redis中

  • 所有的服務器中的scrapy進程公用同一個redis中的request對象的隊列

  • 所有的request對象存入redis前,都會通過該redis中的request指紋集合進行判斷,之前是否已經存入過

  • 在默認情況下所有的數據會保存在redis中

具體流程如下:


小結

scarpy_redis的分布式工作原理

  • 在scrapy_redis中,所有的待抓取的對象和去重的指紋都存在公用的redis中
  • 所有的服務器公用同一redis中的請求對象的隊列
  • 所有的request對象存入redis前,都會通過請求對象的指紋進行判斷,之前是否已經存入過

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/74531.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/74531.shtml
英文地址,請注明出處:http://en.pswp.cn/web/74531.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CMake】《CMake構建實戰:項目開發卷》筆記-Chapter8-生成器表達式

第8章 生成器表達式 生成器表達式(generator expression)是由CMake生成器進行解析的表達式,因此,這些表達式只有在CMake的生成階段才被解析為具體的值。 CMake在生成階段,能夠根據具體選用的構建系統生成器生成特定…

Docker安裝、配置Mysql5.7

1.創建必要的目錄 # 創建目錄 mkdir -p ~/docker/software/mysql/{conf,log,data} 2.如果沒有docker-compose.yml文件的話,先創建docker-compose.yml 配置文件一般長這個樣子 version: 3services:mysql:image: mysql:5.7.36container_name: mysqlports:- "…

【C++學習筆記】十三、速通筆記

完整的C編程教程 目錄 開發環境配置C知識體系現代C特性設計模式數據結構CMake項目構建調試技巧進階主題學習資源 1. 開發環境配置 1.1 安裝編譯器 sudo apt-get install g build-essential1.2 安裝構建工具 sudo apt-get install cmake1.3 VS Code配置 安裝C擴展配置調試…

網絡運維學習筆記(DeepSeek優化版)027 OSPF外部路由計算

文章目錄 OSPF外部路由計算1. 實驗拓撲與基礎配置2. 關鍵配置命令2.1 引入靜態路由2.2 查看路由表 3. LSA生成與傳播分析3.1 ASBR角色通告(1類LSA)3.2 外部路由通告(5類LSA)3.3 外部路由引入過程 4. 5類LSA關鍵字段解析5. 外部路由…

【Python使用】嘿馬推薦系統全知識和項目開發教程第2篇:1.4 案例--基于協同過濾的電影推薦,1.5 推薦系統評估【附代碼

教程總體簡介:1.1 推薦系統簡介 學習目標 1 推薦系統概念及產生背景 2 推薦系統的工作原理及作用 3 推薦系統和Web項目的區別 1.3 推薦算法 1 推薦模型構建流程 2 最經典的推薦算法:協同過濾推薦算法(Collaborative Filtering) 3 …

運算放大器(五)電壓比較器

比較器在最常用的簡單集成電路中排名第二,僅次于排名第一的運算放大器。 電壓比較器是一種用來比較輸入信號電壓與參考電壓大小,并將比較結果以高電平或低電平形式輸出的一種信號處理電路,廣泛應用于各種非正弦波的產生和變換電路中&#xf…

Java面試黃金寶典34

1. 主鍵索引底層的實現原理 定義 主鍵索引是數據庫中用于唯一標識表中每一行記錄的索引,常見的底層實現是 B 樹結構。B 樹是一種平衡的多路搜索樹,由內部節點和葉子節點組成。內部節點只存儲索引鍵和指向下一層節點的指針,不存儲實際數據&am…

Educational Codeforces Round 177 (Rated for Div. 2)

Educational Codeforces Round 177 (Rated for Div. 2) A. Cloudberry Jam 思路&#xff1a; 1千克果子能生產2/3千克果醬&#xff0c;生產3千克果醬則需要2千克果醬&#xff0c;所以*2即可 code: void solve() { int x; cin >> x;cout << 2 * x << e…

ARM-外部中斷,ADC模數轉換器

根據您提供的圖片&#xff0c;我們可以看到一個S3C2440微控制器的中斷處理流程圖。這個流程圖展示了從中斷請求源到CPU的整個中斷處理過程。以下是流程圖中各個部分與您提供的寄存器之間的關系&#xff1a; 請求源&#xff08;帶sub寄存器&#xff09;&#xff1a; 這些是具體的…

23種設計模式-行為型模式-迭代器

文章目錄 簡介問題解決代碼設計關鍵點&#xff1a; 總結 簡介 迭代器是一種行為設計模式&#xff0c;讓你能在不暴露集合底層表現形式(列表、棧和樹等)的情況下遍歷集合中所有的元素。 問題 集合是編程中最常使用的數據類型之一。 大部分集合使用簡單列表存儲元素。但有些集…

Python 布爾類型

Python 布爾類型(Boolean) 布爾類型是Python中的基本數據類型之一&#xff0c;用于表示邏輯值。它只有兩個值&#xff1a; True - 表示真False - 表示假 1. 布爾值的基本使用 # 定義布爾變量 is_active True is_admin Falseprint(is_active) # 輸出: True print(is_admi…

人工智能在前端開發中的應用探索

一、人工智能在前端開發中的應用場景 人工智能&#xff08;AI&#xff09;技術的快速發展為前端開發帶來了新的機遇和挑戰。AI在前端開發中的應用主要集中在以下幾個方面&#xff1a;智能代碼生成、自動化測試、個性化推薦、智能交互設計以及性能優化。這些應用場景不僅提高了…

三維掃描助力文化遺產數字化保護

當下&#xff0c;三維掃描技術以其獨特的優勢&#xff0c;正逐漸成為文化遺產數字化保護的重要工具&#xff0c;讓珍貴的文物得以“永生”。 三維掃描在文物數字化方面的應用&#xff1a; 高精度文物存檔&#xff1a;三維掃描技術能夠實現對文物的快速、無損掃描&#xff0c;…

如何將生活場景轉換為數據模型模型仿真?

從家到公司有31公里&#xff0c;其中有一個2車道右轉立交橋匯入另外一條路&#xff0c;每次都是那個堵車&#xff0c;導致路上的行程在45分鐘到70分鐘左右&#xff1f;前面或后面路段都是3-4車道&#xff0c;足夠通行。如何解決這個難題&#xff0c;是否可搭建數學模型實現可視…

Java學習總結-io流-練習案例

將文檔的內容排序&#xff1a; public static void main(String[] args) throws IOException {File dir new File("J:\\360downloads\\wpcache\\srvsetwp\\xxx\\test.txt");BufferedReader br new BufferedReader(new FileReader(dir));//把按行讀取到的內容&#…

【C++】STL庫_stack_queue 的模擬實現

棧&#xff08;Stack&#xff09;、隊列&#xff08;Queue&#xff09;是C STL中的經典容器適配器 容器適配器特性 不是獨立容器&#xff0c;依賴底層容器&#xff08;deque/vector/list&#xff09;通過限制基礎容器接口實現特定訪問模式不支持迭代器操作&#xff08;無法遍歷…

LangChain核心解析:掌握AI開發的“鏈“式思維

0. 思維導圖 1. 引言 ?? 在人工智能快速發展的今天,如何有效地利用大語言模型(LLM)構建強大的應用成為眾多開發者關注的焦點。前面的課程中,我們學習了正則表達式以及向量數據庫的相關知識,了解了如何處理文檔并將其附加給大模型。本章我們將深入探討LangChain中的核心概…

Error:java: 程序包lombok不存在

使用Maven package打包項目發現報錯 一、Maven配置文件修改 1.找到本地 maven的配置文件settings.xml 2.修改配置文件中&#xff0c;指向本地倉庫的地址使用 ‘’ \ \ ‘’ 隔開&#xff0c; 要么使用 正斜線 / 隔開 不要使用 反斜線 \ windows OS 電腦&#xff0c;使用 \ …

WordPress 未授權本地文件包含漏洞(CVE-2025-2294)(附腳本)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 0x0…

基于 C# 開發視覺檢測系統項目全解析

引言 在當今高度自動化的制造業領域,視覺檢測系統的重要性愈發凸顯。它憑借高速、高精度的特性,在產品外觀缺陷檢測、尺寸測量等環節發揮著關鍵作用,顯著提升了生產效率和產品質量。C# 作為一種功能強大且易于學習的編程語言,結合.NET 框架豐富的類庫以及 Windows Forms、…