【Scrapy】簡單項目實戰--爬取dangdang圖書信息

目錄

一、基本步驟

1、新建項目 :新建一個新的爬蟲項目

2、明確目標 (items.py):明確你想要抓取的目標

?3、制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁

?4、存儲內容 (pipelines.py):設計管道存儲爬取內容

?5、運行爬蟲

二、實戰:爬取當當圖書?


接下來介紹一個簡單的項目,完成一遍 Scrapy 抓取流程。

一、基本步驟

1、新建項目 :新建一個新的爬蟲項目

1 創建一個scrapy項目
scrapy startproject mySpider(文件夾名稱)

2、明確目標 (items.py):明確你想要抓取的目標

選擇你需要爬取的內容,例如作者名字、小說名、封面圖片等
在items.py文件中定義

?3、制作爬蟲 (spiders/xxspider.py):制作爬蟲開始爬取網頁

 生成一個爬蟲
scrapy genspider  爬蟲文件的名字 要爬的網頁
eg:[不需要加https]
https://www.baidu.com/ --> baidu.com
https://www.douban.com/  --> douban.com
scrapy genspider baidu www.baidu.com

EG 爬蟲文件解釋:

import scrapy
class BaiduSpider(scrapy.Spider):# 爬蟲的名字 一般運行爬蟲的時候 使用的值name = 'baidu'# 允許訪問的域名allowed_domains = ['www.baidu.com']# 起始的url地址  指的是第一次要訪問的域名# start_urls   是在allowed_domains的前面添加一個http://#              是在allowed_domains的后面添加一個/# 如果以html結尾 就不用加/ 否則網站進不去  報錯start_urls = ['http://www.baidu.com/']# 是執行了start_urls之后  執行的方法# 方法中的response  就是返回的那個對象# 相當于 response = urllib.request.urlopen()#       response = requests.get()def parse(self, response):pass

4、 配置中間件(middlewares.py防反爬)

# middlewares.py 添加隨機請求頭和代理
import random
from fake_useragent import UserAgentclass CustomMiddleware:def process_request(self, request, spider):# 隨機UA(偽裝不同瀏覽器)request.headers['User-Agent'] = UserAgent().random# 使用代理IP(示例用阿布云代理)request.meta['proxy'] = "http://http-dyn.abuyun.com:9020"request.headers['Proxy-Authorization'] = basic_auth_header('H01234567890123D', '0123456789012345')

?【本項目沒有防反爬機制,不用管這個文件】

?4、存儲內容 (pipelines.py):設計管道存儲爬取內容

如果想使用管道的話 那么就必須在settings中開啟管道

ITEM_PIPELINES = {# 管道可以有很多個 那么管道是有優先級 優先級的范圍是1到1000 值越小優先級越高'scrapy_dangdang.pipelines.ScrapyDangdangPipeline': 300,
}# 將在settings.py中這段話取消注釋,則打開了通道。

然后去pippelines.py中設計管道:

class ScrapyDangdangPipeline:def open_spider(self,spider):self.fp = open('book.json','w',encoding='utf-8')# item就是yield后面的對象def process_item(self, item, spider):   self.fp.write(str(item))return itemdef close_spider(self,spider):self.fp.close()

?5、運行爬蟲

在cmd中輸入:scrapy crawl 爬蟲的名字eg:scrapy crawl baidu

二、實戰:爬取當當圖書?

創建項目

上一節我們已經創建好了文件夾

?

????????創建好文件夾之后,通過cd mySprider進入到文件夾內部,創建通過scrapy genspider 爬蟲程序了,這里創建爬蟲文件,scrapy genspider dang category.dangdang.com

爬蟲文件已經創建完成,通過mySprider,spiders目錄下看到創建好的db文件。?

?

明確目標 (items.py):明確你想要抓取的目標?

  • 確定需要下載的數據,去items.py文件中添加。這里我們準備存儲圖片、名字和價格

# Define here the models for your scraped items
#
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapyclass MyspiderItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()src = scrapy.Field()# 名字name = scrapy.Field()# 價格price = scrapy.Field()pass

去爬蟲文件中去爬取我們需要的內容了(這里是在dang.py文件中)

?

import scrapy
from ..items import MyspiderItemclass DangSpider(scrapy.Spider):# 爬蟲的名字 一般運行爬蟲的時候 使用的值name = 'dang'# 允許訪問的域名# 如果是多頁下載的話 那么必須要調整的是allowed_domains的范圍 一般情況下只寫域名allowed_domains = ['category.dangdang.com']# 起始的url地址  指的是第一次要訪問的域名# start_urls   是在allowed_domains的前面添加一個http://#              是在allowed_domains的后面添加一個/# 如果以html結尾 就不用加/start_urls = ['http://category.dangdang.com/cp01.01.02.00.00.00.html']base_url = 'http://category.dangdang.com/pg'page = 1# 是執行了start_urls之后  執行的方法# 方法中的response  就是返回的那個對象# 相當于 response = urllib.request.urlopen()#       response = requests.get()def parse(self, response):# pipelines     下載數據# items         定義數據結構的# src = //ul[@id="component_59"]/li//img/@src# alt = //ul[@id="component_59"]/li//img/@alt# price = //ul[@id="component_59"]/li//p[@class="price"]/span[1]/text()# 所有的seletor的對象 都可以再次調用xpath方法li_list = response.xpath('//ul[@id="component_59"]/li')for li in li_list:#  第一張圖片和其他的圖片的標簽是屬性是不一樣的#  第一張圖片src是可以使用的 其他圖片的地址data-originalsrc = li.xpath('.//img/@data-original').extract_first()if src:src = srcelse:src = li.xpath('.//img/@src').extract_first()name = li.xpath('.//img/@alt').extract_first()price = li.xpath('.//p[@class="price"]/span[1]/text()').extract_first()book = MyspiderItem(src=src,name=name,price=price)# 獲取一個book就交給pipelinesyield book# 每一頁爬取的業務邏輯都是一樣的# 所以我們只需要將執行的那個頁的請求再次調用parse方法就可以了if self.page < 100:self.page = self.page + 1url = self.base_url + str(self.page) + '-cp01.01.02.00.00.00.html'# 怎么去調用parse方法# scrapy.Request就是scrpay的get方法# url就是請求地址# callback是你要執行的那個函數 注意不需要加圓括號yield scrapy.Request(url=url,callback=self.parse)

通過解析拿到數據之后,我們就可以去通道中添加保存的方法了(pippelines.py)

去settings.py在打開通道和添加通道,完成之后進行下一步

ITEM_PIPELINES = {# 管道可以有很多個 那么管道是有優先級 優先級的范圍是1到1000 值越小優先級越高'mySpider.pipelines.ScrapyDangdangPipeline': 300,'mySpider.pipelines.DangDangDownloadPiepline': 301,
}

?注意

黃色框起來的是你的文件名,自行修改!

  • 通道打開后,在pippelines.py完成下列操作
import os
# 如果想使用管道的話 那么就必須在settings中開啟管道
class ScrapyDangdangPipeline:def open_spider(self,spider):self.fp = open('book.json','w',encoding='utf-8')# item就是yield后面的book對象def process_item(self, item, spider):# 一下這種模式不推薦 因為每傳遞一個對象 那么就打開一次文件對文件的操作過于頻繁# # write方法必須要寫一個字符串 而不能是其他的對象# # w模式 會每一個對象都打開一次文件 覆蓋之前的內容# with open('book.json','a',encoding='utf-8') as fp:#     fp.write(str(item))self.fp.write(str(item))return itemdef close_spider(self,spider):self.fp.close()# 多條管道開啟# 定義管道類# 在settings中開啟管道# 'scrapy_dangdang.pipelines.DangDangDownloadPiepline': 301,
import urllib.requestclass DangDangDownloadPiepline:def process_item(self,item,spider):url = 'http:' + item.get('src')if not os.path.exists('./books/'):os.mkdir('./books/')filename = './books/' + item.get('name') + '.jpg'urllib.request.urlretrieve(url=url,filename=filename)return item
  • 最后在cmd中輸入:scrapy crawl dang
  • 完成之后就開始下載了,全部完成之后你就會看到多了book.json文件和books文件夾在自己的項目中。里面有數據,則表示項目成功了。

運行結果

?

三、總結?

一定要記得!!在setting開啟管道設置 ,設置的時候注意路徑名稱,在這卡了半天

? spiders/ 里的爬蟲邏輯(怎么抓,主要抓取數據的文件)
? pipelines.py 里的存儲邏輯,處理抓到的數據(怎么存,定義文件存儲方式等等)
? settings.py 里的配置參數(怎么調優)

? ? ? ? 總的來說,簡單一點的爬蟲用scrapy實現時需要先創建好項目-->明確要爬取的目標--->分析頁面,看看數據存在什么標簽中,寫爬取的py文件--->看看是否有反爬機制--->在管道文件中添加對數據的處理方式。

? ? ? ?

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

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

相關文章

開源CMS系統的SEO優化功能主要依賴哪些插件?

在當今互聯網時代&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;是網站獲取流量的核心手段之一。開源內容管理系統&#xff08;CMS&#xff09;因其靈活性和豐富的插件生態&#xff0c;成為許多開發者和企業的首選。本文將以主流開源CMS為例&#xff0c;深入解析其SEO優…

在 JMeter 中使用 BeanShell 獲取 HTTP 請求體中的 JSON 數據

在 JMeter 中&#xff0c;您可以使用 BeanShell 處理器來獲取 HTTP 請求體中的 JSON 數據。以下是幾種方法&#xff1a; 方法一&#xff1a;使用前置處理器獲取請求體 如果您需要在發送請求前訪問請求體&#xff1a; 添加一個 BeanShell PreProcessor 到您的 HTTP 請求采樣器…

在 WSL (Windows Subsystem for Linux) 中配置和安裝 Linux 環境

在 WSL (Windows Subsystem for Linux) 中配置和安裝 Linux 環境 WSL 允許你在 Windows 上運行 Linux 環境&#xff0c;以下是詳細的配置和安裝指南。 1. 安裝前的準備工作 系統要求 Windows 10 版本 2004 及更高版本(內部版本 19041 及更高版本)或 Windows 11 64 位系統 虛…

AlphaFold蛋白質結構數據庫介紹

AlphaFold Protein Structure Database (AlphaFold DB) 是 DeepMind + EMBL-EBI 合作開發的公開蛋白質結構預測數據庫,是利用 AlphaFold2/AlphaFold3 AI模型 預測的全基因組級蛋白質三維結構庫。 網址: https://alphafold.ebi.ac.uk 項目內容主辦單位DeepMind + EMBL-EBI上線…

3.2goweb框架GORM

GORM 是 Go 語言中功能強大的 ORM&#xff08;對象關系映射&#xff09;框架&#xff0c;支持 MySQL、PostgreSQL、SQLite、SQL Server 等主流數據庫。以下是 GORM 的核心概念和用法詳解&#xff1a; ??一、基礎入門?? 1. 安裝 go get -u gorm.io/gorm go get -u gorm.io…

第三部分:特征提取與目標檢測

像邊緣、角點、特定的紋理模式等都是圖像的特征。提取這些特征是許多計算機視覺任務的關鍵第一步&#xff0c;例如圖像匹配、對象識別、圖像拼接等。目標檢測則是在圖像中找到特定對象&#xff08;如人臉、汽車等&#xff09;的位置。 本部分將涵蓋以下關鍵主題&#xff1a; …

Canvas基礎篇:圖形繪制

Canvas基礎篇&#xff1a;圖形繪制 圖形繪制moveTo()lineTo()lineTo繪制一條直線代碼示例效果預覽 lineTo繪制平行線代碼示例效果預覽 lineTo繪制矩形代碼示例效果預覽 arc()arc繪制一個圓代碼實現效果預覽 arc繪制一段弧代碼實現效果預覽 arcTo()rect()曲線 結語 圖形繪制 在…

瑞芯微芯片算法開發初步實踐

文章目錄 一、算法開發的一般步驟1.選擇合適的深度學習框架2.對于要處理的問題進行分類&#xff0c;是回歸問題還是分類問題。3.對數據進行歸納和整理4.對輸入的數據進行歸一化和量化&#xff0c;保證模型運行的效率和提高模型運行的準確度5.在嵌入式處理器上面運行模型&#x…

計算機畢業設計--基于深度學習(U-Net與多尺度ViT)的模糊車牌圖像清晰化復原算法設計與實現(含Github代碼+Web端在線體驗鏈接)

基于深度學習的U-Net架構下多尺度Transformer車牌圖像去模糊算法設計與實現 如果想對舊照片進行模糊去除&#xff0c;劃痕修復、清晰化&#xff0c;請參考這篇CSDN作品&#x1f447; 計算機畢業設計–基于深度學習的圖像修復&#xff08;清晰化劃痕修復色彩增強&#xff09;算…

(Go Gin)Gin學習筆記(四)Gin的數據渲染和中間件的使用:數據渲染、返回JSON、淺.JSON()源碼、中間件、Next()方法

1. 數據渲染 1.1 各種數據格式的響應 json、結構體、XML、YAML類似于java的properties、ProtoBuf 1.1.1 返回JSON package mainimport ("github.com/gin-gonic/gin""net/http" )func main() {r : gin.Default()r.POST("/demo", func(res *gi…

實驗:串口通信

/************************************************* * AT89C52 串口通信實驗&#xff08;實用修正版&#xff09; * 特點&#xff1a; * 1. 解決所有編譯警告 * 2. 保持代碼簡潔 * 3. 完全功能正常 ************************************************/ #include <re…

智駕賽道的諾曼底登陸,Momenta上海車展雄起

作者 |蘆葦 編輯 |德新 今年的上海車展依舊熱鬧非凡&#xff0c;但火熱的車市背后也是暗流涌動。尤其對智駕供應商而言&#xff0c;「智駕平權」帶動了解決方案大量上車&#xff0c;各大主機廠紛紛選定各自的主要供應商&#xff0c;這也意味著賽道機會越發收斂。 正如汽車品牌…

Java 事務詳解

目錄 一、事務的基本概念1.1 什么是事務?1.2 事務的 ACID 特性二、Java 事務管理的實現方式2.1 JDBC 事務管理2.2 Spring 事務管理2.2.1 添加 Spring 依賴2.2.2 配置 Spring 事務管理2.2.3 使用 Spring 事務注解三、事務隔離級別四、最佳實踐4.1 盡量縮小事務范圍4.2 合理選擇…

DirectX12(D3D12)基礎教程七 深度模板視圖\剔除\謂詞

本章主要講遮擋&#xff0c;作者認為比較復雜有難度的知識點&#xff0c;作為基礎教程不會深入講解。 GPU渲染管線 主要包括以下階段 輸入裝配&#xff08;IA&#xff09;&#xff1a;讀取頂點數據 &#xff0c;定義頂點數據結構頂點著色&#xff08;VS&#xff09;&#xf…

溫補晶振(TCXO)穩定性優化:從實驗室到量產的關鍵技術

在現代通信、航空航天、5G基站等對頻率穩定性要求極高的領域&#xff0c;溫補晶振&#xff08;TCXO&#xff09;扮演著不可或缺的角色。其穩定性直接影響系統的性能與可靠性&#xff0c;因此&#xff0c;對TCXO穩定性優化技術的研究與實踐至關重要。 一、溫度補償算法&#xff…

C++,設計模式,【建造者模式】

文章目錄 通俗易懂的建造者模式&#xff1a;手把手教你造電腦一、現實中的建造者困境二、建造者模式核心思想三、代碼實戰&#xff1a;組裝電腦1. 產品類 - 電腦2. 抽象建造者 - 裝機師傅3. 具體建造者 - 電競主機版4. 具體建造者 - 辦公主機版5. 指揮官 - 裝機總控6. 客戶端使…

前端基礎之《Vue(13)—重要API》

重要的API 一、nextTick() 1、寫法 Vue.$nextTick()或者this.$nextTick() 原因&#xff1a; set操作代碼是同步的&#xff0c;但是代碼背后的行為是異步的。set操作修改聲明式變量&#xff0c;觸發re-render生成新的虛擬DOM&#xff0c;進一步執行diff運算&#xff0c;找到…

Windows 中搭建 browser-use WebUI 1.4

目錄 1. 背景介紹2. 搭建過程3. 補充 1. 背景介紹 背景&#xff1a;想要在 Windows 中復現 browser-use WebUI pickle反序列化漏洞&#xff0c;該漏洞在 v1.7 版本中已經修復&#xff0c;所以需要搭建 小于 1.7 版本的環境&#xff0c;我這里搭建的是 1.4 版本。 項目地址&am…

【數據通信完全指南】從物理層到協議棧的深度解析

目錄 1. 通信技術演進與核心挑戰1.1 從電報到5G的技術變遷1.2 現代通信系統的三大瓶頸 2. 通信系統架構深度解構2.1 OSI七層模型運作原理2.2 TCP/IP協議棧實戰解析 3. 物理層關鍵技術實現3.1 信號調制技術演進路線3.2 信道復用方案對比 4. 數據傳輸可靠性保障4.1 CRC校驗算法數…

CMD與PowerShell:Windows命令行工具的對比與使用指南

CMD與PowerShell&#xff1a;Windows命令行工具的對比與使用指南 文章目錄 CMD與PowerShell&#xff1a;Windows命令行工具的對比與使用指南引言1. CMD&#xff08;命令提示符&#xff09;簡介1.1 什么是CMD&#xff1f;1.2 CMD的特點1.3 常用CMD命令示例1.4 CMD的優勢與局限 2…