Scrapy實戰5:Xpath實戰訓練

2021-03-02 Python綠色通道
系列文章

Scrapy實戰4:初識爬蟲框架Scrapy

Scrapy實戰3:URL去重策略

Scrapy實戰2:爬蟲深度&&廣度優先算法

Scrapy實戰1| 正則表達式


    今天給大家分享的是,如何在cmd和pycharm中啟動自己的spider以及Xpath的基本介紹,並利用Xpath抓取伯樂在線單篇文章基本信息。

二、Xpath介紹1. 維基百科看 Xpath

XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。
XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力。起初XPath的提出的初衷是將其作
為一個通用的、介於XPointer與XSL間的語法模型。但是XPath很快的被開發者採用來當作小型查詢
語言。

2.我來扯扯Xpath

1. Xpath使用路徑表達式在xml和html中進行導航(據說訪問速度、效率比bs4快)
2. Xpath包含標準函數庫
3. Xpah是一個W3c的標準

3.Xpath基本使用語法

語法表01語法表0語法表03
三、看代碼,邊學邊敲邊記1.在cmd下啟動我們的Scrapy項目子項---jobbole

(1)快速進入虛擬環境(設置方法見上一篇)

C:\Users\82055\Desktop>workon spiderenv

(2)進入到項目目錄

(spiderenv) C:\Users\82055\Desktop>H:
(spiderenv) H:\env\spiderenv>cd H:\spider_project\spider_bole_blog\spider_bole_blog

(3)輸入spider命令(格式:scrapy crawl 子項的name)

(spiderenv) H:\spider_project\spider_bole_blog\spider_bole_blog>scrapy crawl jobbole

(4)如果是win系統,可能會出現下面錯誤

<module>
    from twisted.internet import _win32stdio
  File "h:\env\spiderenv\lib\site-packages\twisted\internet\_win32stdio.py", line 9, in <module>
    import win32api
ModuleNotFoundError: No module named 'win32api'

(5)解決方法:安裝 pypiwin32模塊(採用豆瓣源安裝)


pip install -i https://pypi.douban.com/simple pypiwin32

(6)再次執行spider命令

(spiderenv) H:\spider_project\spider_bole_blog\spider_bole_blog>scrapy crawl jobbole
2018-08-23 23:42:01 [scrapy.utils.log] INFO: Scrapy 1.5.1 started (bot: spider_bole_blog)
···
2018-08-23 23:42:04 [scrapy.core.engine] INFO: Closing spider (finished)
2018-08-23 23:42:04 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 440,
 'downloader/request_count': 2,
 'downloader/request_method_count/GET': 2,
 'downloader/response_bytes': 21919,
 'downloader/response_count': 2,
 'downloader/response_status_count/200': 2,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2018, 8, 23, 15, 42, 4, 695188),
 'log_count/DEBUG': 3,
 'log_count/INFO': 7,
 'response_received_count': 2,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2018, 8, 23, 15, 42, 2, 770906)}
2018-08-23 23:42:04 [scrapy.core.engine] INFO: Spider closed (finished)

2.在`Pycharm`下啟動我們的Scrapy項目子項---jobbole

(1)打開項目,在項目根目錄下新建一個main.py,用於調試代碼。
(2)在main.py中輸入下面內容

'''
author : 極簡XksA
data : 2018.8.22
goal : 調試模塊
'''
import sys
import os

from scrapy.cmdline import execute









sys.path.append(os.path.dirname(os.path.abspath(__file__)))

execute(['scrapy','crawl','jobbole'])

(3)修改setting.py文件設置,將ROBOTSTXT_OBEY值改為False,默認為True或者被注釋掉了,文件中注釋解釋內容:Obey robots.txt rules,表示我們的spider的網址必須要遵循robots協議,不然會直接被過濾掉,所以這個變量的屬性值必須設置為Fal0se哦!




ROBOTSTXT_OBEY = False

(4)直接運行測試文件main.py,運行結果和上面在cmd是一樣的。
(5)在jobbole.py中的的parse函數中加一個斷點,然後Debug模式運行測試文件main.py
斷點設置:

斷點設置debug結果分析:

debug結果分析
3.編寫`jobbole.py`中的的`parse`函數,利用Xpath獲取網頁內容

(1)為了簡單起見,我隨便選取了一篇文章《Linux 內核 Git 歷史記錄中,最大最奇怪的提交信息是這樣的》。
(2)把start_urls的屬性值改為http://blog.jobbole.com/114256/,使spider從當前文章開始爬起來。

start_urls = ['http://blog.jobbole.com/114256/']

(3)網頁中分析並獲取文章標題Xpath路徑

頁面分析在FireFox瀏覽器下按F12進入開發者模式,選擇查看器左邊的選取圖標功能,然後將滑鼠移動到標題處,在查看器中會自動為我們找到源碼中標題的位置,如上圖分析,標題應該在html下的body中的第一個div中的第三個div中的第一個div中的第一個div中的h1標籤中,那麼Xpath路徑即為:

/html/body/div[1]/div[3]/div[1]/div[1]/h1

是不是感覺到很複雜,哈哈哈,不用灰心,其實分析起來挺簡單的,另外我們還有更簡單的方法獲取Xpath,當我們在查看器重找到我們要的內容後,直接右鍵,即可複製我們想要的內容的Xpath路徑了。

頁面複製Xpath(4)修改jobbole.py中的的parse函數,運行列印出文章標題



def parse(self, response):
    
    re01_selector = response.xpath('/html/body/div[1]/div[3]/div[1]/div[1]/h1/text()')
    
    re02_selector = response.xpath('//*[@id="post-114256"]/div[1]/h1/text()')
    re01_title = re01_selector.extract()
    re02_title = re02_selector.extract()
    print('xpath返回內容:'+str(re01_selector))
    print('firefox返回文章標題為:' + re01_title)
    print('chrome返回文章標題為:' + re02_title)

運行結果:


xpath返回內容:[<Selector xpath='/html/body/div[1]/div[3]/div[1]/div[1]/h1/text()'
data='Linux 內核 Git 歷史記錄中,最大最奇怪的提交信息是這樣的'>]
firefox返回文章標題為:Linux 內核 Git 歷史記錄中,最大最奇怪的提交信息是這樣的
chrome返回文章標題為:Linux 內核 Git 歷史記錄中,最大最奇怪的提交信息是這樣的

從上面可以看出,FireFox和Chorme獲取到的Xpath是不一樣的,but實際返回的東西是一樣的,只是用了不同的語法,我這裡說明的意思是想告訴大家:Xpath的表達方式不止一種,可能某個內容的Xpath有兩種或者更多,大家覺得怎麼好理解就使用哪一個。
(5)我們繼續獲取其他數據(複習鞏固一下Xpath的用法)
為了快速、有效率的調式數據,給大家推薦一種方法:


scrapy shell http://blog.jobbole.com/114256/

這樣在cmd中就能保存我們的訪問內容,可以直接在cmd下進行調試,不用在pycharm中每調試一個數據,就運行一次,訪問一次頁面,這樣效率是非常低的。

>>> data_r = response.xpath('//p[@class="entry-meta-hide-on-mobile"]/text()')
>>> data_r.extract()
['\r\n\r\n            2018/08/08 ·  ', '\r\n            \r\n            \r\n\r\n            \r\n             ·  ', ', ', '\r\n            \r\n']
>>> data_r.extract()[0].strip()
'2018/08/08 ·'
>>> data_str = data_r.extract()[0].strip()
>>> data_str.strip()
'2018/08/08 ·'
>>> data_str.replace('·','').strip()
'2018/08/08'




>>> praise_number = response.xpath('//h10[@id="114256votetotal"]/text()')
>>> praise_number
[<Selector xpath='//h10[@id="114256votetotal"]/text()' data='1'>]
>>> praise_number = int(praise_number.extract()[0])
>>> praise_number
1



>>> collection_number = response.xpath('//span[@data-book-type="1"]/text()')
>>> collection_number
[<Selector xpath='//span[@data-book-type="1"]/text()' data=' 1 收藏'>]
>>> collection_number.extract()
[' 1 收藏']
>>> collection_word = collection_number.extract()[0]
>>> import re
>>> reg_str = '.*(\d+).*'
>>> re.findall(reg_str,collection_word)
['1']
>>> collection_number = int(re.findall(reg_str,collection_word)[0])
>>> collection_number
1





>>> comment_number = response.xpath('//span[@class="btn-bluet-bigger href-style hide-on-480"]/text()')
>>> comment_number
[<Selector xpath='//span[@class="btn-bluet-bigger href-style hide-on-480"]/text()' data='  評論'>]
>>> comment_number.extract()[0]
'  評論'


上是在cmd中的測試過程,可以看出來,我基本上都是用的都是//span[@data-book-type="1"]這種格式的Xpath,而非像FireFox瀏覽器上複製的Xpath,原因有兩點:

1.從外形來看,顯然我使用的這種Xpath要更好,至少長度上少很多(特別對於比較深的數據,如果像
`FireFox`這種,可能長度大於100也不奇怪)
2.從性能上來看,我是用的這種形式匹配更加準確,如果莫個頁面包含js加載的數據(也包含div,p,a
等標籤),如果我們直接分析`FireFox`這種Xpath,可能會出錯。

建議:
(1)決心想學好的,把本文二中的Xpath語法好好記一下,練習一下;
(2)爬取網頁抓取數據儘量用谷歌瀏覽器。

3.現在`jobbole.py`中的代碼及運行結果

代碼:


import scrapy
import re

class JobboleSpider(scrapy.Spider):
    name = 'jobbole'
    allowed_domains = ['blog.jobbole.com']
    start_urls = ['http://blog.jobbole.com/114256/']

    def parse(self, response):
        
        
        re01_seletor = response.xpath('//*[@id="post-114256"]/div[1]/h1/text()')
        re01_title = re01_seletor.extract()
        
        data_selector = response.xpath('//p[@class="entry-meta-hide-on-mobile"]/text()')
        data_str = data_selector.extract()[0].strip()
        data_time = data_str.replace('·','').strip()
        
        praise_number = int(response.xpath('//h10[@id="114256votetotal"]/text()').extract()[0])
        
        collection_str = response.xpath('//span[@data-book-type="1"]/text()').extract()[0]
        reg_str = '.*(\d+).*'
        collection_number = int(re.findall(reg_str,collection_str)[0])
        print("文章標題:"+re01_title[0])
        print("發布日期:"+data_time)
        print("點讚數:"+str(praise_number))
        print("收藏數:"+str(collection_number))

運行結果:

文章標題:Linux 內核 Git 歷史記錄中,最大最奇怪的提交信息是這樣的
發布日期:2018/08/08
點讚數:1
收藏數:2

四、後言

學完這一期,大家應該能感受到爬蟲的誘惑了哈,雖然現在我們還只是爬取的一個頁面的文章標題等基本數據,最重要的是學會如何在cmd和pycharm中啟動我們的爬蟲項目和Xpath的學習,下一期,我將帶大家使用CSS選擇器,看看那個更好用,哈哈哈!

相關焦點

  • 爬蟲之Scrapy框架的使用
    :scrapy crawl f1 或者 scrapy crawl f1 --nolog  edit          使用編輯器打開爬蟲文件 (Windows上似乎有問題,Linux上沒有問題):scrapy edit f1  fetch         Fetch a URL using the Scrapy downloader
  • MATLAB GUI實戰訓練總結
    上個星期,我在知識星球組織的MATLAB GUI實戰訓練結束了,一共12期,為期三個月,一段並不算短的小半學期。
  • 空氣呼吸器實戰化訓練
    其實,ACD訓練並沒有「標準」一說,只有一個原則,就是項目的安排和體能的消耗方式要儘可能貼合實戰。一句話:「火怎麼滅,訓練就怎麼安排」 按實戰組訓,就是用貼近實戰的訓練內容和強度讓人的身體形成一種記憶,上了火場就不會刺激身體做出應激反應從而影響空呼消耗速度。2、可參考的訓練內容讓我們來看看太平洋對面的同行分享的一套示範性ACD是怎麼編排的。
  • 倪氏推手實戰教學系列8-單步的器械訓練
    單步怎麼訓練,怎麼運用呢?這裡有沉甸甸的訓練方法,有迅猛的實戰演練,嘴上說的都不算,功夫是練出來的!
  • 合肥特警開展警務航空實戰協同訓練
    為提高合肥特警快反效率,圍繞「三實三特」實戰理念,加強警用直升機實戰應用,合肥特警開展了以警用直升機為平臺的實戰訓練,主要提高人員裝備的輸送效率
  • 怎麼看從實戰需要出發從難從嚴訓練部隊
    我們要堅持軍事訓練戰略位置、中心地位始終不動搖,突出以戰領訓、突出體系練兵、突出對抗檢驗、突出打牢基礎、突出錘鍊作風,以練兵水平的提升帶動備戰打仗能力的提高。為什麼軍事訓練要貼近實戰?以色列空軍其他部隊通過與該大隊展開實戰化訓練,很快熟悉了阿拉伯國家的空軍戰術,這為他們在之後的實戰中取得勝利奠定了堅實基礎。自此,實戰化訓練成為世界許多國家軍隊競相發展的「熱項」。現在,實戰化訓練水平的高低,往往最能反映一支軍隊的建設質量和作戰能力。「突擊隊員迅速炸開主樓北門,沿二、三層突擊,在第三層樓口發現有人在房間內活動,立即開槍擊斃1名男子,並控制房間內的2名婦女和幾個孩子。」
  • 吃透YOLO v3核心模塊,實戰訓練自己的模型
    怎樣在實戰中搭建起自己的檢測模型?在業務和面試中怎樣脫穎而出?YOLO v4的未來發展趨勢如何?等等這些問題。對以上這些問題沒有頭緒的小夥伴,推薦大家參加一下免費學習《YOLO 專題實戰訓練營》,相信可以幫助大家在這些問題上有進一步的提升。
  • 練兵先練將,實戰化訓練從領導幹部開始!
    南海艦隊某作戰支援艦支隊在港艦船全部解纜起航,奔赴某複雜海域展開晝夜不停訓練,各種戰鬥操演在海訓場上不斷「上演」,按實戰要求逐個細訓。今年開訓以來,該支隊黨委堅決貫徹統帥訓令,緊鑼密鼓地推進訓練向實戰靠攏向打贏貼近。▲編隊直升機訓練這次訓練中,該支隊領導「傾巢出動」,從動員部署會開始,主官牽頭全過程參與、全方位指導,常委分片分塊指導幫帶。
  • 香港飛虎隊簡介--實戰訓練
    香港飛虎隊的實戰訓練 希望對我們有的訓練和裝備配備等方面有啟發作用!
  • 全面加強實戰化軍事訓練 全面提高訓練水平和打贏能力
    要把握新時代新形勢新任務新要求,增強憂患意識,強化使命擔當,加快實現軍事訓練轉型升級■ 要加強戰略謀劃和頂層設計,紮實推進軍事訓練轉型。要在艱苦嚴格的訓練中、在近似實戰的環境中、在嚴峻複雜的軍事鬥爭中摔打和鍛鍊部隊,引導官兵堅定理想信念、磨礪戰鬥意志、錘鍊戰鬥作風,始終保持一不怕苦、二不怕死的頑強戰鬥精神■ 要加強黨對軍事訓練工作的領導。
  • 中榮資本2019首屆併購實戰訓練營圓滿落幕
    「2019年4月11日至12日,中榮資本2019首屆併購實戰訓練營在美麗的深圳大鵬玫瑰海岸度假村舉行
  • QBZ97-A煉獄空降實戰 全新武器經典&實戰同步上架!
    >QBZ97-A煉獄也將以全新姿態空降實戰訓練模式,那麼這次更新都有哪些新武器、新皮膚呢?BLASER-R93塗鴉實戰訓練模式展示PPSh41實戰訓練模式展示PPSh41-塗鴉實戰訓練模式展示AKS—榮光實戰訓練模式展示
  • NLP實戰篇之tf2訓練與評估
    實戰系列篇章中主要會分享,解決實際問題時的過程、遇到的問題或者使用的工具等等。如問題分解、bug排查、模型部署等等。相關代碼實現開源在:https://github.com/wellinxu/nlp_store ,更多內容關注知乎專欄(或微信公眾號):NLP雜貨鋪。
  • 打造全域作戰的兩棲勁旅 ——中國海軍陸戰隊新年度實戰化訓練
    此次參訓的數千名官兵從廣東啟程,參訓兵力及裝備採取鐵路、航空和摩託化等多維投送方式,途經7個省份,跨區機動5 900多千米至新疆沙漠戈壁,將完成實戰背景條件下的兵力集結、機動進駐、沙漠戈壁技戰術訓練、作戰編組協同,以及以沙漠戈壁地區進攻戰鬥、與陸軍某步兵師進行實兵對抗演習等多項課題演練,系海軍陸特戰部隊空中兵力投送距離最遠、時間最長、跨度最大的一次兵力行動。
  • 【關注】手榴彈實投,這才是實戰化訓練該有的標準!
    新年度開訓伊始,習主席的訓令還在耳邊迴響,同樣是在手榴彈實投場上,這個旅緊貼實戰又搞出了大「動作」。下面就請跟隨前線哥的鏡頭,一起去看看該旅手榴彈實投訓練的最新「升級版」。 春節臨近,節日氛圍漸濃,而該旅訓練場上的硝煙味更濃。
  • Python訓練營 | 數據分析實戰Kaggle鐵達尼號生還者預測
    如果你已經在入門訓練營中殺出一條血路,初步學習了python數據科學工具包,那麼這一次用一場Kaggle數據實戰,來實現全面進階叭!!學院全力籌備,用心打造,現在為大家打響寒假系列課程第一槍——進階版之數據實戰Kaggle實戰是全方位提高自己數據科學能力的最好方式,本次訓練營將會請來帥帥的Yiyu老師帶領大家挑戰經典Titanic數據集。
  • 九節鞭的實戰效果怎樣?
    但當拿它和其他冷兵器進行比較時,我們可以看出,它還是具有一定的實戰能力的。但只有使用九節鞭的人能熟練掌握九節鞭,這樣在實戰中才能真正發揮其作戰能力。如果說到實戰:一、從訓練水平上來說,這種兵器訓練周期長、對身體素質和武術水平要求高,練到如臂使指的程度,得練多少年?兩個不懂武術的人一起訓練,一個練三個月的刀,一個練三個月的鞭,效果立見。
  • 雲南武警:特戰隊員熱帶叢林實戰化訓練鍛造反恐尖兵
    近日,武警雲南總隊西雙版納支隊某訓練場上,一場實戰化對抗演練正在如火如荼地進行。成功到達事發地,等候命令隨時進攻。(左右滑動查看更多)此次訓練,堅持從難、從嚴、從實戰需要出發,以熱帶叢林、山林地、房屋反恐反暴課題為牽引,運用綜合演練的形式,主要對紅藍軍對抗、30公裡強行軍、10公裡武裝奔襲、極限體能、手/步槍快反射擊等課目進行訓練。
  • 中國陸軍特戰部隊實戰化訓練向精確作戰升級轉型
    隨著陸軍轉型建設,體制編制重塑後的特種作戰部隊實戰化訓練也在悄然發生變化——著力針對未來作戰特點規律,更加注重由體能向智能、技能轉變
  • 飛槳領航團實戰速成營,助你上手產業級實戰項目
    為了解決這些難題,本期飛槳領航團速成營將由精通圖像分割與目標檢測的PPDE(飛槳開發者技術專家)主講,帶你一周上手全流程實戰產業級項目,可將項目寫進簡歷!2天吃透理論知識:梳理圖像分割和目標檢測前置知識點,補齊項目實戰所需知識點