1.scrapy在爬取過程中遇到ajax渲染的頁面,只爬取到了js**,爬不到真實的頁面內容。
解決方法:(前提:可以獲取到這些鏈結)
第一,如果鏈結的處理方式不可以統一,建立網域名稱與爬取策略的聯絡,通過特定的js請求的目標url獲取到json資料進行爬取;(缺點:無法做到完全窮盡,效率低)
第二,如果鏈結的處理方式可以統一,可以寫乙個統一的反爬蟲程式,將讀取檔案統一處理
第三,統一開啟瀏覽器,待爬蟲全部結束再關閉瀏覽器,對ajax和非ajax統一處理
(缺點:速度太慢)
爬取動態頁面目前來說有兩種方法:
1)分析頁面請求(無法做歸類,只適合特定網頁)
2)selenium模擬瀏覽器行為(在爬蟲過程開啟瀏覽器,爬蟲結束關閉瀏覽器)
3)最新的scrapy已經自帶處理「 ajax可抓取頁面」的爬網中介軟體(看官方文件的重要性!!!!)
1.對於特定的網頁,通過特定的js請求的目標url獲取到json資料進行爬取;
2.通過判斷內容中是否含有對應的vue、angular、react框架設計:
1)獲取到爬取非同步渲染頁面的鏈結(通過區分出三大框架各自的特點儲存鏈結)
存在難點:怎麼通過內容去反向拿到鏈結?
2)通過獲取的鏈結進行非同步獲取內容
1.安裝selenium庫
chrome://version
3.在scrapy整合selenium
1)在spider主程式初始init函式增加:
#啟動webdriver
self.browser = webdriver.chrome(executable_path=
)self.browser.set_page_load_timeout(30)
#執行結束後,關閉webdriver
defclosed
(self,spider)
:print
("spider closed"
) self.browser.close(
)
2)設定selenium中介軟體
#設定selenium中介軟體
class
seleniummiddleware
(object):
defprocess_request
(self, request, spider)
:if spider.name ==
'getcontent'
:try
: spider.browser.get(request.url)
spider.browser.execute_script(
'window.scrollto(0, document.body.scrollheight)'
)except timeoutexception as e:
print
('超時'
) spider.browser.execute_script(
'window.stop()'
) time.sleep(2)
return htmlresponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding=
"utf-8"
, request=request)
3)setting檔案
#新增seleniummiddleware中介軟體
'web_content.middlewares.seleniummiddleware'
:544
,
3.啟動scrapy的多個爬蟲方法:1)開啟多個命令列,分別執行scrapy crawl ***
2)編寫乙個指令碼
3)使用scrapyd,部署爬蟲,通過scrapyd的api呼叫爬蟲
ajax之非同步渲染
檢視函式展示所有老師 defshow t request data models.teacher.objects.all return render request,san five.html locals 檢視函式 用來渲染學生 defshow s request,id data models.t...
AJAX防止頁面快取
採用ajax技術的時候 通常我們無重新整理頁面提交資料後 用同樣的url去獲取資料的時候會發現是以前的資料 那樣就給client端帶來假象了 採用以下的方法可以取消快取 htm網頁 或者asp網頁 response.expires 1 response.expiresabsolute now 1 r...
ajax同步與非同步 非同步與頁面重新整理
此時遇到乙個問題,例如資產房間進行了增刪改,對應的快取也是要進行同步重新整理的,不然其他地方獲取的仍然是之前的資料。最開始考慮到的是在執行增刪改的介面返回success時呼叫對應的快取重新整理封裝方法。圖中紅色圈起來的部分,則是執行重新整理方法,但是測驗發現,當前insert成功了,但是上面三個方法...