scrapy庫進階一

scrapy 庫復習

scrapy的概念:Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架

scrapy框架的運行流程以及數據傳遞過程:

  1. 爬蟲中起始的url構造成request對象–>爬蟲中間件–>引擎–>調度器
  2. 調度器把request–>引擎–>下載中間件—>下載器
  3. 下載器發送請求,獲取response響應---->下載中間件---->引擎—>爬蟲中間件—>爬蟲
  4. 爬蟲提取url地址,組裝成request對象---->爬蟲中間件—>引擎—>調度器,重復步驟2
  5. 爬蟲提取數據—>引擎—>管道處理和保存數據

創建項目和爬蟲

scrapy startproject <項目名稱>
scrapy genspider <爬蟲名字>  <允許爬取的域名>

網上找的簡單實例

import scrapyclass ItcastSpider(scrapy.Spider):# 爬蟲名字name = 'itcast'# 允許爬取的范圍allowed_domains = ['itcast.cn']# 開始爬取的url地址start_urls = ['http://www.itcast.cn/channel/teacher.shtml']# 數據提取的方法,接受下載中間件傳過來的responsedef parse(self, response):# scrapy的response對象可以直接進行xpathnames = response.xpath('//div[@class="tea_con"]//li/div/h3/text()')print(names)# 獲取具體數據文本的方式如下# 分組li_list = response.xpath('//div[@class="tea_con"]//li')for li in li_list:# 創建一個數據字典item = {}# 利用scrapy封裝好的xpath選擇器定位元素,并通過extract()或extract_first()來獲取結果item['name'] = li.xpath('.//h3/text()').extract_first()  # 老師的名字item['level'] = li.xpath('.//h4/text()').extract_first()  # 老師的級別item['text'] = li.xpath('.//p/text()').extract_first()  # 老師的介紹print(item)

運行方式,在文件所在目錄內運行 scrapy crawl <爬蟲名>

注意:

  • scrapy.Spider爬蟲類中必須有名為parse的解析
  • 如果網站結構層次比較復雜,也可以自定義其他解析函數
  • 在解析函數中提取的url地址如果要發送請求,則必須屬于allowed_domains范圍內,但是start_urls中的url地址不受這個限制,我們會在后續的課程中學習如何在解析函數中構造發送請求
  • 啟動爬蟲的時候注意啟動的位置,是在項目路徑下啟動
  • parse()函數中使用yield返回數據,注意:解析函數中的yield能夠傳遞的對象只能是:BaseItem, Request, dict, None

解析并獲取scrapy爬蟲中的數據: 利用xpath規則字符串進行定位和提取

  • response.xpath方法的返回結果是一個類似list的類型,其中包含的是selector對象,操作和列表一樣,但是有一些額外的方法
  • 額外方法extract():返回一個包含有字符串的列表
  • 額外方法extract_first():返回列表中的第一個字符串,列表為空沒有返回None

利用管道pipeline來處理(保存)數據

在pipelines.py文件中定義對數據的操作

  1. 定義一個管道類
  2. 重寫管道類的process_item方法
  3. process_item方法處理完item之后必須返回給引擎
import json
class ItcastPipeline():# 爬蟲文件中提取數據的方法每yield一次item,就會運行一次# 該方法為固定名稱函數def process_item(self, item, spider):print(item)return item

在settings.py配置啟用管道

ITEM_PIPELINES = {'myspider.pipelines.ItcastPipeline': 400
}

配置項中鍵為使用的管道類,管道類使用.進行分割,第一個為項目目錄,第二個為文件,第三個為定義的管道類。

配置項中值為管道的使用順序,設置的數值約小越優先執行,該值一般設置為1000以內。

scrapy 構造并發送請求

數據建模

通常在做項目的過程中,在 items.py 中進行數據建模

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

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

class MyspiderItem(scrapy.Item):name = scrapy.Field()  #名字title = scrapy.Field() #職稱desc = scrapy.Field()  #介紹
3、如何使用建好的模板

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

from mySpider.mySpider.items import MyspiderItem  #導入itemclass ItcastSpider(scrapy.Spider):……# 數據提取的方法,接受下載中間件傳過來的responsedef parse(self, response):……for li in li_list:# 創建一個數據字典item = MyspiderItem()# 利用scrapy封裝好的xpath選擇器定位元素,并通過extract()或extract_first()來獲取結果item['name'] = li.xpath('.//h3/text()').extract_first()  # 老師的名字item['level'] = li.xpath('.//h4/text()').extract_first()  # 老師的級別item['text'] = li.xpath('.//p/text()').extract_first()  # 老師的介紹yield item

注意:

  1. from myspider.items import MyspiderItem這一行代碼中 注意item的正確導入路徑,忽略pycharm標記的錯誤
  2. python中的導入路徑要訣:從哪里開始運行,就從哪里開始導入
翻頁請求

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

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

scrapy實現翻頁的思路:

  1. 找到下一頁的url地址
  2. 構造url地址的請求對象,傳遞給引擎
構造 Request 對象,并發送請求
1、 實現方法
  1. 確定url地址
  2. 構造請求,scrapy.Request(url,callback)
    • callback:指定解析函數名稱,表示該請求返回的響應使用哪一個函數進行解析
  3. 把請求交給引擎:yield scrapy.Request(url,callback)
2、招聘爬蟲實例

通過網易招聘頁面爬取招聘信息,并實現翻頁請求

步驟:

1、獲取首頁的數據

2、尋找下一頁的地址,進行翻頁,獲取數據

spider 文件

import scrapyclass mySpider(scrapy.Spider):name = "joblistspider"allowed_domains = ["gz.gov.cn"]start_urls = ["https://www.gz.gov.cn/zwgk/zcjd/zcjd/index.html"]base_url = "https://www.gz.gov.cn/zwgk/zcjd/zcjd/index_"offset = 1end = '.html'def parse(self, response):#提取下一頁的hrefnex_url = response.xpath("//ul[@class='news_list']/li")for url in nex_url:item = {}item['name'] = url.xpath("./a/text()").extract_first()item['time'] = url.xpath("./span/text()").extract_first()item['link'] = url.xpath("./a/@href").extract_first()yield itemif self.offset <=40:self.offset += 1url = self.base_url+str(self.offset)+self.endyield scrapy.Request(url, callback=self.parse)

pipelines.py

import jsonclass JoblistspiderPipeline:def __init__(self):#self.f = open('joblist.json','w')self.f = open('joblist.csv','w',encoding='utf-8')def process_item(self, item, spider):content = json.dumps(dict(item), ensure_ascii=False) + ',\n'self.f.write(content)return itemdef close_spider(self, spider):self.f.close()

setting.py

ITEM_PIPELINES = {'Gzgov.pipelines.GzgovPipeline': 300,
}ROBOTSTXT_OBEY = False

scrapy.Request的更多參數
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])

參數解釋:

  • 中括號里的參數為可選參數
  • callback:表示當前的url的響應交給哪個函數去處理
  • meta:實現數據在不同的解析函數中傳遞,meta默認帶有部分數據,比如下載延遲,請求深度等
  • dont_filter:默認為False,會過濾請求的url地址,即請求過的url地址不會繼續被請求,對需要重復請求的url地址可以把它設置為Ture,比如貼吧的翻頁請求,頁面的數據總是在變化;start_urls中的地址會被反復請求,否則程序不會啟動
  • method:指定POST或GET請求
  • headers:接收一個字典,其中不包括cookies
  • cookies:接收一個字典,專門放置cookies
  • body:接收json字符串,為POST的數據,發送payload_post請求時使用(在下一章節中會介紹post請求)
meta 參數使用

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

    ……yield scrapy.Request(url, callback=self.parse,meta={"item":item})

特別注意

meta參數是一個字典

meta字典中有一個固定的鍵proxy,表示代理ip

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

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

相關文章

Objective-C實現iOS平臺微信步數修改指南

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本文介紹如何在iOS平臺上使用Objective-C語言&#xff0c;通過蘋果的HealthKit框架讀取和修改微信步數以及相關健康數據。首先介紹如何引入和使用HealthKit框架&#xff0c;包括請求權限、讀取步數數據、寫入步…

【ElementPlus】深入探索ElementPlus:前端界面的全能組件庫

&#x1f4da; 引言在現代 Web 開發中&#xff0c;創建既美觀又功能強大的用戶界面是一項挑戰。Element Plus&#xff0c;作為 Vue 3 生態中的明星 UI 組件庫&#xff0c;以其豐富的組件、優秀的性能和易用性贏得了廣大開發者的青睞。本文將全面覆蓋 Element Plus 的 常用核心組…

Json Jsoncpp

文章目錄Json 介紹Jsoncpp 介紹Json::Value序列化接口反序列化接口序列化操作反序列化操作Json 介紹 JSON&#xff08;JavaScript Object Notation&#xff0c;JavaScript 對象表示法&#xff09;是一種輕量級的數據交換格式&#xff0c;具有簡潔、易讀、跨平臺等特點&#xff…

openwrt下安裝istore(基于pve)

openwrt下安裝istore&#xff08;基于pve&#xff09;ssh連接到openwrt&#xff0c;用如下命令安裝istore&#xff1a;opkg update || exit 1cd /tmpwget https://github.com/linkease/openwrt-app-actions/raw/main/applications/luci-app-systools/root/usr/share/systools/i…

2025年Python Web框架之爭:Django、Flask還是FastAPI,誰將主宰未來?

文章概要 作為一名Python開發者&#xff0c;我經常被問到同一個問題&#xff1a;在2025年&#xff0c;Django、Flask和FastAPI哪個框架更值得使用&#xff1f;隨著技術的快速發展&#xff0c;這個問題的答案也在不斷變化。本文將全面比較這三個主流Python Web框架的特點、性能、…

高級11-Java日志管理:使用Log4j與SLF4J

在現代Java應用開發中&#xff0c;日志&#xff08;Logging&#xff09;是系統監控、調試、故障排查和性能分析的核心工具。一個高效、靈活、可配置的日志系統&#xff0c;不僅能幫助開發者快速定位問題&#xff0c;還能為運維團隊提供寶貴的運行時信息。在Java生態系統中&…

sc-atac的基礎知識(0)

sc-atac的基礎知識 **fragment**是ATAC-seq實驗中的一個重要概念&#xff0c;它指的是通過Tn5轉座酶對DNA分子進行酶切&#xff0c;然后經由雙端測序得到的序列。根據Tn5插入導致的偏移從read比對得到的位置推斷出fragment的起始和結束位置。根據之前的報道&#xff0c;Tn5轉座…

Python從入門到精通計劃Day01: Python開發環境搭建指南:從零開始打造你的“數字廚房“

目錄一、配置你的「魔杖」&#xff1a;Python 3.x安裝1.1 跨平臺安裝指南1.2 驗證你的「法力值」二、選擇你的「魔法工坊」&#xff1a;IDE配置2.1 VS Code&#xff1a;輕量級實驗室2.2 PyCharm&#xff1a;專業級法師塔三、施展第一個「魔咒」&#xff1a;Hello World3.1 基礎…

MCP Agent 工程框架Dify初探

目錄引言一、Dify是什么二、為什么使用Dify三、使用Dify要怎么做1、聊天助手2、Agent2.1 Function calling&#xff08;函數調用&#xff09;和 ReAct 兩種推理模式的區別2.1.1 技術本質與工作流程對比2.1.2 優缺點對比2.1.3 適用場景與選擇依據2.2 LangChain 的 Agent 實現原理…

無人機光伏巡檢漏檢率↓78%!陌訊多模態融合算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;轉載請注明來源。一、行業痛點&#xff1a;無人機光伏巡檢的 "識別困境"光伏電站的大規模鋪設推動了無人機巡檢的普及&#xff0c;但實際作業中仍面臨三大技術瓶頸…

機動車占道識別準確率提升 29%:陌訊動態輪廓感知算法實戰解析

原創聲明本文為原創技術解析&#xff0c;核心技術參數與架構設計引用自《陌訊技術白皮書》&#xff0c;禁止未經授權的轉載與改編。一、行業痛點&#xff1a;機動車占道治理的技術瓶頸城市交通監控中&#xff0c;機動車占用應急車道、公交車道等違規行為已成為影響通行效率與交…

UNet改進(29):記憶增強注意力機制在UNet中的創新應用-原理、實現與性能提升

記憶增強注意力機制概述 記憶增強注意力是一種結合了外部記憶模塊的注意力機制,它使神經網絡能夠存儲和檢索長期知識,而不僅僅是依賴當前的輸入特征。這種機制特別適合需要保持長期依賴關系的任務,如醫學圖像分割,其中模型需要記住不同樣本中出現的常見模式。 核心組件 記…

使用Python開發Ditto剪貼板數據導出工具

前言在日常工作中&#xff0c;我們經常需要處理大量的剪貼板數據。Ditto作為一款優秀的剪貼板管理軟件&#xff0c;幫助我們保存了豐富的歷史記錄。但有時我們需要將這些數據導出進行進一步分析或備份&#xff0c;而Ditto本身并沒有提供直觀的批量導出功能。C:\pythoncode\new\…

【人工智能】提示詞設計原則:簡潔性、明確性、具體性如何平衡?

提示詞設計原則&#xff1a;簡潔性、明確性、具體性如何平衡&#xff1f;1. 提示詞設計三大原則的核心內涵1.1 簡潔性1.1.1 定義用最少的文字傳遞核心信息&#xff0c;避免冗余和不必要的描述。比如 “寫 3 個春天的成語” 比 “我想讓你寫出來 3 個和春天有關系的成語詞語” 更…

JS的作用域

文章目錄一、為什么需要作用域&#xff1f;二、什么是 JS 作用域&#xff1f;2.1 什么是詞法作用域和動態作用域&#xff1f;1. 詞法作用域&#xff08;Lexical Scpoe&#xff09;2. 動態作用域2.2 JS 的作用域2.3 JS 作用域的分類1. 全局作用域2. 模塊作用域3. 函數作用域4. 塊…

OLTP,OLAP,HTAP是什么,數據庫該怎么選

目錄 OLTP&#xff08;Online Transaction Processing&#xff09;聯機事務處理 OLAP&#xff08;Online Analytical Processing&#xff09;聯機分析處理 非實時OLAP 實時OLAP HTAP&#xff08;Hybrid Transactional/Analytical Processing&#xff09; OLAP 和 OLTP 數…

【前端】CSS Flexbox布局示例介紹

CSS Flexbox&#xff08;彈性盒子&#xff09;簡介 Flexbox 是一種一維布局模型&#xff0c;用于高效處理元素在容器內的空間分配、對齊和排序。它通過父容器&#xff08;flex container&#xff09;和子元素&#xff08;flex items&#xff09;的配合實現靈活響應式布局。核心…

Vue3核心語法基礎

一、為什么要學 Composition API&#xff1f;在以前我們寫代碼用Vue2寫&#xff1a;export default {data() {return { count: 0, msg: hello }},methods: {add() { this.count }},computed: {double() { return this.count * 2 }} }很明顯 一個功能被拆成三塊&#xff1a;data…

FSMC的配置和應用

一、FSMC 簡介與工作原理FSMC&#xff08;Flexible Static Memory Controller&#xff09;是 STM32 微控制器中用于與外部靜態存儲器&#xff08;如 SRAM、PSRAM、NOR Flash、LCD 等&#xff09;進行通信的一個外設模塊。1、支持的設備類型&#xff1a;SRAM / PSRAMNOR FlashNA…

Linux I/O 系統調用完整對比分析

Linux I/O 系統調用完整對比分析 1. 概述 Linux 提供了豐富的 I/O 系統調用&#xff0c;每種都有其特定的用途和優勢。本文將詳細分析這些系統調用的特點、使用場景和性能特征。 2. 系統調用詳細對比 2.1 基本讀寫函數 pread/pwrite #include <unistd.h>// 位置指定…