前言
Python爬蟲、資料分析、網站開發等案例教程視頻免費在線觀看
https://space.bilibili.com/523606542
Python學習交流群:1039649593
專案需求
在專門供爬蟲初學者訓練爬蟲技術的網站(http://quotes.toscrape.com)上爬取名言警句,
創建專案
在開始爬取之前,必須創建一個新的 Scrapy 專案, 進入您打算存盤代碼的目錄中,運行下列命令:
(base) λ scrapy startproject quotes New Scrapy project 'quotes', using template directory 'd:\anaconda3\lib\site- packages\scrapy\templates\project', created in: D:\課程-爬蟲課程\02 框架爬蟲\備課代碼-框架爬蟲\quotes You can start your first spider with: cd quotes scrapy genspider example example.com
首先切換到新建的爬蟲專案目錄下,也就是 /quotes 目錄下,然后執行創建爬蟲的命令:
D:\課程-爬蟲課程\02 框架爬蟲\備課代碼-框架爬蟲 (master) (base) λ cd quotes\ D:\課程-爬蟲課程\02 框架爬蟲\備課代碼-框架爬蟲\quotes (master) (base) λ scrapy genspider quotes quotes.com Cannot create a spider with the same name as your project D:\課程-爬蟲課程\02 框架爬蟲\備課代碼-框架爬蟲\quotes (master) (base) λ scrapy genspider quote quotes.com Created spider 'quote' using template 'basic' in module: quotes.spiders.quote
該命令將會創建包含下列內容的 quotes 目錄:
quotes │ items.py │ middlewares.py │ pipelines.py │ settings.py │ __init__.py │ ├─spiders │ quote.py │ __init__.py
robots.txt
robots協議也叫robots.txt(統一小寫)是一種存放于網站根目錄下的ASCII編碼的文本檔案,它通常告訴網路搜索引擎的網路蜘蛛,此網站中的哪些內容是不應被搜索引擎的爬蟲獲取的,哪些是可以被爬蟲獲取的,
robots 協議并不是一個規范,而只是約定俗成的,
# filename:settings.py # Obey robots.txt rules ROBOTSTXT_OBEY = False
分析頁面
撰寫爬蟲程式之前,首先需要對待爬取的頁面進行分析,主流的瀏覽器中都帶有分析頁面的工具或插件,這里我們選用Chrome瀏覽器的開發者工具(Tools→Developer tools)分析頁面,
資料資訊
在Chrome瀏覽器中打開頁面http://quotes.toscrape.com,然后選擇“審查元素”,查看其HTML代碼,
可以看到每一個標簽都包裹在標簽中
撰寫spider
分析完頁面后,接下來撰寫爬蟲,在Scrapy中撰寫一個爬蟲,在 scrapy.Spider 中撰寫代碼Spider 是用戶撰寫用于從單個網站(或者一些網站)爬取資料的類,
其包含了一個用于下載的初始URL,如何跟進網頁中的鏈接以及如何分析頁面中的內容, 提取生成 item 的方法,
為了創建一個Spider,您必須繼承 scrapy.Spider 類, 且定義以下三個屬性:
- name: 用于區別Spider, 該名字必須是唯一的,您不可以為不同的Spider設定相同的名字,
- start_urls: 包含了Spider在啟動時進行爬取的url串列, 因此,第一個被獲取到的頁面將是其中之一, 后續的URL則從初始的URL獲取到的資料中提取,
- parse(): 是 spider 的一個方法, 被呼叫時,每個初始URL完成下載后生成的 Response 物件將會作為唯一的引數傳遞給該函式, 該方法負責決議回傳的資料(response data),提取資料(生成item)以及生成需要進一步處理的URL的 Request 物件,
import scrapy class QuoteSpider(scrapy.Spider): name = 'quote' allowed_domains = ['quotes.com'] start_urls = ['http://quotes.toscrape.com/'] def parse(self, response): pass
下面對 quote 的實作做簡單說明,
重點:
- name 是爬蟲的名字,是在 genspider 的時候指定的,
- allowed_domains 是爬蟲能抓取的域名,爬蟲只能在這個域名下抓取網頁,可以不寫,
- start_urls 是Scrapy抓取的網站,是可迭代型別,當然如果有多個網頁,串列中寫入多個網址即可,常用列
表推導式的形式, - parse 稱為回呼函式,該方法中的response就是 start_urls 網址發出請求后得到的回應,當然也可以指定其他函式來接收回應,一個頁面決議函式通常需要完成以下兩個任務:
提取頁面中的資料(re、XPath、CSS選擇器)提取頁面中的鏈接,并產生對鏈接頁面的下載請求,
頁面決議函式通常被實作成一個生成器函式,每一項從頁面中提取的資料以及每一個對鏈接頁面的下載請求都
由yield陳述句提交給Scrapy引擎,
決議資料
import scrapy ... def parse(self, response): quotes = response.css('.quote') for quote in quotes: text = quote.css('.text::text').extract_first() auth = quote.css('.author::text').extract_first() tages = quote.css('.tags a::text').extract() yield dict(text=text, auth=auth, tages=tages)
重點:
- response.css() 直接使用css語法即可提取回應中的資料,
- start_urls 中可以寫多個網址,以串列格式分割開即可,
- extract() 是提取css物件中的資料,提取出來以后是串列,否則是個物件,并且對于 extract_first() 是提取第一個
運行爬蟲
在 /quotes 目錄下運行 scrapy crawl quotes 即可運行爬蟲專案
運行爬蟲之后發生了什么?
Scrapy 為 Spider的 start_urls 屬性中的每個URL創建了scrapy.Request 物件,并將 parse 方法作為回呼函式(callback)賦值給了Request,
Request物件經過調度,執行生成scrapy.http.Response 物件并送回給 spider parse() 方法進行處理,
完成代碼后,運行爬蟲爬取資料,在shell中執行scrapy crawl <SPIDER_NAME>命令運行爬蟲'quote',并將爬取的資料存盤到csv檔案中:
(base) λ scrapy crawl quote -o quotes.csv 2020-01-08 20:48:44 [scrapy.utils.log] INFO: Scrapy 1.8.0 started (bot: quotes) ....
等待爬蟲運行結束后,就會在當前目錄下生成一個 quotes.csv 的檔案,里面的資料已 csv 格式存放,
-o 支持保存為多種格式,保存方式也非常簡單,只要給上檔案的后綴名就可以了,(csv、json、pickle等
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266907.html
標籤:Python
