從頁面中提取資料的核心技術是http文字解析,在python中常用的模組處理:
beautifulsoup 非常流行的解析庫,api簡單,但解析的速度慢。
lxml 是一套使用c語言編寫的xml解析庫,解析速度快,api相對比較複雜。
scrapy中的selector類是基於lxml庫建立的,並且簡化了api介面。在使用的過程中先使用xpath或者css選擇器選中頁面中要提取的資料,然後進行提取。
提取資料
呼叫selector或者selectlist物件的以下幾種方法可將選中的內容進行提取
extract()返回選中內容的unicode字串。
extract_first()selectorlist專有,返回其中第乙個selector物件呼叫extract方法。通常selectorlist中只含有乙個selector物件的時候選擇呼叫該方法。
re()使用正規表示式來提取選中內容中的某部分。
舉個例子
selector.xpath('.//b/text()') .extract #[『**:99.00元』,『**:88.00元』,『**:88.00元』]
selector.xpath('.//b/text()').re('\d+\.\d+') #[ '99.00','88.00','88.00']
re_first()返回selectorlist物件中的第乙個selector物件呼叫re方法。
selector.xpath('.//b/text()').re_first('\d+\.\d+') # '99.00'
實際的開發過程中,幾乎不需要手動建立selector物件,,response物件以自身引數自動建立selector物件
response.xpath('.//h1/text').extract() # [ 'song','shi','chao']
response.css('li::text').extract() # [ 'song','shi','chao']
xpath選擇器
xpath即xml路徑語言,用來確定xml文件中某個部分的語言,xml文件(html屬於xml)是一系列節點構成的樹。
基礎語法
/選中文件的根 描述乙個從根開始的絕對路徑./表示從當前節點擊取 (比如提取了一部分,還需要從提取出來裡面進行提取就會使用,如果不加.會從整個文件中開始提取)
.選中當前節點 用來描述相對路徑
..選中當前節點的父節點 用來描述相對路徑
element選中子節點中所有的element元素節點
//element選中子孫節點中所有的element元素節點
*選中所有元素子節點
text()選中所有文字子節點
@attr選中名為attr的屬性節點
@*選中所有的屬性節點
[謂語]謂語用來查詢某個特定的節點或者包含某個特定值的節點
舉例response.xpath('/html/body/div') #選取body下的所有div
response.xpath('//a') #選中文件所有a
response.xpath('/html/body//div') #選中body下的所有節點中的div,無論在什麼位置
response.xpath('//a/text()') #選取所有a的文字
response.xpath('/html/div/*') #選取div的所有元素子節點
response.xpath('//div/*/img') #選取div孫節點的所有img
response.xpath('//img/@src') #選取所有img的src屬性
response.xpath('//a[1]/img/@*') #選取第乙個a下img的所有屬性
response.xpath('//a[2]') #所有a中的第2個
response.xpath('//a[last()]') #所有a中的最後乙個 ('/a[last()-1]')#倒第二個 ('//a[position()<=3]')#使用position函式選中前三個 ('//div[@id]')#選中所有含有id屬性的div ('//div[@id="song"]')#選中所有id屬性為song的div
response.xpath('//p[contains(@class,'song')]') #選擇class屬性中含有『song』的p元素
response.xpath('//div/a | //div/p') 或者,頁面中可能是a可能是p
css選擇器
css即層疊樣式表,選擇器不如xpath強大,原理就是選擇的時候翻譯成xpath表示式在呼叫xpath方法。
*選擇所有節點
#container選擇id為container的節點
.container選擇class包含container的節點
li a選擇 所有 li 下的所有 a 節點
ul + p選擇所有ul後面的第乙個p元素
#container > ul選擇id為container的第乙個ul節點
a[class]選取所有有class屬性的a元素
a[href=""]含有href=""的a元素
a[href*='job']包含job的a元素
a[href^='https']開頭是https的a元素
a[href$='cn']結尾是cn的a元素
response.css('div a::text').extract() 所有div下所有a的文字
response.css('div a::attr(href)').extract() href的值
response.css('div>a:nth-child(1)') 選中每個div的第乙個a > 會設定只在子節點中找,不會到孫節點中
response.css('div:not(#container)') 選取所有id不是container的div
response.css('div:first-child>a:last-child') 第乙個div中最後乙個a
scrapy爬蟲框架(一) scrapy框架簡介
開啟命令列輸入如下命令 pip install scrapy安裝完成後,python會自動將 scrapy命令新增到環境變數中去,這時我們就可以使用 scrapy命令來建立我們的第乙個 scrapy專案了。開啟命令列,輸入如下命令 scrapy startproject yourproject這裡的...
scrapy爬蟲框架
作者經過幾周的python爬蟲實踐之後,深入學習了一下scrapy這個爬蟲框架,現將一些基本知識和 總結整理一下,以備後查。2.scrapy的命令列使用 這部分網上很多部落格都有總結,不需要背,理解會用主要的命令 startproject crawl fetch list genspider.即可,...
scrapy 爬蟲框架
1.安裝 公升級pip版本 pip install upgrade pip 通過pip安裝scrapy框架 pip install scrapy 安裝成功 只執行scrapy 進行測試是否安裝成功 2.scrapy startproject 爬蟲專案名稱 執行此命令,可以生成乙個爬蟲專案 會預先生成...