爬虫 页面元素变化_爬虫 基本知识 萌新
爬蟲
定義
網(wǎng)絡(luò)爬蟲(又稱為網(wǎng)頁蜘蛛,網(wǎng)絡(luò)機(jī)器人,在FOAF社區(qū)中間,更經(jīng)常的稱為網(wǎng)頁追逐者),是一種按照一定的規(guī)則,自動地抓取萬維網(wǎng)信息的程序或者腳本。另外一些不常使用的名字還有螞蟻、自動索引、模擬程序或者蠕蟲。個人理解就是,從互聯(lián)網(wǎng)上獲取數(shù)據(jù),進(jìn)行自動化,規(guī)范化,也就是說,取代人去做繁重的數(shù)據(jù)采集。再者使用selenium等,可以模擬瀏覽器,寫交互性的自動化腳本,本質(zhì)都是解放人力
本質(zhì)
```文本 本質(zhì)上,爬蟲就是獲取網(wǎng)頁,然后解析網(wǎng)頁,最后得到開發(fā)者想要的數(shù)據(jù)。 這么說是不夠正確的,或者說,只是爬蟲常用的一部分,是對爬蟲的一種淺顯的理解,實(shí)際上,我感覺爬蟲就像是模擬瀏覽器,但是卻通過個人的分析,選擇需要加載的去加載,獲取想要獲取的。
## 關(guān)鍵點(diǎn) 主要就是兩個部分,一個就是定位數(shù)據(jù)(定位節(jié)點(diǎn)),另外一個就是從節(jié)點(diǎn)獲取數(shù)據(jù),或者模擬操作。關(guān)于對節(jié)點(diǎn)的定位,一種就是普通的通過特殊屬性值等來篩選,另外一種就是通過父子節(jié)點(diǎn),兄弟等關(guān)系進(jìn)行推到,因為前端設(shè)計的時侯一般是分為幾個部分去做的,而且渲染也是在特定的地方進(jìn)行渲染,所以父子節(jié)點(diǎn)的關(guān)系,能夠良好的對列表進(jìn)行分析。## 工具 我個人是常用**python**寫爬蟲的類型,因為它有很多強(qiáng)大的庫,而且性能也很不錯。例如使用requests庫,非常簡單,方便,且強(qiáng)大。然后想要批量,高效率的進(jìn)行爬蟲,可以使用**Scrapy** 去進(jìn)行項目式的開發(fā),個人感覺是沒有明確的界限,當(dāng)你需要什么就用什么,不要局限于框架。 其次,**java**上的開發(fā)就沒有那么方便,可能是因為我對java爬蟲知之甚少吧。(常用jousp以及正則去進(jìn)行html解析)## 關(guān)于pythonn爬蟲 通過**requests**等庫去獲取網(wǎng)頁,然后解析網(wǎng)頁。 ```解析的常用方法通過兩類 1,是通過id,class,以及其他屬性去進(jìn)行鎖定標(biāo)簽。然后提取數(shù)據(jù)。 2,是通過正則表達(dá)式去進(jìn)行字符串匹配 個人感覺第一種簡單,方便。但是第二種同樣不可獲缺,是必須要進(jìn)行學(xué)習(xí)的東西,否則爬蟲在某些情況可能回降低寫程序的思路。Scrapy爬蟲框架
這個框架的最大優(yōu)勢就是非常的高效率,適用于對于一個網(wǎng)站的各個階級的頁面的爬蟲。這些頁面之間通常能夠形成鏈?zhǔn)降年P(guān)系。或者同層的關(guān)系 Scrapy多線程并發(fā),效率極高。關(guān)于反爬蟲
對于部分網(wǎng)站是可以直接解析進(jìn)行爬蟲的,但是并不是全部,有些網(wǎng)站針對這種情況進(jìn)行了防范 - 常見的防范辦法是判斷header請求頭,IP,以及一些根據(jù)反映速度等等鬼才點(diǎn)子進(jìn)行反爬蟲。
所以要寫一個好爬蟲,就需要偽造,學(xué)會偽裝自己,寫好請求頭,IP,以及控制反應(yīng)速度等等。具體代碼,可以自行百度關(guān)于Selenium
這可以說是一個終極武器, 簡單的來說,就是真正的去打開一個模擬器,然后加載網(wǎng)頁,獲取網(wǎng)頁數(shù)據(jù),
有好處也有壞處 好處是可以獲取到更加全面的資源,跳過繁重的api接口分析。直接獲取加載的數(shù)據(jù)。 壞處是不加以選擇的加載數(shù)據(jù),效率極低。綜上,雖然有缺點(diǎn),但是還是挺有用的,至少能夠進(jìn)行方便的瀏覽器點(diǎn)擊,輸入等模擬操作,在進(jìn)行操作自動化的時侯用處很大。
實(shí)現(xiàn)方法是次要的,重要的是思維方式,上層決定下層的運(yùn)作
Seleniumd 的使用技巧
這里強(qiáng)推chrome加上selenium,效率杠杠的
首先解釋一下,python是一門解釋性語言
解釋性語言定義:程序不需要編譯,在運(yùn)行程序的時候才翻譯,每個語句都是執(zhí)行的時候才翻譯。這樣解釋性語言每執(zhí)行一次就需要逐行翻譯一次,效率比較低。現(xiàn)代解釋性語言通常把源程序編譯成中間代碼,然后用解釋器把中間代碼一條條翻譯成目標(biāo)機(jī)器代碼,一條條執(zhí)行。因為selenium的創(chuàng)建時十分耗時的,所以這并不方便于我們開發(fā)調(diào)試,比如點(diǎn)擊某個按鍵等等。 綜上,我們使用console進(jìn)行開發(fā)測試:
這樣,可以比如先定位到某個元素,然后邊解釋,邊執(zhí)行,和juypter很像
同時,結(jié)合chrome去進(jìn)行元素的定位 比如通過css_selector
content = browser.find_element_by_css_selector('#app > div > div.home-page.f-clear > div.home-container > div > div.center-panel > div.card-list > div.feed-card > div.content > div:nth-child(2) > div.main-content > div.card-content > div.post-content > div > div.text.p-rel.description > div')或者xpath(也就是dom樹
browser.find_element_by_xpath()爬蟲的工具使用,chrome
最好用的工具之一,就像開發(fā)前端一樣,可以通過這個查看獲取了哪些資源,明白頁面節(jié)點(diǎn)間的關(guān)系。狠方便。
使用搜索功能搜索數(shù)據(jù) 有寫網(wǎng)站的數(shù)據(jù)不是直接靜態(tài)的寫載html中的,現(xiàn)在很多都是動態(tài)的用ajax等技術(shù)從后端獲取,然后利用js渲染好節(jié)點(diǎn)數(shù)據(jù)。 所以怎樣知道自己想要的數(shù)據(jù)在哪個端口呢。
- 在html中查看數(shù)據(jù)節(jié)點(diǎn)的命名方式。(通常會保持一致)
- 利用搜索工具搜索出想要信息,排查。
關(guān)于數(shù)據(jù)定位
對于某些網(wǎng)站,他們的數(shù)據(jù)往往沒有那么直觀就能再html或者某個json接口中就直接找到,可能他們的數(shù)據(jù)格式不一樣。經(jīng)過了一定處理,比如四舍五入,或者統(tǒng)計計算(比如我碰到的東方財富網(wǎng)站)。這時候我們就需要對網(wǎng)站進(jìn)行分析了。要了解其內(nèi)部js是如何運(yùn)算數(shù)據(jù)的,以及最后得出結(jié)果。 這里講一個簡單的,對dom樹進(jìn)行監(jiān)控。這里檢測dom樹節(jié)點(diǎn)什么時候發(fā)生變化。
通過這樣再元素那對節(jié)點(diǎn)進(jìn)行監(jiān)控,當(dāng)節(jié)點(diǎn)改變時,就會debug:暫停
這樣就定位到了js如何變化
還有直接對js進(jìn)行斷點(diǎn)的,但是沒有這個好用。
分布式,多線程等技術(shù)
使用這些批量的爬蟲技術(shù),主要是為了提高效率,因為時間很重要,要在規(guī)定時間內(nèi)將數(shù)據(jù)又快又好的爬取出來。 - 我主要使用python里面的多線程,協(xié)程進(jìn)行爬取,具體做法 協(xié)程博客 - 注意爬取的速度, 太快反而會導(dǎo)致錯誤 - 使用偽裝
常用框架:scrapy
反爬蟲
這也很重要,對于爬蟲是不可或缺的。
分級層爬取,
盡量將數(shù)據(jù)存儲到本地,哪怕其中部分不是我最終需要的數(shù)據(jù),只要是中間過程的一步,在不影響整體速度的前提下,盡量將中間數(shù)據(jù)也存儲到本地。
本地數(shù)據(jù)的讀取速度是很快的,重要的是,減少目標(biāo)服務(wù)器的壓力。
確保數(shù)據(jù)整體的正確性
很多時候,我們并不能一次性就把握住某個接口的全部特性,那么我們需要盡量的多做測試,在擁有足夠多的數(shù)據(jù)樣本的情況下,去進(jìn)行判斷。
明白樣本和整體的意義。
總結(jié)
以上是生活随笔為你收集整理的爬虫 页面元素变化_爬虫 基本知识 萌新的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中可通过()实现代码的复用_
- 下一篇: 弹出键盘布局上移_评测 | 别买了HHK