scrapy筆記

scrapy源碼https://github.com/scrapy/scrapy/tree/master/scrapy

第一章、scrapy的模塊

有spiders,selector,http,linkextractors,item,loader,exceptions,pipeline等包。
其中,在scrapy的目錄下含有一些快捷的函數,如

scrapy.Spider()(繼承于spiders包),
scrapy.Selector()(繼承于selector包),,
scrapy.Item() (繼承于item包),
scrapy.Request/FormRequest(繼承于http包)。

spiders模塊

常用Rule,CrawlSpider等函數。

一般爬蟲scrapy.spiders.Spider,其他爬蟲都是繼承此爬蟲。
鏈接爬蟲scrapy.spiders.CrawlSpider,
網站爬蟲scrapy.spiders.SitemapSpider
XML源爬蟲scrapy.spiders.XMLFeedSpider
CSV源爬蟲scrapy.spiders.CSVFeedSpider

linkextractors模塊

常用LinkExtractor()函數。

http模塊

常用HtmlResponse()函數
scrapy.http.Request()
scrapy.http.FormRequest()

item模塊

常用Item(),Field()函數

loader模塊

常用ItemLoader函數

exceptions模塊

常用DropItem函數

pipeline

常用image,file包函數

第二章、選擇器 scrapy.selector.Selector(response=None, text=None, type=None)

在scrapy中使用選擇器對response進行解析。如response.xpath()。此時response已經自動被scrapy轉化成了選擇器。選擇器可以由文本或者TextResponse構造形成,如:

from scrapy.http import HtmlResponse```
文本構造

 Selector(text=body).xpath('//span/text()').extract()```
TextResponse構造
 ```response = HtmlResponse(url='http://example.com', body=body)
 Selector(response=response).xpath('//span/text()').extract()```

選擇器常用方法xpath()或者css().如sel.xpath(),sel.css()xuan.兩者都返回新的選擇器。
選擇器還有re(),extract(),re_first(),extract_first()方法,前兩個返回字符串列表,后兩個返回字符串列表的第一個字符串。

##xpath
xpath("http://div")會得到文檔所有的div節點構成的選擇器
> ```for p in divs.xpath('.//p'): # extracts all <p> inside
...     print p.extract()```

或者  
>```for p in divs.xpath('p'): #extracts all <p> inside
 print p.extract()```

xpath獲取多個標簽下的文本
> ```sel.xpath("http://div").xpath("string(.)").extract()#返回一個列表,每個元素都是一個div節點下所有的文本。```

獲取指定文本值的元素
 >```sel.xpath("http://a[contains(., 'Next Page')]").extract()
sel.xpath("http://a[text()='Next Page']").extract()```

選擇器,在選擇標簽易變的文本時記得用
>```xpath("string(.)")```

在數據項易減少的文本時,用
>```xpath("http://div[contains(text(),'word')]")```

可以利用兄弟父子節點選取。

#第三章、itempipeline
itempipeline是對spider產生的item進行處理。有清洗,驗證,檢查,儲存等功能。itempipeline含有四個方法:
>open_spider(self, spider),
close_spider(self, spider),
from_crawler(cls, crawler),
process_item(self, item, spider).

##不同的item處理
>```if isinstance(item, Aitem):
    pass
elif isinstance(item, Bitem):
    pass
else:
    pass```

##儲存到mongoDB
在settings文件里輸入
>```
MONGODB_URI = 'mongodb://localhost:27017'
MONGODB_DATABASE = 'scrapy'
DOWNLOAD_DELAY = 0.25 #用于防止被ban```

然后在pipeline文件直接用官網的代碼。只需要改動process_items函數的代碼和集合名。
>```
import pymongo
import pymongo
from scrapy.conf import settings
from scrapy.exceptions import DropItem
from myproject.items import myitem
class myPipeline(object):
    collection_name = 'scrapy_items'
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
    def close_spider(self, spider):
        self.client.close()
    def process_item(self, item, spider):
        self.db[self.collection_name].insert(dict(item))
        return item```

#第四章、圖片下載和文件下載 參考http://www.lxweimin.com/p/b5ae15cb131d
scrapy中圖片和文件下載暫時只支持存在系統目錄或者S3.
##圖片下載
在items文件中:
>```import scrapy
 class MyItem(scrapy.Item):
    image_urls = scrapy.Field() #用來存放圖片的SRC源地址
    images = scrapy.Field() #儲存下載結果,當文件下載完后,images字段將被填充為一個2元素的元組。其中第一個為布爾值,表明是否成功下載,第二個是一個字典,含有相關信息。如
(True,  {'checksum': '2b00042f7481c7b056c4b410d28f33cf',
   'path': 'full/0a79c461a4062ac383dc4fade7bc09f1384a3910.jpg',
   'url': 'http://www.example.com/files/product1.pdf'})

同理文件下載的item
在settings文件中配置:保存目錄,失效時間,縮略圖生成,過濾小圖片

IMAGES_STORE = "./圖片" #圖片儲存路徑,為當前項目目錄下的圖片文件夾
FILES_STORE = "./wenjian" #文件儲存路徑
FILES_EXPIRES = 90 #設置文件失效的時間
IMAGES_EXPIRES = 30 #設置圖片失效的時間```

IMAGES_THUMBS = {
'small': (50, 50),
'big': (270, 270),
} #設置縮略圖大小,當你使用這個特性時,圖片管道將使用下面的格式來創建各個特定尺寸的縮略圖:
<IMAGES_STORE>/thumbs/<size_name>/<image_id>.jpg

IMAGES_MIN_HEIGHT = 110 #過濾小圖片
IMAGES_MIN_WIDTH = 110 #過濾小圖片```

pipeline

經常需要在pipeline或者中間件中獲取settings的屬性,可以通過scrapy.crawler.Crawler.settings屬性或者
from scrapy.conf importsettings

@classmethod
def from_crawler(cls, crawler):
    settings = crawler.settings
    if settings['LOG_ENABLED']:
        print "log is enabled!"  ```

每個圖片item保存在不同的目錄

class MyImagesPipeline(ImagesPipeline):
spider = None

def get_media_requests(self, item, info):
    for url in item["image_urls"]:
        yield scrapy.Request(url,meta={'sch_name': item["sch_name"]})
#file_path函數重寫,對圖片保存目錄進行設置 
def file_path(self, request, response=None, info=None):
    image_guid = request.url.split('/')[-1]
    return "C:/pictures/full/%s/%s" % (request.meta['sch_name'],image_guid)
def item_completed(self, results, item, info):
        image_paths = [x['path'] for ok, x in results if ok]
        if not image_paths:
            raise DropItem("Item contains no images")            
        return item
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380

推薦閱讀更多精彩內容