博客 / 詳情

返回

【爬蟲開發】爬蟲開發從0到1全知識教程第12篇: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項目中進行建模
  2. 應用 構造Request對象,併發送請求
  3. 應用 利用meta參數在不同的解析函數中傳遞數據

1. 數據建模

通常在做項目的過程中,在items.py中進行數據建模
1.1 為什麼建模
  1. 定義item即提前規劃好哪些字段需要抓,防止手誤,因為定義好之後,在運行過程中,系統會自動檢查
  2. 配合註釋一起可以清晰的知道要抓取哪些字段,沒有定義的字段不能抓取,在目標字段少的時候可以使用字典代替
  3. 使用scrapy的一些特定組件需要Item做支持,如scrapy的ImagesPipeline管道類,百度搜索瞭解更多
1.2 如何建模

在items.py文件中定義要提取的字段:

class MyspiderItem(scrapy.Item): 
    name = scrapy.Field()   # 講師的名字
    title = scrapy.Field()  # 講師的職稱
    desc = scrapy.Field()   # 講師的介紹
1.3 如何使用模板類

模板類定義以後需要在爬蟲中導入並且實例化,之後的使用方法和使用字典相同

job.py:

from myspider.items import MyspiderItem   # 導入Item,注意路徑
...
    def parse(self, response)

        item = MyspiderItem() # 實例化後可直接使用

        item['name'] = node.xpath('./h3/text()').extract_first()
        item['title'] = node.xpath('./h4/text()').extract_first()
        item['desc'] = node.xpath('./p/text()').extract_first()

        print(item)

注意:

  1. from myspider.items import MyspiderItem這一行代碼中 注意item的正確導入路徑,忽略pycharm標記的錯誤
  2. python中的導入路徑要訣:從哪裏開始運行,就從哪裏開始導入
1.4 開發流程總結
  1. 創建項目

    scrapy startproject 項目名

  2. 明確目標

    在items.py文件中進行建模
  3. 創建爬蟲

    3.1 創建爬蟲

    scrapy genspider 爬蟲名 允許的域

3.2 完成爬蟲

修改start_urls
 檢查修改allowed_domains
 編寫解析方法
  1. 保存數據

    在pipelines.py文件中定義對數據處理的管道

    在settings.py文件中註冊啓用管道

2. 翻頁請求的思路

對於要提取如下圖中所有頁面上的數據該怎麼辦?

回顧requests模塊是如何實現翻頁請求的:

  1. 找到下一頁的URL地址
  2. 調用requests.get(url)

scrapy實現翻頁的思路:

  1. 找到下一頁的url地址
  2. 構造url地址的請求對象,傳遞給引擎

3. 構造Request對象,併發送請求

3.1 實現方法
  1. 確定url地址
  2. 構造請求,scrapy.Request(url,callback)

    • callback:指定解析函數名稱,表示該請求返回的響應使用哪一個函數進行解析
  3. 把請求交給引擎:yield scrapy.Request(url,callback)
3.2 網易招聘爬蟲
通過爬取網易招聘的頁面的招聘信息,學習如何實現翻頁請求

地址:https://hr.163.com/position/list.do

思路分析:
  1. 獲取首頁的數據
  2. 尋找下一頁的地址,進行翻頁,獲取數據
注意:
  1. 可以在settings中設置ROBOTS協議
  
  
# False表示忽略網站的robots.txt協議,默認為True
  
  
ROBOTSTXT_OBEY = False
  1. 可以在settings中設置User-Agent:
  
  
# scrapy發送的每一個請求的默認UA都是設置的這個User-Agent
  
  
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
3.3 代碼實現

在爬蟲文件的parse方法中:

......
    # 提取下一頁的href
    next_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()

    # 判斷是否是最後一頁
    if next_url != 'javascript:void(0)':

        # 構造完整url
        url = 'https://hr.163.com/position/list.do' + next_url

        # 構造scrapy.Request對象,並yield給引擎
        # 利用callback參數指定該Request對象之後獲取的響應用哪個函數進行解析
        yield scrapy.Request(url, callback=self.parse)
......
3.4 scrapy.Request的更多參數
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
參數解釋
  1. 中括號裏的參數為可選參數
  2. callback:表示當前的url的響應交給哪個函數去處理
  3. meta:實現數據在不同的解析函數中傳遞,meta默認帶有部分數據,比如下載延遲,請求深度等
  4. dont_filter:默認為False,會過濾請求的url地址,即請求過的url地址不會繼續被請求,對需要重複請求的url地址可以把它設置為Ture,比如貼吧的翻頁請求,頁面的數據總是在變化;start_urls中的地址會被反覆請求,否則程序不會啓動
  5. method:指定POST或GET請求
  6. headers:接收一個字典,其中不包括cookies
  7. cookies:接收一個字典,專門放置cookies
  8. body:接收json字符串,為POST的數據,發送payload_post請求時使用(在下一章節中會介紹post請求)

4. meta參數的使用

meta的作用:meta可以實現數據在不同的解析函數中的傳遞

在爬蟲文件的parse方法中,提取詳情頁增加之前callback指定的parse_detail函數:

def parse(self,response):
    ...
    yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
...

def parse_detail(self,response):
    #獲取之前傳入的item
    item = resposne.meta["item"]
特別注意
  1. meta參數是一個字典
  2. meta字典中有一個固定的鍵proxy,表示ip,關於ip的使用 將在scrapy的下載中間件的學習中進行介紹

小結

python-magic 文檔

  1. 完善並使用Item數據類:

    1. 在items.py中完善要爬取的字段
    2. 在爬蟲文件中先導入Item
    3. 實力化Item對象後,像字典一樣直接使用
  2. 構造Request對象,併發送請求:

    1. 導入scrapy.Request類
    2. 在解析函數中提取url
    3. yield scrapy.Request(url, callback=self.parse_detail, meta={})
  3. 利用meta參數在不同的解析函數中傳遞數據:

    1. 通過前一個解析函數 yield scrapy.Request(url, callback=self.xxx, meta={}) 來傳遞meta
    2. 在self.xxx函數中 response.meta.get('key', '') 或 response.meta['key'] 的方式取出傳遞的數據

參考代碼

wangyi/spiders/job.py

Python for Everybody

import scrapy


class JobSpider(scrapy.Spider):
    name = 'job'
    # 2.檢查允許的域名
    allowed_domains = ['163.com']
    # 1 設置起始的url
    start_urls = ['https://hr.163.com/position/list.do']

    def parse(self, response):
        # 獲取所有的職位節點列表
        node_list = response.xpath('//*[@class="position-tb"]/tbody/tr')
        # print(len(node_list))

        # 遍歷所有的職位節點列表
        for num, node in enumerate(node_list):
            # 索引為值除2取餘為0的才是含有數據的節點,通過判斷進行篩選
            if num % 2 == 0:
                item = {}

                item['name'] = node.xpath('./td[1]/a/text()').extract_first()
                item['link'] = node.xpath('./td[1]/a/@href').extract_first()
                item['depart'] = node.xpath('./td[2]/text()').extract_first()
                item['category'] = node.xpath('./td[3]/text()').extract_first()
                item['type'] = node.xpath('./td[4]/text()').extract_first()
                item['address'] = node.xpath('./td[5]/text()').extract_first()
                item['num'] = node.xpath('./td[6]/text()').extract_first().strip()
                item['date'] = node.xpath('./td[7]/text()').extract_first()
                yield item

        # 翻頁處理
        # 獲取翻頁url
        part_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()

        # 判斷是否為最後一頁,如果不是最後一頁則進行翻頁操作
        if part_url != 'javascript:void(0)':
            # 拼接完整翻頁url
            next_url = 'https://hr.163.com/position/list.do' + part_url

            yield scrapy.Request(
                url=next_url,
                callback=self.parse
            )

wangyi/items.py

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.