超輕量級爬蟲(chóng)框架:looter
優(yōu)采云 發(fā)布時(shí)間: 2022-06-14 14:45超輕量級爬蟲(chóng)框架:looter
?
作者:半載流殤,Pythonistia && Otaku,努力轉行中的一位測繪人員です
主頁(yè):/people/ban-zai-liu-shang
爬蟲(chóng)總共就三大步驟:發(fā)起請求——解析數據——存儲數據,這樣就足以寫(xiě)出最基本的爬蟲(chóng)了。諸如像Scrapy這樣的框架,可以說(shuō)是集成了爬蟲(chóng)的一切,但是新人可能會(huì )用的不怎么順手,看教程可能還會(huì )踩各種各樣的坑,而且Scrapy本身體積也有點(diǎn)大。因此,本人決定親手寫(xiě)一個(gè)輕量級的爬蟲(chóng)框架——looter,里面集成了調試和爬蟲(chóng)模板這兩個(gè)核心功能,利用looter,你就能迅速地寫(xiě)出一個(gè)高效的爬蟲(chóng)。另外,本項目的函數文檔也相當完整,如果有不明白的地方可以自行閱讀源碼。
安裝
<p>$ pip install looter</p>
僅支持Python3.6及以上版本。
快速開(kāi)始
讓我們先來(lái)擼一個(gè)非常簡(jiǎn)單的圖片爬蟲(chóng):首先,用shell獲取網(wǎng)站
<p>$ looter shell konachan.com/post</p>
然后用2行代碼就可以將圖片抓取到本地
<p>>>> imgs = tree.cssselect('a.directlink')
>>> save_imgs(imgs)</p>
或者只用1行也行:d
<p>>>> save_imgs(links(res, search='jpg'))</p>
工作流
如果你想迅速擼出一個(gè)爬蟲(chóng),那么你可以用looter提供的模板來(lái)自動(dòng)生成一個(gè)
<p>$ looter genspider [--async]</p>
在這行代碼中,tmpl是模板,分為data和image兩種模板。
async是一個(gè)備用的選項,它使得生成的爬蟲(chóng)核心用asyncio而非線(xiàn)程池。
在生成的模板中,你可以自定義domain和tasklist這兩個(gè)變量。
什么是tasklist?實(shí)際上它就是你想要抓取的頁(yè)面的所有鏈接。
以為例,你可以使用列表推導式來(lái)創(chuàng )建自己的tasklist:
<p>domain = 'https://konachan.com'
tasklist = [f'{domain}/post?page={i}' for i in range(1, 9777)]</p>
然后你就要定制你的crawl函數,這是爬蟲(chóng)的核心部分。
<p>def crawl(url):
? ?tree = lt.fetch(url)
? ?items = tree.cssselect('ul li')
? ?for item in items:
? ? ? ?data = dict()
? ? ? ?# data[...] = item.cssselect(...)
? ? ? ?pprint(data)</p>
在大多數情況下,你所要抓取的內容是一個(gè)列表(也就是HTML中的ul或ol標簽),可以用css選擇器將它們保存為items變量。
然后,你只需使用for循環(huán)來(lái)迭代它們,并抽取你想要的數據,將它們存儲到dict中。
但是,在你寫(xiě)完這個(gè)爬蟲(chóng)之前,最好用looter提供的shell來(lái)調試一下你的cssselect代碼是否正確。
<p>>>> items = tree.cssselect('ul li')
>>> item = items[0]
>>> item.cssselect(anything you want to crawl)
# 注意代碼的輸出是否正確!</p>
調試完成后,你的爬蟲(chóng)自然也就完成了。怎么樣,是不是很簡(jiǎn)單:)
當然,本人也編寫(xiě)了好幾個(gè)爬蟲(chóng)例子,可供參考。
函數
looter為用戶(hù)提供了很多實(shí)用的函數。
view
在爬取頁(yè)面前,你最好確認一下頁(yè)面的渲染是否是你想要的
<p>>>> view(url)</p>
save_imgs
當你獲取了一堆圖片鏈接時(shí),用它可以直接將它們保存到本地
<p>>>> img_urls = [...]
>>> save_imgs(img_urls)</p>
alexa_rank
可以獲取網(wǎng)站的reach和popularity指數(人氣度),此函數返回一個(gè)元組(url, reachrank, popularityrank)
<p>>>> alexa_rank(url)</p>
links
獲取網(wǎng)頁(yè)的所有鏈接
<p>>>> links(res) ? ? ? ? ? ? ? ? ?# 獲取所有鏈接
>>> links(res, absolute=True) ? # 獲取絕對鏈接
>>> links(res, search='text') ? # 查找指定鏈接</p>
同樣地,你也可以用正則表達式來(lái)獲取匹配的鏈接
<p>>>> re_links(res, r'regex_pattern')</p>
saveasjson
將所得結果保存為json文件,支持按鍵值排序
<p>>>> total = [...]
>>> save_as_json(total, name='text', sort_by='key')</p>
parse_robots
用于爬取網(wǎng)站robots.txt上的所有鏈接。這個(gè)在做全站爬蟲(chóng)或者遞歸式url爬蟲(chóng)時(shí)頗為有效
<p>>>> parse_robots(url)</p>
login
有一些網(wǎng)站必須要先登錄才能爬取,于是就有了login函數,本質(zhì)其實(shí)就是建立session會(huì )話(huà)向服務(wù)器發(fā)送帶有data的POST請求。 但是,每個(gè)網(wǎng)站的登錄規則都各不相同,想要找到合適的postdata還是要費一番功夫的,而且更有甚者還要你構造param或header參數。 不過(guò)幸運的是在github上已經(jīng)有人整理好了各大網(wǎng)站的模擬登錄方法——fuck-login,本人很是佩服。 總之考驗各位抓包的能力了,以下為模擬登錄網(wǎng)易126郵箱(要求參數:postdata和param)
<p>>>> 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': 你的用戶(hù)名, '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請求后的頁(yè)面,ses為請求會(huì )話(huà)
>>> index_url = re.findall(r'href = "(.*?)"', res.text)[0] # 在res中獲取重定向主頁(yè)的鏈接
>>> index = ses.get(index_url) # 用ses會(huì )話(huà)訪(fǎng)問(wèn)重定向鏈接,想確認成功的話(huà)print下即可</p>
Python網(wǎng)絡(luò )爬蟲(chóng)學(xué)習系列課程共9節,提供課件和所有小節課程源代碼。課程由《從零開(kāi)始學(xué)Python網(wǎng)絡(luò )爬蟲(chóng)》圖書(shū)作者、簡(jiǎn)書(shū)知名博主、Python網(wǎng)絡(luò )爬蟲(chóng)專(zhuān)家羅攀負責主講。
第1講:Python零基礎語(yǔ)法入門(mén)
環(huán)境安裝
變量與字符串
流程控制
數據結構
文件操作
第2講:正則表達式爬蟲(chóng)
網(wǎng)絡(luò )連接
爬蟲(chóng)原理
Chrome瀏覽器安裝和使用
Request庫使用
正則表達式
csv文件存儲
第3講:Lxml庫與xpath語(yǔ)法
Excel存儲
lxml庫
Xpath語(yǔ)法
第4講:API爬蟲(chóng)
API概念
百度地圖API調用
JSON數據解析
圖片爬蟲(chóng)
第5講:異步加載
MySQL數據庫安裝
MySQL數據庫簡(jiǎn)單使用
Python操作數據庫
異步加載
逆向工程
綜合案例
第6講:表單交互與模擬登陸
post請求
逆向工程
提交cookie
綜合案例
第7講:Selenium模擬瀏覽器
Selenium
PhantomJS
異步加載處理
網(wǎng)頁(yè)操作處理
綜合案例
第8講:Scrapy入門(mén)
Scrapy安裝
創(chuàng )建項目
各組件介紹
綜合案例
第9講:Scrapy精進(jìn)
跨頁(yè)面爬蟲(chóng)
存儲數據庫