A. 【爬蟲】python 解決網頁內容 和 爬取的內容不一致
我們使用 request 模塊獲取網頁內容的時候,有時候會發現獲取的網頁內容和網頁上不一樣,
有些數據並非服務端渲染,而是通過後來載入的數據,某些網站重要的數據會通過Ajax後期載入,
這就分非同步傳輸和非同步載入倆個概念。
非同步傳輸模式下,通常在JavaScript中,我們依次檢查JavaScript,就會找到真正的網址!
非同步載入則是在XHR的選項中獲取真實網站地址:
舉例豆瓣的影片獲取信息:
頁面上的內容可以看到,但是爬下來之後卻沒有:
XHR獲取網頁載入的內容:
分別檢查左邊5條記錄,就可以看到真實的我們想要的內容。
B. 如何使用python或R抓取網頁被隱藏的源代碼
隱藏的源代碼?不知道你指的是什麼?我的理解有兩種,一是不在前段顯示,但是查看源代碼時有,二是,非同步載入的內容在前端和源代碼中均看不到,第一種很容易解決,想必你指的時第二種,解決方法有三種:
模擬瀏覽器,動態獲取,可以使用大殺器selenium工具
使用這種方法可以實現只要能看到就能抓取到,如滑鼠滑過,非同步載入等,因為他的行為可以與瀏覽器一模一樣,但是這種方式的效率卻是最低的,一般不到實在沒有辦法的時候不推薦使用。
執行js代碼
在python中執行非同步載入的js代碼,獲得一些諸如滑鼠滑過,下拉載入更多等,但是現在的網站中都有非常多的js代碼,要找到需要執行的目標js代碼時非常困難和耗時的,此外python對js的兼容性也不是很好,也不推薦使用。
找到非同步載入的json文件,最常用,最方便,最好用的方法,這是我平常抓取動態非同步載入網站時最常用的方法,可以解決我99%的問題。具體的使用方法是打開瀏覽器的開發者工具,轉到network選項,之後重新載入網頁,在network中的列表中找到載入過程中載入的需要動態非同步載入的json文件,以京東為例,如圖,第一張找到的是非同步載入的庫存信息的json文件,第二招找到的是非同步載入的評論信息的json文件:
具體更詳細的方法可以google或網路
C. 如何抓取網頁中非同步載入的數據
用前嗅的ForeSpider數據採集軟體可以抓取JS、AJAX生成的網頁。ForeSpider爬蟲是通用性的採集軟體,自帶一種爬蟲腳本語言,不管是如何復雜的JS網頁,如果可視化的配置方式採集不到,都可以寫腳本採集的到,比python、Java要容易的多,因為是專用的爬蟲腳本語言,所以簡單幾句話就可以實現強大的功能。
有免費版可以下載,免費版不限制功能。還要好多免費的模板可以下載使用,可以試一下。
D. 如何處理python爬蟲中的非同步載入
正常使用scrapy或goose等模塊時載入的爬蟲本身就是非同步的。
就算你多隻爬蟲「同時」啟動,「同時」只是對於你人眼睛而言 與遠端也是非同步的。
E. 如何用Python爬蟲抓取網頁內容
首先,你要安裝requests和BeautifulSoup4,然後執行如下代碼.
importrequests
frombs4importBeautifulSoup
iurl='http://news.sina.com.cn/c/nd/2017-08-03/doc-ifyitapp0128744.shtml'
res=requests.get(iurl)
res.encoding='utf-8'
#print(len(res.text))
soup=BeautifulSoup(res.text,'html.parser')
#標題
H1=soup.select('#artibodyTitle')[0].text
#來源
time_source=soup.select('.time-source')[0].text
#來源
origin=soup.select('#artibodyp')[0].text.strip()
#原標題
oriTitle=soup.select('#artibodyp')[1].text.strip()
#內容
raw_content=soup.select('#artibodyp')[2:19]
content=[]
forparagraphinraw_content:
content.append(paragraph.text.strip())
'@'.join(content)
#責任編輯
ae=soup.select('.article-editor')[0].text
這樣就可以了
F. 如何用python抓取這個網頁的內容
如果包含動態內容可以考慮使用Selenium瀏覽器自動化測試框架,當然找人有償服務也可以
G. Python網頁解析庫:用requests-html爬取網頁
Python 中可以進行網頁解析的庫有很多,常見的有 BeautifulSoup 和 lxml 等。在網上玩爬蟲的文章通常都是介紹 BeautifulSoup 這個庫,我平常也是常用這個庫,最近用 Xpath 用得比較多,使用 BeautifulSoup 就不大習慣,很久之前就知道 Reitz 大神出了一個叫 Requests-HTML 的庫,一直沒有興趣看,這回可算歹著機會用一下了。
使用 pip install requests-html 安裝,上手和 Reitz 的其他庫一樣,輕松簡單:
這個庫是在 requests 庫上實現的,r 得到的結果是 Response 對象下面的一個子類,多個一個 html 的屬性。所以 requests 庫的響應對象可以進行什麼操作,這個 r 也都可以。如果需要解析網頁,直接獲取響應對象的 html 屬性:
不得不膜拜 Reitz 大神太會組裝技術了。實際上 HTMLSession 是繼承自 requests.Session 這個核心類,然後將 requests.Session 類里的 requests 方法改寫,返回自己的一個 HTMLResponse 對象,這個類又是繼承自 requests.Response,只是多加了一個 _from_response 的方法來構造實例:
之後在 HTMLResponse 里定義屬性方法 html,就可以通過 html 屬性訪問了,實現也就是組裝 PyQuery 來干。核心的解析類也大多是使用 PyQuery 和 lxml 來做解析,簡化了名稱,挺討巧的。
元素定位可以選擇兩種方式:
方法名非常簡單,符合 Python 優雅的風格,這里不妨對這兩種方式簡單的說明:
定位到元素以後勢必要獲取元素裡面的內容和屬性相關數據,獲取文本:
獲取元素的屬性:
還可以通過模式來匹配對應的內容:
這個功能看起來比較雞肋,可以深入研究優化一下,說不定能在 github 上混個提交。
除了一些基礎操作,這個庫還提供了一些人性化的操作。比如一鍵獲取網頁的所有超鏈接,這對於整站爬蟲應該是個福音,URL 管理比較方便:
內容頁面通常都是分頁的,一次抓取不了太多,這個庫可以獲取分頁信息:
結果如下:
通過迭代器實現了智能發現分頁,這個迭代器裡面會用一個叫 _next 的方法,貼一段源碼感受下:
通過查找 a 標簽裡面是否含有指定的文本來判斷是不是有下一頁,通常我們的下一頁都會通過 下一頁 或者 載入更多 來引導,他就是利用這個標志來進行判斷。默認的以列表形式存在全局: ['next','more','older'] 。我個人認為這種方式非常不靈活,幾乎沒有擴展性。 感興趣的可以往 github 上提交代碼優化。
也許是考慮到了現在 js 的一些非同步載入,這個庫支持 js 運行時,官方說明如下:
使用非常簡單,直接調用以下方法:
第一次使用的時候會下載 Chromium,不過國內你懂的,自己想辦法去下吧,就不要等它自己下載了。render 函數可以使用 js 腳本來操作頁面,滾動操作單獨做了參數。這對於上拉載入等新式頁面是非常友好的。
H. 從零開始學Python-使用Selenium抓取動態網頁數據
AJAX(Asynchronouse JavaScript And XML:非同步JavaScript和XML)通過在後台與伺服器進行少量數據交換,Ajax 可以使網頁實現非同步更新,這意味著可以在不重新載入整個網頁的情況下,對網頁的某部分進行局部更新。傳統的網頁(不使用Ajax)如果需要更新內容,必須重載整個網頁頁面。
因為傳統的網頁在傳輸數據格式方面,使用的是 XML 語法,因此叫做 AJAX ,其實現在數據交互基本上都是使用 JSON 。使用AJAX載入的數據,即使使用了JS將數據渲染到了瀏覽器中,在 右鍵->查看網頁源代碼 還是不能看到通過ajax載入的數據,只能看到使用這個url載入的html代碼。
法1:直接分析ajax調用的介面。然後通過代碼請求這個介面。
法2:使用Selenium+chromedriver模擬瀏覽器行為獲取數據。
Selenium 相當於是一個機器人。可以模擬人類在瀏覽器上的一些行為,自動處理瀏覽器上的一些行為,比如點擊,填充數據,刪除cookie等。 chromedriver 是一個驅動 Chrome 瀏覽器的驅動程序,使用他才可以驅動瀏覽器。當然針對不同的瀏覽器有不同的driver。以下列出了不同瀏覽器及其對應的driver:
現在以一個簡單的獲取網路首頁的例子來講下 Selenium 和 chromedriver 如何快速入門:
參考:Selenium的使用
直接直接分析ajax調用的介面爬取
selenium結合lxml爬取
I. 如何用Python爬取動態載入的網頁數據
動態網頁抓取都是典型的辦法
直接查看動態網頁的載入規則。如果是ajax,則將ajax請求找出來給python。 如果是js去處後生成的URL。就要閱讀JS,搞清楚規則。再讓python生成URL。這就是常用辦法
辦法2,使用python調用webkit內核的,IE內核,或者是firefox內核的瀏覽器。然後將瀏覽結果保存下來。通常可以使用瀏覽器測試框架。它們內置了這些功能
辦法3,通過http proxy,抓取內容並進行組裝。甚至可以嵌入自己的js腳本進行hook. 這個方法通常用於系統的反向工程軟體
J. python怎麼抓取渲染後的頁面
應該是沒法抓取渲染後的頁面。
因為渲染這個工作是瀏覽器完成的。而你通過python腳本抓取到的內容僅僅是html、css、js等源碼。
對於一些需要js非同步載入的內容獲取,通常是先獲取相關源碼,然後參考js源碼,利用python偽造一個請求(帶上所需的參數)再向伺服器獲取一次內容。
動態內容的爬取,也是爬蟲面臨的一個比較大的難題。很多動態請求 事實上並不是那麼容易偽造的。