之前用python寫爬蟲,都是自己用requests庫請求,beautifulsoup(pyquery、lxml等)解析。沒有用過高大上的框架。早就聽說過Scrapy,一直想研究一下。下面記錄一下我學習使用Scrapy的系列代碼及筆記。
安裝
Scrapy的安裝很簡單,官方文檔也有詳細的說明 http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/install.html 。這里不詳細說明了。
創建工程
我是用的是pycharm開發,打開pycharm,然后在下面的“Terminal”中輸入命令“scrapy startproject freebuf”。這句話是在你的工作空間中創建一個叫“freebuf”的scrapy工程。如下圖:
上圖中,因為我的工作空間中已經存在“freebuf”所以第一次創建失敗,這里我創建的名字為"freebuf2",創建成功。freebuf2的目錄及說明如下:
編寫爬蟲
freebuf2Spider.py
選中“spiders”文件夾,右鍵“NEW”->"Python File",輸入文件名“freebuf2Spider”,添加代碼。如下圖所示。
#coding:utf-8 import scrapy from freebuf2.items import Freebuf2Item import time from scrapy.crawler import CrawlerProcess class freebuf2Spider(scrapy.Spider): name ='freebuf2' allowed_domains = [] start_urls = ["http://www.freebuf.com/"] def parse(self, response): for link in response.xpath("//div[contains(@class, 'news_inner news-list')]/div/a/@href").extract(): yield scrapy.Request(link, callback=self.parse_next)#這里不好理解的朋友,先去看看yield的用法。我是按協程(就是中斷執行)理解的,感覺容易理解。 next_url = response.xpath("//div[@class='news-more']/a/@href").extract()#找到下一個鏈接,也就是翻頁。 if next_url: yield scrapy.Request(next_url[0],callback=self.parse) def parse_next(self,response): item = Freebuf2Item() item['title'] = response.xpath("//h2/text()").extract() item['url'] = response.url item['date'] = response.xpath("//div[@class='property']/span[@class='time']/text()").extract() item['tags'] = response.xpath("//span[@class='tags']/a/text()").extract() yield item
item.py
itmes對象是種簡單的容器,你可以理解為dict,保存了爬取到得數據。代碼如下:
import scrapy class Freebuf2Item(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() date = scrapy.Field() url = scrapy.Field() tags = scrapy.Field()
學做優雅的爬蟲
上面代碼已經完成了一個簡單的翻頁爬蟲,但是為了做一個優雅的爬蟲。我們還需要對其設置訪問間隔時間,在settings.py中添加“DOWNLOAD_DELAY = 3”。意思是,每3秒請求一次。
好了,大功告成。在pycharm中的“Terminal”(cmd也可以哈),切換倒freebuf2工程目錄下(就是第一個freebuf2文件夾),輸入命令“scrapy crawl freebuf2 -o freebuf2.csv”。就可以運行了。如果想停止,直接輸入“shutdown”就可以了。最后看看數據吧。
數據: