scrapy基本使用(二)
參考鏈接: http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html#id5
scrapy基本使用(一) http://www.cnblogs.com/zhaijiahui/p/6973858.html
了解一些基礎,接下來我們該從源碼裏,扒出你想要的東西了。
這裏就要用到一個叫選擇器(Selectors)的東西了。
首先思考幾個問題:
1)選擇器的作用是什麽?
從網頁源碼中提取出想要的數據。我理解python中的re,BeautifulSoup作用類似。
2)選擇器如何工作?
用的是XPath,在xml和html上的節點語言,什麽是節點語言?我理解這裏就是在匹配一個個標簽<div>,<a>,<span>等等,這樣匹配的效率更高更準確。
下面是如何使用選擇器
3)如何使用選擇器?
3.1 官方的使用方法
from scrapy.selector import Selector
這樣只需要調用Selector(response)就等價於scrapy.selector.Selector(response)
3.2 如何使用XPath來匹配內容呢?
舉個例子:
body = ‘<html><body><span>good</span></body></html>‘ Selector(text=body).xpath(‘//span/text()‘).extract()
註意到我們要找的內容在<span>標簽裏面,可以用//span/來定位,而我們要獲取標簽裏面包裹的內容,用text()來獲取。
而前面.xpath() 及 .css() 方法返回的是一個類 SelectorList 的實例, 它是一個新選擇器的列表。需要調用extract()最後成功獲取good。
response.xpath(‘//title/text()‘).extract() 等價於 response.css(‘title::text‘).extract()
當源碼是這種情況的時候,
<a href=‘image3.html‘>Name: My image 3 <br /><img src=‘image3_thumb.jpg‘ /></a>
xpath用法:
>>> response.xpath(‘//a[contains(@href, "image")][email protected]‘).extract() [u‘image1.html‘, u‘image2.html‘, u‘image3.html‘, u‘image4.html‘, u‘image5.html‘]
contains代表href裏面包含”image”的內容,[email protected]
css用法:
>>> response.css(‘a[href*=image]::attr(href)‘).extract() [u‘image1.html‘, u‘image2.html‘, u‘image3.html‘, u‘image4.html‘, u‘image5.html‘]
當我們像這樣把數據都挑出來以後
def parse(self, response): for sel in response.xpath(‘//ul/li‘): item = DmozItem() item[‘title‘] = sel.xpath(‘a/text()‘).extract() item[‘link‘] = sel.xpath(‘[email protected]‘).extract() item[‘desc‘] = sel.xpath(‘text()‘).extract() yield item
最後獲取數據需要用 yield
yield是一個生成器,他可以記錄調用之前的數據信息(各個參數的值),和位置信息(在框架中跳轉以後依然能回來執行),而上次調用的所有局部變量都保持不變。
可以參考:Python yield 用法 http://www.pythonclub.org/python-basic/yield
保存爬取到的數據
scrapy crawl dmoz -o items.json
該命令將采用 JSON 格式對爬取的數據進行序列化,生成 items.json 文件。
在類似本篇教程裏這樣小規模的項目中,這種存儲方式已經足夠。 如果需要對爬取到的item做更多更為復雜的操作,您可以編寫 Item Pipeline 。
scrapy基本使用(二)