Scrapy爬蟲框架教程(三)-- 調試(Debugging)Spiders
博客地址:woodenrobot.me
前言
春節放假在老家沒有網,所以最近沒有更新。這周加班閑暇抽空趕緊來更新一篇。我們在寫爬蟲的時候經常需要修改xapth規則來獲取所需的數據,而Scrapy的爬蟲通常是在命令行中啟動的,我們怎麼去調試呢?下面我就為大家介紹兩種我常用的方法。
工具和環境
- 語言:python 2.7
- IDE: Pycharm
- 瀏覽器:Chrome
- 爬蟲框架:Scrapy 1.2.1
正文
方法1
通過 scrapy.shell.inspect_response 函數來實現。以上一篇教程的爬蟲為例:
# -*- coding: utf-8 -*-n# @Time : 2017/1/7 17:04n# @Author : woodenrobotnnnfrom scrapy import Requestnfrom scrapy.spiders import Spidernfrom scrapyspider.items import DoubanMovieItemnnnclass DoubanMovieTop250Spider(Spider):n name = douban_movie_top250n headers = {n User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/n 537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safarn i/537.36,n }nn def start_requests(self):n url = https://movie.douban.com/top250n yield Request(url, headers=self.headers)nn def parse(self, response):n # 命令行調試代碼n from scrapy.shell import inspect_responsen inspect_response(response, self)n n item = DoubanMovieItem()n movies = response.xpath(//ol[@class="grid_view"]/li)n for movie in movies:n item[ranking] = movie.xpath(n .//div[@class="pic"]/em/text()).extract()[0]n item[movie_name] = movie.xpath(n .//div[@class="hd"]/a/span[1]/text()).extract()[0]n item[score] = movie.xpath(n .//div[@class="star"]/span[@class="rating_num"]/text()n ).extract()[0]n item[score_num] = movie.xpath(n .//div[@class="star"]/span/text()).re(ur(d+)人評價)[0]n yield itemnn 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, headers=self.headers)n
我們在下載完網頁源碼進行解析前可以插入上述兩句代碼,在命令行運行爬蟲出現以下效果:
此時我們就可以在命令行中使用xpath規則對response進行操作提取相應的信息:有時候下載下來的網頁結構和瀏覽器中看到的不一樣,我們可以利用view(response)將爬蟲下載到的網頁源碼在瀏覽器中打開:
在命令行輸入view(response)後默認瀏覽器會自動打開下載到的網頁源碼。雖然scrapy自己提供了這個方式讓我們調試自己的爬蟲,但是這個方式有很大的局限性。如果能利用pycharm的Debug功能進行調試就太好了。下面我就為大家介紹這麼用pycharm調試自己的爬蟲。方法2
首先在setting.py同級目錄下創建run.py文件。
寫入以下代碼:# -*- coding: utf-8 -*-n# @Time : 2017/1/1 17:51n# @Author : woodenrobotnnnfrom scrapy import cmdlinennnname = douban_movie_top250ncmd = scrapy crawl {0}.format(name)ncmdline.execute(cmd.split())n
其中name參數為spider的name。
接著在spider文件中設置斷點。結語
兩種方法適合不同的場景,不過一般情況下肯定是方法2好用。: )
推薦閱讀:
※只精通爬數據這個技能,以後能有大的發展嗎?
※scrapy的request的meta參數是什麼意思?
※爬蟲工程師的未來方向在哪?
※數據抓取,網站怎麼找到加密轉換的那段js函數?
※如何用 Python 爬取社交網路(如微博)?