當前位置:首頁 » 數據倉庫 » selenium抓取資料庫
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

selenium抓取資料庫

發布時間: 2023-02-15 11:06:21

A. python爬蟲和測試的區別

爬蟲的基本流程

發起請求

通過HTTP庫向目標站點發起請求,也就是發送一個Request,請求可以包含額外的header等信息,等待伺服器響應

獲取響應內容

如果伺服器能正常響應,會得到一個Response,Response的內容便是所要獲取的頁面內容,類型可能是HTML,Json字元串,二進制數據(圖片或者視頻)等類型

解析內容

得到的內容可能是HTML,可以用正則表達式,頁面解析庫進行解析,可能是Json,可以直接轉換為Json對象解析,可能是二進制數據,可以做保存或者進一步的處理

保存數據

保存形式多樣,可以存為文本,也可以保存到資料庫,或者保存特定格式的文件

B. Python什麼爬蟲庫好用

請求庫:
1. requests 這個庫是爬蟲最常用的一個庫
2. Selenium Selenium 是一個自動化測試工具,利用它我們可以驅動瀏覽器執行特定的動作,如點擊、下拉等操作 對於一些用JS做誼染的頁面來說,這種抓取方式是非常有效的。
3.ChomeDrive 安裝了這個庫,才能驅動Chrome瀏覽器完成相應的操作
4.GeckoDriver 使用W3C WebDriver兼容客戶端與基於Gecko的瀏覽器進行交互的代理。
5.PhantomJS PhantomJS 是一個無界面 、可腳本編程的 WebKit 瀏覽器引擎,它原生支持多種Web標准:Dom操作,css選擇器,json,Canvas以及SVG。
6.aiohttp 之前接收requests庫是一個阻塞式HTTP請求庫,當我們發送一個請求後。程序會一直等待伺服器響應,直到伺服器響應後,程序才會最下一步處理。其實,這個過程比較耗時間。如果程序可以在等待的過程中做一些其他的事情,如進行請求的調度,響應的處理等,那麼爬蟲的效率就會比之前的那種方式有很大的提升。 而aiohttp就是這樣一個提供非同步web服務的庫。使用說這個庫用起來還是相當方便的。
解析庫:
1.lxml lxml是python的一個解析庫,這個庫支持HTML和xml的解析,支持XPath的解析方式,而且效率也是非常高的,深受廣大程序員的熱愛
2.Beautiful Soup Beautiful Soup也是python里一個HTML或XMl的解析庫,它可以很方便的懂網頁中提取數據,擁有強大的API和多種解析方式。
3.pyquery 同樣是一個強大的網頁解析工具,它提供了和 jQuery 類似的語法來解析HTML 文梢,

資料庫:
1.mysql 資料庫
2.MongoDB Mo goDB 是由 ++語言編寫的非關系型資料庫, 是一個基於分布式文件存儲的開源資料庫系統內容存儲形式類似 JSON 對象,它的欄位值可以包含其他文檔、數組及文檔數組,非常靈活
3.Redis 是一個基於 存的高效的非關系型資料庫,

存儲庫:
1.PyMySOL
2.PyMongo
3.redis-py
4.RedisDump

web庫:
1.Flask 是一個輕量級的Web服務程序,它簡單,易用,靈活
2.Tornado 是一個支持非同步的Web框架,通過使用非阻塞I/O流,可以支持成千上萬的開放式連接。

C. dbcontext是注入還是傳遞好

在EntityFramework6中管理DbContext的正確方式——3環境上下文DbContext vs 顯式DbContext vs 注入DbContext(外文翻譯)
(譯者註:使用EF開發應用程序的一個難點就在於對其DbContext的生命周期管理,你的管理策略是否能很好的支持上層服務 使用獨立事務,使用嵌套事務,並行執行,非同步執行等需求? Mehdi El Gueddari對此做了深入研究和優秀的工作並且寫了一篇優秀的文章,現在我將其翻譯為中文分享給大家。由於原文太長,所以翻譯後的文章將分為四篇。你看到的這篇就是是它的第三篇。原文地址:http://mehdi.me/ambient-dbcontext-in-ef6/)

環境上下文DbContext vs 顯式DbContext vs 注入DbContext
在任何基於EF項目之初的一個關鍵決定就是你的代碼如何傳遞DbContext實例到下面真正訪問資料庫的方法裡面。

就像我們在上面看到的,創建和釋放DbContext的職責屬於頂層服務方法。數據訪問代碼,就是那些真正使用DbContext實例的代碼,可能經常在一個獨立的部分裡面——可能深入在服務實現類的一個私有方法裡面,也可能在一個查詢對象裡面或者一個獨立的倉儲層裡面。

頂層服務方法創建的DbContext實例需要找到一個傳遞到這些方法的方式。

這兒有三個想法來讓數據訪問代碼訪問DbContext:環境上下文DbContext,顯式DbContext或者注入DbContext。每一種方式都有它們各自的優缺點,讓我們來逐個分析。

顯式DbContext
它看起來是怎麼樣的

使用顯式DbContext方法,頂層服務創建一個DbContext實例然後通過一個方法的參數傳遞至數據訪問的部分。在一個傳統的包含服務層和倉儲層的三層架構中,大概看起來就是這樣:

public class UserService : IUserService
{
private readonly IUserRepository _userRepository;

public UserService(IUserRepository userRepository)
{
if (userRepository == null) throw new ArgumentNullException("userRepository");
_userRepository = userRepository;
}

public void MarkUserAsPremium(Guid userId)
{
using (var context = new MyDbContext())
{
var user = _userRepository.Get(context, userId);
user.IsPremiumUser = true;
context.SaveChanges();
}
}
}

public class UserRepository : IUserRepository
{
public User Get(MyDbContext context, Guid userId)
{
return context.Set<User>().Find(userId);
}
}
(在這個故意為之的示例裡面,倉儲層的作用當然是完全無意義的。在一個真實的應用程序中,你將期望倉儲層更加飽滿。另外,如果你真的不想讓你的服務直接依賴EF,你可以抽象你的DbContext為「IDbContext」之類的並且通過一個抽象工廠來創建它。)

優點
這種方式是到目前為止而且永遠也是最簡單的方式。它使得代碼非常簡單易懂而且易於維護——即使對於那些對代碼不是很熟悉的開發人員來說也是這樣的。

這兒沒有任何神奇的地方。DbContext實例不會憑空創建。它是在一個清晰的明顯的地方被創建——如果你好奇DbContext來源於哪兒的話你也可以通過調用棧非常容易的找到。

缺點
這種方式最主要的缺點是它要求你去污染所有你的所有倉儲方法(如果你有一個倉儲層的話),同樣你的大多服務方法也會有一個強制的DbContext參數(或者某種類型的IDbContext抽象——如果你不希望綁定到具體實現的話——但是問題仍然存在)。所以你可能會看到某些方法注入模式的應用。

你的倉儲層方法要求提供一個顯式的DbContext作為參數也不是什麼大問題。實際上,它甚至可以看著已經好事——因為他消除了潛在的歧義——就是這些查詢究竟用的哪一個DbContext。

但是對於服務層情況就大不一樣了。因為大部分你的服務方法都不會用DbContext,尤其是你將數據訪問代碼隔離在一個查詢對象或者倉儲層裡面的時候。因此,這些服務方法提供了一個DbContext參數的目的僅僅是為了將他們傳遞到下層真正需要用到DbContext的方法裡面。

這很容易變得十分醜陋。尤其是你的應用程序需要使用多個DbContext的時候,將導致你的服務方法要求兩個甚至更多的DbContext參數。這將混淆你的方法的契約——因為你的服務方法現在強制要求一個它們既不需要也不會用而僅僅是為了滿足底層方法依賴的參數。

Jon Skeet寫了一篇關於顯式DbContext vs 隱式DbContext的文章,但沒有提供一個好的解決方案。

然而,這種方法的超級簡單性還是很難被其它方法打敗的。

環境上下文DbContext
它看起來是怎麼樣的

NHibernate用戶應當是對這種方式非常熟悉——因為環境上下文模式(ambient context pattern)是在NHibernate世界裡面管理NHibernate的Session(它相當於EF的DbContext)的主要方式。NHibernate甚至對該模式有內置支持,叫做上下文session(contextual session)。

在.NET自身,這種模式也是用得相當廣泛。你可能已經用過HttpContext.Current或者TransactionScope,兩者都是依賴於環境上下文模式。

使用這種模式,頂層服務方法不僅創建用於當前業務事務的DbContext,而且還要將其注冊為環境上下文DbContext。然後數據訪問代碼就可以在需要時候獲取這個環境上下文DbContext了。再也不需要傳遞DbContext實例。

Anders Abel已經寫過一篇文章——簡單實現環境上下文DbContext——它依賴ThreadStatic變數來存儲DbContext。去看看吧——它比聽起來都還要更簡單。

優點
這種方式的優點是顯然的。你的服務和倉儲方法現在對DbContext參數已經自由了(也就是說服務和倉儲方法不需要DbContext作為參數了)——讓你的介面更加干凈並且你的方法契約更加清晰——因為它們現在只需要獲取他們真正需要使用的參數了。再也不需要遍地傳遞DbContext實例了。

缺點
無論如何這種方式引入了一定程度的魔法——它讓代碼更難理解和維護。當看到數據訪問代碼的時候,不一定容易發現環境上下文DbContext來自於哪兒。你不得不希望在調用數據訪問代碼之前某人已經將它注冊了。

如果你的應用程序使用多個DbContext派生類,比如,如果你連接多個資料庫或者如果你將領域模型劃分為幾個獨立的組,那麼對於頂層服務來說就很難知道應當創建和注冊哪些DbContext了。使用顯式DbContext,數據訪問方法要求提供它們需要的DbContext作為參數,因此就不存在歧義的可能。但是使用環境上下文方式,頂層服務方法必須知道下層數據訪問代碼需要哪種DbContext類型。我們將在後面看到一些解決這個問題的十分干凈的方式。

最後,我在上面鏈接的環境上下文DbContext例子只能在單線程模型很好的工作。如果你打算使用EF的非同步查詢功能的話,它就不能工作了。在一個非同步操作完成後,你很可能發現你自己已經在另外一個線程——不再是之前創建DbContext的線程。在許多情況下,它意味著你的環境上下文DbContext將消失。這個問題可以解決,但是它要求一些深入的理解——在.NET世界裡面如何多線程編程,TPL和非同步工作背後的原理。我們將在文章最後看到這些。

注入DbContext
它看起來是怎麼樣的
最後一種比較重要的方式,注入DbContext方式經常被各種文章和博客提及用來解決DbContext生命周期的問題。

使用這種方式,你可以讓DI容器管理DbContext的生命周期並且在任何組件(比如倉儲對象)需要的時候就注入它。

看起來就是這樣的:

public class UserService : IUserService
{
private readonly IUserRepository _userRepository;

public UserService(IUserRepository userRepository)
{
if (userRepository == null) throw new ArgumentNullException("userRepository");

_userRepository = userRepository;
}

public void MarkUserAsPremium(Guid userId)
{
var user = _userRepository.Get(context, userId);

user.IsPremiumUser = true;
}
}

public class UserRepository : IUserRepository
{
private readonly MyDbContext _context;

public UserRepository(MyDbContext context)
{
if (context == null) throw new ArgumentNullException("context");

_context = context;
}

public User Get(Guid userId)
{
return _context.Set<User>().Find(userId);
}
}
然後你需要配置你的DI容器以使用合適的生命周期策略來創建DbContext實例。你將發現一個常見的建議是對於Web應用程序使用一個PerWebRequest生命周期策略,對於桌面應用使用PerForm生命周期策略。

優點
好處與環境上下文DbContext策略相似:代碼不需要到處傳遞DbContext實例。這種方式甚至更進一步:在服務方法裡面根本看不到DbContext。服務方法完全不知道EF的存在——第一眼看起來可能很好,但很快就會發現這種策略會導致很多問題。

缺點
不管這種策略有多流行,它確切是有非常重大的缺陷和限制。在採納之前先了解它是非常重要的。

太多魔法

這種方式的第一個問題就是太依賴魔法。當需要保證你的數據——你最珍貴的資產的正確性和一致性的時候,「魔法」不是你想聽到太頻繁的一個詞。

這些DbContext實例來自於哪裡?業務事務的邊界如何定義和在哪兒定義?如果一個服務方法依賴兩個不同的倉儲類,那麼這兩個倉儲式都訪問同一個DbContext實例呢還是它們各自擁有自己的DbContext實例?

如果你是一個後端開發人員並且在開發基於EF的項目,那麼想要寫出正確代碼的話,就必須知道這些問題的答案。

答案並不明顯,它需要你詳細查看DI容器的配置代碼才能發現。就像我們前面看到的,要正確設置這些配置不是第一眼看上去那麼容易,相反,它可能是非常復雜而且容易出錯的。

不清晰的業務事務邊界

可能上面示例代碼最大的問題是:誰負責提交修改到資料庫?也就是誰調用DbContext.SaveChanges()方法?它是不清晰的。

你可以僅僅是為了調用SaveChanges()方法而將DbContext注入你的服務方法。那將是更令人費解和容易出錯的代碼。為什麼服務方法在一個既不是它創建的又不是它要使用的DbContext對象上調用SaveChanges()方法呢?它將保存什麼修改?

另外,你也可以在你的所有倉儲對象上定義一個SaveChanges()方法——它僅僅委託給底層的DbContext。然後服務方法在倉儲對象上調用SaveChanges()方法。這也將是非常具有誤導性的代碼——因為他暗示著每一個倉儲對象實現了它們自己的工作單元並且可以獨立於其它倉儲對象持久化自己的修改——這顯然不是正確的,因為他們實際上是用的都是同一個DbContext實例。

有些時候你會看到還有一種方式:讓DI容器在釋放DbContext實例之前調用SaveChanges()方法。這是一個災難的方法——值得一篇文章來描述。

簡短來說,DI容器是一種基礎設施組件——它對它管理的組件的業務邏輯一無所知。相反,DbContext.SaveChanges()方法定義了一個業務事務的邊界——也就是說它是以業務邏輯為中心的。混合兩種完全不相關的概念在一起將會引起很多問題。

話雖如此,如果你知道「倉儲層已死(Repository is Dead)」運動。誰來調用DbContext.SaveChanges()方法根本不是問題——因為你的服務方法將直接使用DbContext實例。它們因此很自然的成為調用SaveChanges()方法的地方。

當你使用注入DbContext策略的時候,不管你的應用程序的架構模式,你將還會遇到一些其它的問題。

強制你的服務變成有狀態的

一個值得注意的地方是DbContext不是一個服務。它是一個資源,一個需要釋放的資源。通過將它注入到你的數據訪問層。你將使那一層的所有上層——很可能就是整個應用程序,都變成有狀態的。

這當然不是世界末日但它卻肯定會讓DI容器的配置變得更復雜。使用無狀態的服務將提供巨大的靈活性並且使得配置它們的生命周期變得不會出錯。一旦你引入狀態化的服務,你就得認真考慮你服務的生命周期了。

注入DbContext這種方式在項目剛開始的時候很容易使用(PerWebRequest或者Transient生命周期都能很好的適應簡單的web應用),但是控制台應用程序,Window服務等讓它變得越來越復雜了。

阻止多線程

另外一個問題(相對前一個來說)將不可避免的狠咬你一口——注入DbContext將阻止你在服務中引入多線程或者某種並行執行流的機制。

請記住DbContext(就像NHibernate中的Session)不是線程安全的。如果你需要在一個服務中並行執行多個任務,你必須確保每個任務都使用它們自身的DbContext實例,否則應用程序將在運行時候崩潰。但這對於注入DbContext的方式來說是不可能的事情因為服務不能控制DbContext實例的創建。

你怎麼修復這個缺陷呢?答案是不容易。

你的第一直覺可能是將你的服務方法修改為依賴DbContext工廠而非直接依賴DbContext。這將允許它們在需要的時候創建它們自己的DbContext實例。但這樣做將會有效地推翻注入DbContext這種觀點。如果你的服務通過一個工廠創建它們自己的DbContext實例,這些實例再也不能被注入了。那將意味著服務將顯式傳遞這些DbContext實例到下層需要它們的地方(比如說倉儲層)。這樣你又回到了之前我們討論的顯式DbContext策略了。我可以想到一些解決這些問題的方法——但所有這些方法感覺起來像不尋常手段而不是干凈並且優雅的解決方案。

另外一種解決這個問題的方式就是添加更多復雜的層,引入一個像RabbitMQ 的中間件並且讓它為你分發任務。這可能行得通但也有可能行不通——完全取決於為什麼你需要引入並發性。但是在任何情況下,你可能都不需要也不想要附加的開銷和復雜性。

使用注入DbContext的方式,你最好限制你自己只使用單線程代碼或者至少是一個單一的邏輯執行流。這對於大部分應用程序都是完美的,但是在特定情況下,它將變成一個很大的限制。

相關閱讀:
使用mongodb保存爬取豆瓣電影的數據
使用scrapy爬取陽光熱線問政平台
使用scrapy爬取手機版斗魚主播的房間圖片及昵稱
使用selenium + chrome爬取中國大學Mooc網的計算機學科的所有課程鏈接
使用scrapy爬取騰訊社招,獲取所有分頁的職位名稱及chaolia、類型、人數、工作地點、發布日期超鏈接
python2使用bs4爬取騰訊社招
使用python2爬取網路貼吧指定關鍵字和分頁帖子樓主所發的圖片
提問的智慧
深刻理解系統架構師和系統分析師定義
Redis基礎數據結構與核心原理

D. Python爬蟲可以爬取什麼

Python爬蟲可以爬取的東西有很多,Python爬蟲怎麼學?簡單的分析下:

如果你仔細觀察,就不難發現,懂爬蟲、學習爬蟲的人越來越多,一方面,互聯網可以獲取的數據越來越多,另一方面,像 Python這樣的編程語言提供越來越多的優秀工具,讓爬蟲變得簡單、容易上手。

利用爬蟲我們可以獲取大量的價值數據,從而獲得感性認識中不能得到的信息,比如:

知乎:爬取優質答案,為你篩選出各話題下最優質的內容。

淘寶、京東:抓取商品、評論及銷量數據,對各種商品及用戶的消費場景進行分析。

安居客、鏈家:抓取房產買賣及租售信息,分析房價變化趨勢、做不同區域的房價分析。

拉勾網、智聯:爬取各類職位信息,分析各行業人才需求情況及薪資水平。

雪球網:抓取雪球高回報用戶的行為,對股票市場進行分析和預測。

爬蟲是入門Python最好的方式,沒有之一。Python有很多應用的方向,比如後台開發、web開發、科學計算等等,但爬蟲對於初學者而言更友好,原理簡單,幾行代碼就能實現基本的爬蟲,學習的過程更加平滑,你能體會更大的成就感。

掌握基本的爬蟲後,你再去學習Python數據分析、web開發甚至機器學習,都會更得心應手。因為這個過程中,Python基本語法、庫的使用,以及如何查找文檔你都非常熟悉了。

對於小白來說,爬蟲可能是一件非常復雜、技術門檻很高的事情。比如有人認為學爬蟲必須精通 Python,然後哼哧哼哧系統學習 Python 的每個知識點,很久之後發現仍然爬不了數據;有的人則認為先要掌握網頁的知識,遂開始 HTMLCSS,結果入了前端的坑,瘁……

但掌握正確的方法,在短時間內做到能夠爬取主流網站的數據,其實非常容易實現,但建議你從一開始就要有一個具體的目標。

在目標的驅動下,你的學習才會更加精準和高效。那些所有你認為必須的前置知識,都是可以在完成目標的過程中學到的。這里給你一條平滑的、零基礎快速入門的學習路徑。

1.學習 Python 包並實現基本的爬蟲過程

2.了解非結構化數據的存儲

3.學習scrapy,搭建工程化爬蟲

4.學習資料庫知識,應對大規模數據存儲與提取

5.掌握各種技巧,應對特殊網站的反爬措施

6.分布式爬蟲,實現大規模並發採集,提升效率

學習 Python 包並實現基本的爬蟲過程

大部分爬蟲都是按「發送請求——獲得頁面——解析頁面——抽取並儲存內容」這樣的流程來進行,這其實也是模擬了我們使用瀏覽器獲取網頁信息的過程。

Python中爬蟲相關的包很多:urllib、requests、bs4、scrapy、pyspider 等,建議從requests+Xpath 開始,requests 負責連接網站,返回網頁,Xpath 用於解析網頁,便於抽取數據。

如果你用過 BeautifulSoup,會發現 Xpath 要省事不少,一層一層檢查元素代碼的工作,全都省略了。這樣下來基本套路都差不多,一般的靜態網站根本不在話下,豆瓣、糗事網路、騰訊新聞等基本上都可以上手了。

當然如果你需要爬取非同步載入的網站,可以學習瀏覽器抓包分析真實請求或者學習Selenium來實現自動化,這樣,知乎、時光網、貓途鷹這些動態的網站也可以迎刃而解。

了解非結構化數據的存儲

爬回來的數據可以直接用文檔形式存在本地,也可以存入資料庫中。

開始數據量不大的時候,你可以直接通過 Python 的語法或 pandas 的方法將數據存為csv這樣的文件。

當然你可能發現爬回來的數據並不是干凈的,可能會有缺失、錯誤等等,你還需要對數據進行清洗,可以學習 pandas 包的基本用法來做數據的預處理,得到更干凈的數據。

學習 scrapy,搭建工程化的爬蟲

掌握前面的技術一般量級的數據和代碼基本沒有問題了,但是在遇到非常復雜的情況,可能仍然會力不從心,這個時候,強大的 scrapy 框架就非常有用了。

scrapy 是一個功能非常強大的爬蟲框架,它不僅能便捷地構建request,還有強大的 selector 能夠方便地解析 response,然而它最讓人驚喜的還是它超高的性能,讓你可以將爬蟲工程化、模塊化。

學會 scrapy,你可以自己去搭建一些爬蟲框架,你就基本具備爬蟲工程師的思維了。

學習資料庫基礎,應對大規模數據存儲

爬回來的數據量小的時候,你可以用文檔的形式來存儲,一旦數據量大了,這就有點行不通了。所以掌握一種資料庫是必須的,學習目前比較主流的 MongoDB 就OK。

MongoDB 可以方便你去存儲一些非結構化的數據,比如各種評論的文本,圖片的鏈接等等。你也可以利用PyMongo,更方便地在Python中操作MongoDB。

因為這里要用到的資料庫知識其實非常簡單,主要是數據如何入庫、如何進行提取,在需要的時候再學習就行。

掌握各種技巧,應對特殊網站的反爬措施

當然,爬蟲過程中也會經歷一些絕望啊,比如被網站封IP、比如各種奇怪的驗證碼、userAgent訪問限制、各種動態載入等等。

遇到這些反爬蟲的手段,當然還需要一些高級的技巧來應對,常規的比如訪問頻率控制、使用代理IP池、抓包、驗證碼的OCR處理等等。

往往網站在高效開發和反爬蟲之間會偏向前者,這也為爬蟲提供了空間,掌握這些應對反爬蟲的技巧,絕大部分的網站已經難不到你了.

分布式爬蟲,實現大規模並發採集

爬取基本數據已經不是問題了,你的瓶頸會集中到爬取海量數據的效率。這個時候,相信你會很自然地接觸到一個很厲害的名字:分布式爬蟲。

分布式這個東西,聽起來很恐怖,但其實就是利用多線程的原理讓多個爬蟲同時工作,需要你掌握 Scrapy + MongoDB + Redis 這三種工具。

Scrapy 前面我們說過了,用於做基本的頁面爬取,MongoDB 用於存儲爬取的數據,Redis 則用來存儲要爬取的網頁隊列,也就是任務隊列。

所以有些東西看起來很嚇人,但其實分解開來,也不過如此。當你能夠寫分布式的爬蟲的時候,那麼你可以去嘗試打造一些基本的爬蟲架構了,實現一些更加自動化的數據獲取。

你看,這一條學習路徑下來,你已然可以成為老司機了,非常的順暢。所以在一開始的時候,盡量不要系統地去啃一些東西,找一個實際的項目(開始可以從豆瓣、小豬這種簡單的入手),直接開始就好。

因為爬蟲這種技術,既不需要你系統地精通一門語言,也不需要多麼高深的資料庫技術,高效的姿勢就是從實際的項目中去學習這些零散的知識點,你能保證每次學到的都是最需要的那部分。

當然唯一麻煩的是,在具體的問題中,如何找到具體需要的那部分學習資源、如何篩選和甄別,是很多初學者面臨的一個大問題。

以上就是我的回答,希望對你有所幫助,望採納。

E. 爬蟲框架都有什麼

主流爬蟲框架通常由以下部分組成:



1.種子URL庫:URL用於定位互聯網中的各類資源,如最常見的網頁鏈接,還有常見的文件資源、流媒體資源等。種子URL庫作為網路爬蟲的入口,標識出爬蟲應該從何處開始運行,指明了數據來源。



2.數據下載器:針對不同的數據種類,需要不同的下載方式。主流爬蟲框架通暢提供多種數據下載器,用來下載不同的資源,如靜態網頁下載器、動態網頁下載器、FTP下載器等。



3.過濾器:對於已經爬取的URL,智能的爬蟲需要對其進行過濾,以提高爬蟲的整體效率。常用的過濾器有基於集合的過濾器、基於布隆過濾的過濾器等。



4.流程調度器:合理的調度爬取流程,也可以提高爬蟲的整體效率。在流程調度器中,通常提供深度優先爬取、廣度優先爬取、訂制爬取等爬取策略。同時提供單線程、多線程等多種爬取方式。

F. python的爬蟲框架有哪些

1.Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中
2.pyspider 是一個用python實現的功能強大的網路爬蟲系統,能在瀏覽器界面上進行腳本的編寫,功能的調度和爬取結果的實時查看,後端使用常用的資料庫進行爬取結果的存儲,還能定時設置任務與任務優先順序等。
3.Crawley可以高速爬取對應網站的內容,支持關系和非關系資料庫,數據可以導出為JSON、XML等
4.Beautiful Soup 是一個可以從HTML或XML文件中提取數據的Python庫.它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間。
還有很多,比如Newspaper,Grab,Cola等等
爬蟲框架學習可以看一下黑馬程序員視頻庫的學習視頻,免費學習哦!很高興能為你提供幫助

G. Python的爬蟲框架有哪些

向大家推薦十個Python爬蟲框架。

1、Scrapy:Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。它是很強大的爬蟲框架,可以滿足簡單的頁面爬取,比如可以明確獲知url pattern的情況。用這個框架可以輕松爬下來如亞馬遜商品信息之類的數據。但是對於稍微復雜一點的頁面,如weibo的頁面信息,這個框架就滿足不了需求了。它的特性有:HTML, XML源數據 選擇及提取 的內置支持;提供了一系列在spider之間共享的可復用的過濾器(即 Item Loaders),對智能處理爬取數據提供了內置支持。

2、Crawley:高速爬取對應網站的內容,支持關系和非關系資料庫,數據可以導出為JSON、XML等。

3、Portia:是一個開源可視化爬蟲工具,可讓使用者在不需要任何編程知識的情況下爬取網站!簡單地注釋自己感興趣的頁面,Portia將創建一個蜘蛛來從類似的頁面提取數據。簡單來講,它是基於scrapy內核;可視化爬取內容,不需要任何開發專業知識;動態匹配相同模板的內容。

4、newspaper:可以用來提取新聞、文章和內容分析。使用多線程,支持10多種語言等。作者從requests庫的簡潔與強大得到靈感,使用Python開發的可用於提取文章內容的程序。支持10多種語言並且所有的都是unicode編碼。

5、Python-goose:Java寫的文章提取工具。Python-goose框架可提取的信息包括:文章主體內容、文章主要圖片、文章中嵌入的任何Youtube/Vimeo視頻、元描述、元標簽。

6、Beautiful Soup:名氣大,整合了一些常用爬蟲需求。它是一個可以從HTML或XML文件中提取數據的Python庫。它能夠通過你喜歡的轉換器實現慣用的文檔導航,查找,修改文檔的方式.Beautiful Soup會幫你節省數小時甚至數天的工作時間。Beautiful Soup的缺點是不能載入JS。

7、mechanize:它的優點是可以載入JS。當然它也有缺點,比如文檔嚴重缺失。不過通過官方的example以及人肉嘗試的方法,還是勉強能用的。

8、selenium:這是一個調用瀏覽器的driver,通過這個庫你可以直接調用瀏覽器完成某些操作,比如輸入驗證碼。Selenium是自動化測試工具,它支持各種瀏覽器,包括 Chrome,Safari,Firefox等主流界面式瀏覽器,如果在這些瀏覽器裡面安裝一個 Selenium 的插件,可以方便地實現Web界面的測試. Selenium支持瀏覽器驅動。Selenium支持多種語言開發,比如 Java,C,Ruby等等,PhantomJS 用來渲染解析JS,Selenium 用來驅動以及與Python的對接,Python進行後期的處理。

9、cola:是一個分布式的爬蟲框架,對於用戶來說,只需編寫幾個特定的函數,而無需關注分布式運行的細節。任務會自動分配到多台機器上,整個過程對用戶是透明的。項目整體設計有點糟,模塊間耦合度較高。

10、PySpider:一個國人編寫的強大的網路爬蟲系統並帶有強大的WebUI。採用Python語言編寫,分布式架構,支持多種資料庫後端,強大的WebUI支持腳本編輯器,任務監視器,項目管理器以及結果查看器。Python腳本控制,可以用任何你喜歡的html解析包。

以上就是分享的Python爬蟲一般用的十大主流框架。這些框架的優缺點都不同,大家在使用的時候,可以根據具體場景選擇合適的框架。