一、selenium爬取動態網頁
1、動態網頁認知
- 爬蟲其實就是在模仿瀏覽器的行爲
- 應對要多次數據的交互模擬的網站,我們有時會遇到像淘寶這樣的大型網站,對數據版權看得特別重的,它們的網站有大量的工程師和技術人員去維護,它們也可能在技術手段上採用多次交互數據包的方式來完成網站服務器與用戶瀏覽器之間的交互。如果此時還採用傳統的分析數據包的方式會比較的複雜,難度較高。
- 對於這類網頁的爬取,我們的解決方案是: Selenium + Chrome驅動。
2、工具的介紹
url編碼與解碼在線測試工具:http://tool.chinaz.com/tools/urlencode.aspx
在線正則表達式測試工具:https://tool.oschina.net/regex
3、Selenium的認識
一個Web自動化測試工具,最初是爲了網站自動化測試而開發的;我們玩遊戲有按鍵精靈; Selenium 也可以做類似的事情,但是它是在瀏覽器中做這樣的事情。
安裝:pip install selenium
然後就可以在Python中from selenium import webdriver來測試是否裝好。
4、爬蟲方案的選擇
對Selenium + Chrome驅動這個方案,從理論上來說,只要是用戶能夠訪問的數據,都可以抓取到,但是,從時間、空間、效率上來說,這個方案有些缺陷,尤其是時間方面,可能需要多次嘗試。
因此,如果能夠使用的get和post的地方,最好就不用selenium
二、爬蟲案例分析
1、獲取id或者xpath實現登陸
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
browser = webdriver.Chrome() # 設置Chrome爲selenium的瀏覽器驅動
# 打開瀏覽器實現登陸
def openbrowser():
# global browser
url = "http://index.baidu.com/" # 百度指數的網站
browser.get(url)
# 點擊網頁的登錄按鈕:在對應的元素那裏右擊檢查(或審查元素),再右擊Copy,最後Copy Xpath
browser.find_element_by_xpath('//*[@id="home"]/div[1]/div[2]/div[1]/div[5]/span/span').click()
time.sleep(3)
# 自動化操作是很快的,但是操作再快,網絡可能跟不上,可能頁面還沒加載完全,因此需要設定等待時間
# 瀏覽器登陸id測試
# 1)在用戶名輸入框點檢查,就能找到對應的id爲TANGRAM__PSP_4__userName
# 然後在console控制檯輸入:document.getElementById("TANGRAM__PSP_4__userName").value = "XXXX"
# 則就會自動填入賬號XXXX
# 2)密碼同理,找到的id爲:TANGRAM__PSP_4__password
# 3)然後再找登陸按鈕的id:TANGRAM__PSP_4__submit
# 登陸按鈕需要用click():document.getElementById("TANGRAM__PSP_4__submit").click()
# 自動傳入賬號密碼到輸入框
account = "XXXX"
passwd = "YYYY"
try:
browser.find_element_by_id("TANGRAM__PSP_4__userName").send_keys(account)
browser.find_element_by_id("TANGRAM__PSP_4__password").send_keys(passwd)
browser.find_element_by_id("TANGRAM__PSP_4__submit").click()
except:
browser.find_element_by_id("TANGRAM_12__password").send_keys(account)
browser.find_element_by_id("TANGRAM_12__userName").send_keys(passwd)
browser.find_element_by_id("TANGRAM_12__submit").click()
time.sleep(3)
2、翻頁處理
# 下一頁(翻頁)的處理
from selenium import webdriver
import time
cur_driver = webdriver.Chrome()
def go_next_page(cur_driver):
try:
# 用xpath找到,然後獲取href超鏈接,點擊超鏈接
next_page = cur_driver.find_element_by_xpath("").get_attribute('href')
cur_driver.get(next_page) # 轉到該超鏈接的頁面
time.sleep(3)
return True
except Exception as e:
print(e)
print("next page is not found!")
return False
3、滾屏操作
# 滾屏操作:保證數據都加載完全
def scroll_to_bottom():
# 最後嘗試50次滾屏到底部,參數可以自己調整
print("scroll down")
for i in range(50):
weibo_driver.excute_script('window.scrollTo(0,document.body.scrollHeight)')
html = weibo_driver.page_source # 獲取到網頁源碼
tr = etree.HTML(html)
# 用xpath找到下一頁的鏈接
next_page_url = tr.xpath("")
if len(next_page_url) > 0:
return next_page_url[0].get('href')
# 有可能下一頁的網頁會加載失敗
if len(re.findall("點擊重新輸入",html)) > 0:
print("加載失敗,請重新加載!")
# 則就自動點擊重新載入
weibo_driver.find_element_by_link_text("點擊重新載入").click()
time.sleep(2)
三、哈希hash算法與RSA加密
1、哈希算法
import hashlib
# # HASH字符串:直接使用hashlib.方法
def hashStr(ss):
h = hashlib.md5() # 實例化hash對象
h.update(ss.encode("utf-8")) # 獲取數據
return h.hexdigest() # 開始hash
# HASH文件:對文件做Hash算法
chunkSize = 4096
def hashFile(hashName):
h = hashlib.sha256() # 實例化一個hash對象
with open(hashName,"rb") as f:
# 用循環來讀取全部數據
while True:
chunk = f.read(chunkSize)
if not chunk:
break # 判斷是否結尾,如果爲空就跳出循環
h.update(chunk)
return h.hexdigest() # 得到文件最終的hash值
if __name__ == "__main__":
print(hashStr("hello world"))
print(hashFile("note.txt"))
2、RSA加密
- RSA加密算法是一種非對稱加密算法,加密算法不重要,祕鑰才能保密。
- 祕鑰:如果加解密用同一個祕鑰,對稱加密;如果加解密用兩個不同的祕鑰,非對稱加密(有兩個祕鑰:公鑰,私鑰)
- 用公鑰加密的數據需要使用私鑰來解;用私鑰加密的數據需要使用公鑰來解;公鑰可以隨便給別人,私鑰不能給
- HTTPS使用的是非對稱加密:服務器、客戶端、瀏覽器
- 通信的過程:服務器把數據用私鑰加密,把加密之後的數據和公鑰一起發給客戶端;完成一次通信。
- 客戶端把要發給服務器的數據用服務器所給的公鑰加密,然後傳給服務器;完成一次通信,服務器可以用私鑰來解密。
n = p*q,當n是一個巨大的數時,理論上在有限的時間之內這個兩個質數p,q是分解不出來。則p,q是私鑰,n就是公鑰