Scrapy是一個流行的網絡爬蟲框架,從如今起將陸續記錄Python3.6下Scrapy整個學習過程,方便後續補充和學習。
Python網絡爬蟲之scrapy(一)已經介紹scrapy安裝、項目建立和測試基本命令操做,本文將對item設置、提取和使用進行詳細說明
item是保存爬取到的數據的容器,其使用方式和字典相似,而且提供了額外保護機制來避免拼寫錯誤致使的未定義字段錯誤,定義類型爲scrapy.Field的類屬性來定義一個item,能夠根據本身的須要在items.py文件中編輯相應的itemcss
# -*- coding: utf-8 -*- # Define here the models for your scraped items # # See documentation in: # https://doc.scrapy.org/en/latest/topics/items.html #裝載咱們抓取數據的容器 import scrapy class ExampleItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() name = scrapy.Field() #屬性做爲Field對象 population = scrapy.Field()
首先回顧下建立的爬蟲模塊country.py,繼承scrapy.Spider,且定義了三個屬性html
name
: 用於區別 Spider。 該名字必須是惟一的,您不能夠爲不一樣的 Spider 設定相同的名字start_urls
: 包含了 Spider 在啓動時進行爬取的 url 列表parse()
是 spider 的一個方法。 被調用時,每一個初始 URL 完成下載後生成的 response對象將會做爲惟一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成 item)以及生成須要進一步處理的 URL 的 response對象。response經常使用屬性:content、text、status_code、cookiesweb
scrapy使用了一種基於xpath和css表達式機制:scrapy selector正則表達式
xpath()
: 傳入 xpath 表達式,返回該表達式所對應的全部節點的 selector list 列表css()
: 傳入 CSS 表達式,返回該表達式所對應的全部節點的 selector list 列表extract()
: 序列化該節點爲 unicode 字符串並返回 listre()
: 根據傳入的正則表達式對數據進行提取,返回 unicode 字符串 list 列表scrapy提供了shell命令對網頁數據進行抓取shell
命令格式:scrapy shell webapi
D:\Pystu\example>scrapy shell http://example.webscraping.com/places/default/view/Afghanistan-1
>>> response.xpath('//tr//td[@class="w2p_fw"]/text()').extract() ['647,500 square kilometres', '29,121,286', 'AF', 'Afghanistan', 'Kabul', '.af', 'AFN', 'Afghani', '93', 'fa-AF,ps,uz-AF,tk']
class ExampleItem(scrapy.Item): # define the fields for your item here like: name = scrapy.Field() #屬性做爲Field對象 population = scrapy.Field(serializer=str)
Field對象這麼了每一個字段的元數據(metadata),能夠爲每一個字段指明任何類型的元數據cookie
item = ExampleItem(name="Afghanistan",population="29121262") print (item)
根據item建立字典網絡
>>> dict(ExampleItem) # create a dict from all populated values {"name"="Afghanistan","population"="29121262"}
根據字典建立item框架
>>> Product({"name"="Afghanistan","population"="29121262"}) Product(name="Afghanistan",population="29121262")