Scrapy中xpath如何提取細節標籤

代碼參考文章Scrapy爬蟲框架教程(二)-- 爬取豆瓣電影TOP250

學習《R語言實戰》時打算選一數據練手,也當復慣用scrapy爬靜態網頁,本以為很快會出來,結果......

感謝超級膩害的私服 @木製robot 幫助解惑??(^?^)現在記下這些坑,方便以後查閱

環境配置:

________________________

windows7

pycharm

scrapy shell 調試工具

________________________

終級大問題:xpath如何提取細節標籤

具體如下圖:

分解小問題:

  1. 如何進行xpath元素分割?split()、strip()傻傻分不清楚
  2. 爬取的「903258人評價」,如何刪除「人評價」只留數字?
  3. 在爬取下一頁時,【urljoin】和【第一頁+ next_url[0]】用哪個?分別怎麼用?

問題一的解決過程——提取關鍵欄位

以下為scrapy shell一步一步的調試

  • 首先查看xpath最初爬到的一行

  • 第一步添加extract和extract_first()比較,可以看出加了first就只選擇了前半部分(導演那塊,後半部分的時間呀美國呀都沒見著),extract_first()只選取了第一半部分(導演之類的),那麼如何選取第二半部分呢(時間、國家等)?默認是[1],可以直接在text()加一個[2],就可以取後半段了,同理三四五段都可以如此。

  • 下圖也顯示了,extract()和extarct_first()比較,暫沒有發現很大區別

  • 第二步添加split()後的慢慢變化,發現它可以分割(ps:會默認按照標籤中有規律的那塊分割,比如下圖是按照xa0分割)

  • 第三步添加strip()之後

  • split()與strip()區別:這兩個我之前總搞不清楚,於是分別調試了一下,大概理解如下:split()主要適用在,分割元素,並形成列表,方便後續用[0]、[1]對列表每個部分進行提取,strip()主要作用是把前面雜七雜八,後面雜七雜八全部刪除,只留下中間聚集的那部分

  • split為分割功能,同時生成一個列表,被分割的那個元素作為分界線不出現在列表裡

  • strip功能是去掉些有的沒的,主要是前面一大塊,後面一大塊,所以strip最好用在最後一步

  • 有點懵,總的流程總一遍,最終呈現效果

問題二解決過程——re函數刪除字元串

不希望最後導出來的數有「人評價」三個字,需要用re函數刪除,同時也生成了列表,也不需要用extract()啥的,多方便~

問題三解決過程——提取下一頁鏈接的兩種辦法

第一種觀察頁面鏈接地址末尾數變化,構建頁面鏈接

next_url = response.xpath(//span[@class="next"]/a/@href).extract()n if next_url:n next_url = https://movie.douban.com/top250 + next_url[0]n yield Request(next_url)nn#如果添加了代理伺服器,需要在最後一行的括弧里填上headersn

第二種辦法用urljoin

next_page = response.xpath(//span[@class="next"]/a/@href).extract()n if next_page:n url = response.urljoin(next_page[0].extract())n yield Request(url)n#如果添加了代理伺服器,需要在最後一行的括弧里填上headersn

圖片來源網路,不知道之前截圖截的哪裡的了

scrapy豆瓣爬取完整代碼請看Scrapy爬蟲框架教程(二)-- 爬取豆瓣電影TOP250

本次主要記錄問題和解決辦法,確實自己基礎很不紮實,,,折騰了很久才明白,語法什麼的還是得補補,但是好開心爬出來啦~完結撒花~o(*≧▽≦)ツ


推薦閱讀:

第十一章 Scrapy入門程序點評
你懂Scrapy嗎?Scrapy大型爬蟲框架講解【一】
【記錄】Scrapy模擬登錄cookie失效問題
如何用scrapy爬取搜房網上小區的坐標值?
基於Scrapy如何寫一個爬蟲抓取藝龍、攜程等網站的機票價格進行分析並做機票價格預測?

TAG:python爬虫 | scrapy |