repo: github.com/alphardex/p…css
現在,網上的爬蟲教程可謂是氾濫成災了,從urllib開始講,最後纔講到requests和selenium這類高級庫,實際上,根本就沒必要這麼費心地去了解這麼多無謂的東西的。只需記住爬蟲總共就三大步驟:發起請求——解析數據——存儲數據,這樣就足以寫出最基本的爬蟲了。諸如像Scrapy這樣的框架,能夠說是集成了爬蟲的一切,可是新人可能會用的不怎麼順手,看教程可能還會踩各類各樣的坑,並且Scrapy自己體積也有點大。所以,本人決定親手寫一個輕量級的爬蟲框架————looter,裏面集成了調試和爬蟲模板這兩個核心功能,利用looter,你就能迅速地寫出一個高效的爬蟲。另外,本項目的函數文檔也至關完整,若是有不明白的地方能夠自行閱讀源碼(通常都是按Ctrl+左鍵或者F12)。python
$ pip install looter
複製代碼
僅支持Python3.6及以上版本。git
讓咱們先來擼一個很是簡單的圖片爬蟲:首先,用shell獲取網站github
$ looter shell https://konachan.com/post
複製代碼
而後用1行代碼將圖片的url提取出來ajax
>>> imgs = tree.css('a.directlink::attr(href)').extract()
複製代碼
或者用另外一種方式提取shell
>>> imgs = links(res, pattern=r'.*/(jpeg|image)/.*')
複製代碼
將url保存到本地json
>>> Path('konachan.txt').write_text('\n'.join(imgs))
複製代碼
能夠經過wget等下載工具將圖片下載下來api
$ wget -i konachan.txt
複製代碼
若是想要看更多的爬蟲例子,猛戳這裏bash
若是你想迅速擼出一個爬蟲,那麼你能夠用looter提供的模板來自動生成一個框架
$ looter genspider <name> [--async]
複製代碼
async是一個備用的選項,它使得生成的爬蟲核心用asyncio而非線程池。
在生成的模板中,你能夠自定義domain和tasklist這兩個變量。
什麼是tasklist?實際上它就是你想要抓取的頁面的全部連接。
以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.css('ul li')
for item in items:
data = {}
# data[...] = item.css(...)
pprint(data)
複製代碼
在大多數狀況下,你所要抓取的內容是一個列表(也就是HTML中的ul或ol標籤),能夠用css選擇器將它們保存爲items變量。
而後,你只需使用for循環來迭代它們,並抽取你想要的數據,將它們存儲到dict中。
可是,在你寫完這個爬蟲以前,最好用looter提供的shell來調試一下你的css代碼是否正確。(目前已集成ptpython,一個支持自動補全的REPL)
>>> items = tree.css('ul li')
>>> item = items[0]
>>> item.css(anything you want to crawl)
# 注意代碼的輸出是否正確!
複製代碼
調試完成後,你的爬蟲天然也就完成了。怎麼樣,是否是很簡單:)
looter爲用戶提供了一些比較實用的函數。
在爬取頁面前,你最好確認一下頁面的渲染是不是你想要的
>>> view(url)
複製代碼
獲取網頁的全部連接
>>> links(res) # 獲取全部連接
>>> links(res, search='...') # 查找指定連接
>>> links(res, pattern=r'...') # 正則查找連接
複製代碼
將所得結果保存爲數據文件,支持按鍵值排序(sort_by)和去重(no_duplicate)
>>> total = [...]
>>> save(total, sort_by='key', no_duplicate=True)
複製代碼
默認保存爲json格式,若是想保存爲csv只需把文件名後綴改成csv,但必須保證pandas這個包已經安裝好。
掌握了以上的套路,再難爬的網站也難不倒你。