looter——超輕量級爬蟲框架

現在,網上的爬蟲教程可謂是氾濫成災了,從urllib開始講,最後纔講到requests和selenium這類高級庫,實際上,根本就沒必要這麼費心地去了解這麼多無謂的東西的。只需記住爬蟲總共就三大步驟:發起請求——解析數據——存儲數據,這樣就足以寫出最基本的爬蟲了。諸如像Scrapy這樣的框架,能夠說是集成了爬蟲的一切,可是新人可能會用的不怎麼順手,看教程可能還會踩各類各樣的坑,並且Scrapy自己體積也有點大。所以,本人決定親手寫一個輕量級的爬蟲框架————looter,裏面集成了調試和爬蟲模板這兩個核心功能,利用looter,你就能迅速地寫出一個高效的爬蟲。另外,本項目的函數文檔也至關完整,若是有不明白的地方能夠自行閱讀源碼(通常都是按Ctrl+左鍵或者F12)。css

安裝

$ pip install looter

僅支持Python3.6及以上版本。python

快速開始

讓咱們先來擼一個很是簡單的圖片爬蟲:首先,用shell獲取網站git

$ looter shell konachan.com/post

而後用2行代碼就能夠將圖片抓取到本地github

>>> imgs = tree.cssselect('a.directlink')
>>> save_imgs(imgs)

或者只用1行也行:dweb

>>> save_imgs(links(res, search='jpg'))

工做流

若是你想迅速擼出一個爬蟲,那麼你能夠用looter提供的模板來自動生成一個正則表達式

$ looter genspider <name> <tmpl> [--async]

在這行代碼中,tmpl是模板,分爲data和image兩種模板。shell

async是一個備用的選項,它使得生成的爬蟲核心用asyncio而非線程池。json

在生成的模板中,你能夠自定義domain和tasklist這兩個變量。api

什麼是tasklist?實際上它就是你想要抓取的頁面的全部連接。bash

以konachan.com爲例,你可使用列表推導式來建立本身的tasklist:

domain = 'https://konachan.com'
tasklist = [f'{domain}/post?page={i}' for i in range(1, 9777)]

而後你就要定製你的crawl函數,這是爬蟲的核心部分。

def crawl(url):
    tree = lt.fetch(url)
    items = tree.cssselect('ul li')
    for item in items:
        data = dict()
        # data[...] = item.cssselect(...)
        pprint(data)

在大多數狀況下,你所要抓取的內容是一個列表(也就是HTML中的ul或ol標籤),能夠用css選擇器將它們保存爲items變量。

而後,你只需使用for循環來迭代它們,並抽取你想要的數據,將它們存儲到dict中。

可是,在你寫完這個爬蟲以前,最好用looter提供的shell來調試一下你的cssselect代碼是否正確。

>>> items = tree.cssselect('ul li')
>>> item = items[0]
>>> item.cssselect(anything you want to crawl)
# 注意代碼的輸出是否正確!

調試完成後,你的爬蟲天然也就完成了。怎麼樣,是否是很簡單:)

固然,本人也編寫了好幾個爬蟲例子,可供參考。

函數

looter爲用戶提供了不少實用的函數。

view

在爬取頁面前,你最好確認一下頁面的渲染是不是你想要的

>>> view(url)

save_imgs

當你獲取了一堆圖片連接時,用它能夠直接將它們保存到本地

>>> img_urls = [...]
>>> save_imgs(img_urls)

alexa_rank

能夠獲取網站的reach和popularity指數(人氣度),此函數返回一個元組(url, reach_rank, popularity_rank)

>>> alexa_rank(url)

links

獲取網頁的全部連接

>>> links(res)                  # 獲取全部連接
>>> links(res, absolute=True)   # 獲取絕對連接
>>> links(res, search='text')   # 查找指定連接

一樣地,你也能夠用正則表達式來獲取匹配的連接

>>> re_links(res, r'regex_pattern')

save_as_json

將所得結果保存爲json文件,支持按鍵值排序

>>> total = [...]
>>> save_as_json(total, name='text', sort_by='key')

parse_robots

用於爬取網站robots.txt上的全部連接。這個在作全站爬蟲或者遞歸式url爬蟲時頗爲有效

>>> parse_robots(url)

login

有一些網站必需要先登陸才能爬取,因而就有了login函數,本質其實就是創建session會話向服務器發送帶有data的POST請求。
可是,每一個網站的登陸規則都各不相同,想要找到合適的postdata仍是要費一番功夫的,並且更有甚者還要你構造param或header參數。
不過幸運的是在github上已經有人整理好了各大網站的模擬登陸方法——fuck-login,本人非常佩服。
總之考驗各位抓包的能力了,如下爲模擬登陸網易126郵箱(要求參數:postdata和param)

>>> params = {'df': 'mail126_letter', 'from': 'web', 'funcid': 'loginone', 'iframe': '1', 'language': '-1', 'passtype': '1', 'product': 'mail126',
 'verifycookie': '-1', 'net': 'failed', 'style': '-1', 'race': '-2_-2_-2_db', 'uid': 'webscraping123@126.com', 'hid': '10010102'}
>>> postdata = {'username': 你的用戶名, 'savelogin': '1', 'url2': 'http://mail.126.com/errorpage/error126.htm', 'password': 你的密碼}
>>> url = "https://mail.126.com/entry/cgi/ntesdoor?"
>>> res, ses = login(url, postdata, params=params) # res爲post請求後的頁面,ses爲請求會話
>>> index_url = re.findall(r'href = "(.*?)"', res.text)[0] # 在res中獲取重定向主頁的連接
>>> index = ses.get(index_url) # 用ses會話訪問重定向連接,想確認成功的話print下便可
相關文章
相關標籤/搜索