博客 / 詳情

返回

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

🏆🏆🏆教程全知識點簡介:1.Mongodb數據庫包括介紹、mongodb簡單使用(mongodb服務端啓動、啓動mongodb客户端進入mongo shell)。2. scrapy爬蟲框架涵蓋 ip使用、啓動爬蟲、停止爬蟲、scrapyd webapi。3. Gerapy包含通過Gerapy配置管理scrapy項目。4. appium移動端抓取涉及appium自動控制移動設備、appium-python-client模塊安裝、初始化獲取移動設備分辨率、定位元素提取文本方法、控制抖某音app滑動、自動滑動代碼整理。5. 爬蟲概述包括爬蟲概念、爬蟲基礎。6. http協議複習涵蓋http及https概念區別、爬蟲關注的請求頭響應頭、常見響應狀態碼、瀏覽器運行過程。7. requests模塊包含requests發送post請求、POST請求練習、requests.session狀態保持、課堂測試。8. 數據提取概述涉及響應內容分類、xml認識、html區別、常用數據解析方法。9. 數據提取-jsonpath模塊包括jsonpath模塊使用場景。10. 數據提取-lxml模塊涵蓋lxml模塊xpath語法、谷歌瀏覽器xpath helper插件安裝使用、xpath節點關係、xpath語法基礎節點選擇、xpath定位節點提取屬性文本內容語法、語法練習、lxml模塊安裝使用示例。11. Selenium 包含獲取當前標籤頁cookie信息、cookie轉化為字典、刪除cookie、頁面等待。12. 反爬與反反爬涵蓋常見反爬手段解決思路、服務器反爬原因、服務器反爬蟲類型、反爬蟲概念、反爬三個方向、基於身份識別反爬(session發送rKey獲取登錄信息、 加密、用户名 準備、js2py生成js執行環境)。

<!-- start:bj1 -->

📚📚倉庫code.zip 👉直接-->:   https://gitee.com/yinuo112/Backend/blob/master/爬蟲/爬蟲開發...    🍅🍅

<!-- end:bj1 -->

✨ 本教程項目亮點

🧠 知識體系完整:覆蓋從基礎原理、核心方法到高階應用的全流程內容
💻 全技術鏈覆蓋:完整前後端技術棧,涵蓋開發必備技能
🚀 從零到實戰:適合 0 基礎入門到提升,循序漸進掌握核心能力
📚 豐富文檔與代碼示例:涵蓋多種場景,可運行、可複用
🛠 工作與學習雙參考:不僅適合系統化學習,更可作為日常開發中的查閲手冊
🧩 模塊化知識結構:按知識點分章節,便於快速定位和複習
📈 長期可用的技術積累:不止一次學習,而是能伴隨工作與項目長期參考

🎯🎯🎯全教程總章節


🚀🚀🚀本篇主要內容

scrapy爬蟲框架

介紹

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

內容

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

scrapy官方文檔

https://scrapy-chs.readthedocs.io/zh_CN/0.24/index.html

scrapy管道的使用

學習目標:
  1. 掌握 scrapy管道(pipelines.py)的使用

之前 在scrapy入門使用一節中學習了管道的基本使用,接下來 深入的學習scrapy管道的使用

1. pipeline中常用的方法:

  1. process_item(self,item,spider):

    • 管道類中必須有的函數
    • 實現對item數據的處理
    • 必須return item
  2. open_spider(self, spider): 在爬蟲開啓的時候僅執行一次
  3. close_spider(self, spider): 在爬蟲關閉的時候僅執行一次

2. 管道文件的修改

繼續完善wangyi爬蟲,在pipelines.py代碼中完善

os 文檔

import json
from pymongo import MongoClient

class WangyiFilePipeline(object):
    def open_spider(self, spider):  # 在爬蟲開啓的時候僅執行一次
        if spider.name == 'itcast':
            self.f = open('json.txt', 'a', encoding='utf-8')

    def close_spider(self, spider):  # 在爬蟲關閉的時候僅執行一次
        if spider.name == 'itcast':
            self.f.close()

    def process_item(self, item, spider):
        if spider.name == 'itcast':
            self.f.write(json.dumps(dict(item), ensure_ascii=False, indent=2) + ',\n')
        # 不return的情況下,另一個權重較低的pipeline將不會獲得item
        return item  

class WangyiMongoPipeline(object):
    def open_spider(self, spider):  # 在爬蟲開啓的時候僅執行一次
        if spider.name == 'itcast':
        # 也可以使用isinstanc函數來區分爬蟲類:
            con = MongoClient(host='127.0.0.1', port=27017) # 實例化mongoclient
            self.collection = con.itcast.teachers # 創建數據庫名為itcast,集合名為teachers的集合操作對象

    def process_item(self, item, spider):
        if spider.name == 'itcast':
            self.collection.insert(item) 
            # 此時item對象必須是一個字典,再插入
            # 如果此時item是BaseItem則需要先轉換為字典:dict(BaseItem)
        # 不return的情況下,另一個權重較低的pipeline將不會獲得item
        return item

3. 開啓管道

在settings.py設置開啓pipeline

......
ITEM_PIPELINES = {
    'myspider.pipelines.ItcastFilePipeline': 400, # 400表示權重
    'myspider.pipelines.ItcastMongoPipeline': 500, # 權重值越小,越優先執行!
}
......

SymPy 文檔

別忘了開啓mongodb數據庫 sudo service mongodb start 並在mongodb數據庫中查看 mongo

思考:在settings中能夠開啓多個管道,為什麼需要開啓多個?

Python 開發者指南

  1. 不同的pipeline可以處理不同爬蟲的數據,通過spider.name屬性來區分
  2. 不同的pipeline能夠對一個或多個爬蟲進行不同的數據處理的操作,比如一個進行數據清洗,一個進行數據的保存
  3. 同一個管道類也可以處理不同爬蟲的數據,通過spider.name屬性來區分

4. pipeline使用注意點

  1. 使用之前需要在settings中開啓
  2. pipeline在setting中鍵表示位置(即pipeline在項目中的位置可以自定義),值表示距離引擎的遠近,越近數據會越先經過:權重值小的優先執行
  3. 有多個pipeline的時候,process_item的方法必須return item,否則後一個pipeline取到的數據為None值
  4. pipeline中process_item的方法必須有,否則item沒有辦法接受和處理
  5. process_item方法接受item和spider,其中spider表示當前傳遞item過來的spider
  6. open_spider(spider) :能夠在爬蟲開啓的時候執行一次
  7. close_spider(spider) :能夠在爬蟲關閉的時候執行一次
  8. 上述倆個方法經常用於爬蟲和數據庫的交互,在爬蟲開啓的時候建立和數據庫的連接,在爬蟲關閉的時候斷開和數據庫的連接

小結

  • 管道能夠實現數據的清洗和保存,能夠定義多個管道實現不同的功能,其中有個三個方法

    • process_item(self,item,spider):實現對item數據的處理
    • open_spider(self, spider): 在爬蟲開啓的時候僅執行一次
    • close_spider(self, spider): 在爬蟲關閉的時候僅執行一次

scrapy的crawlspider爬蟲

學習目標:
  1. 瞭解 crawlspider的作用
  2. 應用 crawlspider爬蟲創建的方法
  3. 應用 crawlspider中rules的使用

1 crawlspider是什麼

回顧之前的代碼中, 有很大一部分時間在尋找下一頁的url地址或者是內容的url地址上面,這個過程能更簡單一些麼?
思路:
  1. 從response中提取所有的滿足規則的url地址
  2. 自動的構造自己requests請求,發送給引擎

對應的crawlspider就可以實現上述需求,能夠匹配滿足條件的url地址,組裝成Reuqest對象後自動發送給引擎,同時能夠指定callback函數

即:crawlspider爬蟲可以按照規則自動獲取連接

2 創建crawlspider爬蟲並觀察爬蟲內的默認內容

watchdog 文檔

2.1 創建crawlspider爬蟲:

scrapy genspider -t crawl job 163.com

2.2 spider中默認生成的內容如下:
class JobSpider(CrawlSpider):
    name = 'job'
    allowed_domains = ['163.com']
    start_urls = ['https://hr.163.com/position/list.do']

    rules = (
        Rule(LinkExtractor(allow=r'Items/'), callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        i = {}
        #i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
        #i['name'] = response.xpath('//div[@id="name"]').extract()
        #i['description'] = response.xpath('//div[@id="description"]').extract()
        return i

Redis python客户端 方法參考

2.3 觀察跟普通的scrapy.spider的區別

在crawlspider爬蟲中,沒有parse函數

重點在rules中:
  1. rules是一個元組或者是列表,包含的是Rule對象
  2. Rule表示規則,其中包含LinkExtractor,callback和follow等參數
  3. LinkExtractor:連接提取器,可以通過正則或者是xpath來進行url地址的匹配
  4. callback :表示經過連接提取器提取出來的url地址響應的回調函數,可以沒有,沒有表示響應不會進行回調函數的處理
  5. follow:連接提取器提取的url地址對應的響應是否還會繼續被rules中的規則進行提取,True表示會,Flase表示不會

3. crawlspider網易招聘爬蟲

通過crawlspider爬取網易招聘的詳情頁的招聘信息

url:https://hr.163.com/position/list.do

思路分析:

fabric 文檔

  1. 定義一個規則,來進行列表頁翻頁,follow需要設置為True
  2. 定義一個規則,實現從列表頁進入詳情頁,並且指定回調函數
  3. 在詳情頁提取數據
注意:連接提取器LinkExtractor中的allow對應的正則表達式匹配的是href屬性的值

4 crawlspider使用的注意點:

  1. 除了用命令scrapy genspider -t crawl <爬蟲名> <allowed_domail>創建一個crawlspider的模板,頁可以手動創建
  2. crawlspider中不能再有以parse為名的數據提取方法,該方法被crawlspider用來實現基礎url提取等功能
  3. Rule對象中LinkExtractor為固定參數,其他callback、follow為可選參數
  4. 不指定callback且follow為True的情況下,滿足rules中規則的url還會被繼續提取和請求
  5. 如果一個被提取的url滿足多個Rule,那麼會從rules中選擇一個滿足匹配條件的Rule執行

5 瞭解crawlspider其他知識點

requests-oauthlib 文檔

  • 鏈接提取器LinkExtractor的更多常見參數

    • allow: 滿足括號中的're'表達式的url會被提取,如果為空,則全部匹配
    • deny: 滿足括號中的're'表達式的url不會被提取,優先級高於allow
    • allow_domains: 會被提取的鏈接的domains(url範圍),如:['hr.tencent.com', 'baidu.com']
    • deny_domains: 不會被提取的鏈接的domains(url範圍)
    • restrict_xpaths: 使用xpath規則進行匹配,和allow共同過濾url,即xpath滿足的範圍內的url地址會被提取,如:restrict_xpaths='//div[@class="pagenav"]'
  • Rule常見參數

    • LinkExtractor: 鏈接提取器,可以通過正則或者是xpath來進行url地址的匹配
    • callback: 表示經過連接提取器提取出來的url地址響應的回調函數,可以沒有,沒有表示響應不會進行回調函數的處理
    • follow: 連接提取器提取的url地址對應的響應是否還會繼續被rules中的規則進行提取,默認True表示會,Flase表示不會
    • process_links: 當鏈接提取器LinkExtractor獲取到鏈接列表的時候調用該參數指定的方法,這個自定義方法可以用來過濾url,且這個方法執行後才會執行callback指定的方法

總結

  1. crawlspider的作用:crawlspider可以按照規則自動獲取連接
  2. cr
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.