scrapy框架介紹

Scrapy是Python開發的一個快速、高層次的屏幕抓取和web抓取框架,用於抓取web站點並從頁面中提取結構化數據的應用程序框架。Scrapy用途普遍,能夠用於數據挖掘、監測和自動化測試;html

Scrapy吸引人的地方在於它是一個框架,任何人均可以根據需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等;python

1.Scrapy五大基本構成

  • Scrapy框架主要由五大組件組成,分別是調度器(Scheduler)、下載器(Downloader)、爬蟲(Spider)和實體管道(Item Pipeline)、Scrapy引擎(Scrapy Engine);web

  • 調度器:能夠假設成一個URL的優先隊列,由它來決定下一個要抓取的網址是什麼,同時去除重複的網址;網絡

  • 下載器:是全部組件中負擔最大的,用於高速地下載網絡上的資源;框架

  • 爬蟲:是用戶最關心的部份,用戶定製本身的爬蟲,用於從特定的網頁中提取本身須要的信息,也能夠從中提取出連接,讓Scrapy繼續抓取下一個頁面;dom

  • 實體管道:用於處理爬蟲提取的實體,要的功能是持久化實體、驗證明體的有效性、清除不須要的信息;scrapy

  • Scrapy引擎:是整個框架的核心,用來控制調試器、下載器、爬蟲,實際上引擎至關於計算機的CPU,控制着整個流程;ide

2.使用scrapy框架爬取網頁數據

  • 第一步:首先要使用scrapy框架須要先安裝它,可使用pip安裝scrapy框架,注意若是在Windows系統下直接使用pip命令行安裝可能會報錯,這時須要手動安裝幾個依賴庫如wheel、lxml、Twisted、pywin32等,報錯信息會提示你缺乏哪一個庫。

這裏提一下Twisted插件的安裝,它的下載地址爲: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted, 進入後找到twisted,選擇下載對應的版本,其中cp表示python版本,下載完成後進入終端,輸入pip install Twisted-19.2.0-cp37-cp37m-win_amd64.whl,這裏注意你下載的是哪一個版本就輸入哪一個版本的文件名,安裝完成後再輸入pip install scrapy就能成功安裝scrapy框架了;函數

  • 第二步:建立爬蟲項目,建立儲存 scrapy 文件夾scrapy_python,而後在命令行工具中cd進入這個項目路徑,用 scrapy startproject 名稱命令新建項目;

這樣咱們就成功的建立了一個scrapy項目,咱們在PyCharm中看看工具

  • 第三步:能夠在剛剛建立的項目的spiders文件夾中建立一個蜘蛛文件,用於爬取網頁數據的,咱們試着爬取一下csdn網站,那麼新建蜘蛛的命令行是:scrapy genspider csdn www.csdn.net,其中csdn是你建立的蜘蛛的文件名,而www.csdn.net表示爬取的目標網址的域名,你想爬取哪一個網站就使用哪一個網站的域名。

  • 第四步:若是要啓動咱們建立的蜘蛛文件,咱們可使用命令行:scrapy crawl csdn,這裏的csdn是蜘蛛文件中name的對應值;

  • 第五步:想要測試爬去數據是否成功,咱們能夠在項目的模板中建立一個測試文件,如:start_spider.py,而後經過debug來進行項目調試,能夠輸出咱們想要爬取的網頁數據;

from scrapy.cmdline import execute
execute(["scrapy", "crawl", "csdn",])
  • 第六步:爬取數據時須要遵循爬蟲協議,它用來限定爬蟲程序能夠爬取的內容範圍,位於scrapy 項目的 settings.py文件中默認 ROBOTSTXT_OBEY = True,即遵照此協議,當咱們想要爬取的內容不符合該協議但仍要爬取時,能夠設置 ROBOTSTXT_OBEY = False,表示不遵照此協議;

  • 第七步:這樣咱們就能夠開始使用Xpath選擇器或者CSS選擇器來解析想要爬取的頁面數據了;

3.Xpath選擇器的介紹

  • XPath的全稱是XML Path Language,即XML路徑語言,它是一種在結構化文檔中定位信息的語言,XPath使用路徑表達式來選取XML文檔中的節點或節點集。節點是經過沿着路徑 (path) 或者步 (steps) 來選取的;

  • 謂語用來查找某個特定的節點或者包含某個指定的值的節點,謂語嵌在方括號中,好比//body//a[1]表示選取屬於body 子元素的第一個 a 元素,//a[@href]表示選取全部擁有名爲 href 的屬性的 a 元素等;

  • 除了索引、屬性外,Xpath還可使用便捷的函數來加強定位的準確性,如contains(s1,s2)表示若是s1中包含s2則返回true,反之返回false、text()表示獲取節點中的文本內容、starts-with()表示從起始位置匹配字符串;

  • 使用XPath選取節點的經常使用語法有

表達式書寫方式 表達式意義
* 選擇HTML頁面中任意的節點
/ 從根節點選取
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置
. 選取當前節點
.. 選取當前節點的父節點
/bookstore/book[1] 選取屬於 bookstore 子元素的第一個 book 元素
/bookstore/book[last()] 選取屬於 bookstore 子元素的最後一個 book 元素
/bookstore/book[last()-1] 選取屬於 bookstore 子元素的倒數第二個 book 元素
//title[@lang] 選取全部擁有名爲 lang 的屬性的 title 元素
//title[@lang='eng'] 選取全部 title 元素,且這些元素擁有值爲 eng 的 lang 屬性
/bookstore/book[price>35.00] 選取 bookstore 元素的全部 book 元素,且其中的 price 元素的值須大於 35.00
/bookstore/book[price>35.00]/title 選取 bookstore 元素中的 book 元素的全部 title 元素,且其中的 price 元素的值須大於 35.00
//* 選取文檔中的全部元素
//title[@*] 選取全部帶有屬性的 title 元素
//book/title , //book/price 選取 book 元素的全部 title 和 price 元素
//title , //price 選取文檔中的全部 title 和 price 元素
child::book 選取全部屬於當前節點的子元素的 book 節點
child::text() 選取當前節點的全部文本子節點
/bookstore/book/title 選取全部 title 節點
/bookstore/book/price/text() 選取 price 節點中的全部文本
//* 任意元素

使用XPath

咱們來經過XPath選擇器爬取網站中咱們想要爬取的信息,以下圖咱們來爬去今日推薦中的標題

import scrapy
class CsdnSpider(scrapy.Spider):
    name = 'csdn'
    allowed_domains = ['www.csdn.net']
    start_urls = ['http://www.csdn.net/']

    def parse(self, response):
       # 選擇全部class="company_name"的h3元素下的a元素的文本 
       result = response.xpath('//h3[@class="company_name"]/a/text()').extract()
       # 將獲得的文本列表循環 
       for i in result:
           print(i)

咱們來看一下輸出打印,看看是否是咱們想要的結果

參考:https://www.9xkd.com/user/plan-view.html?id=2020510935

相關文章
相關標籤/搜索