Python爬蟲學習之selenium+ChromeDriver實現爬蟲

selenium+ChromeDriver實現爬蟲

參考:https://blog.csdn.net/u010986776/article/details/79266448
selenium所做的事情,恰恰是驅動真正的瀏覽器去執行請求和操作
無頭瀏覽器:

  • PhantomJS
  • ChromeDriver

Selenium和ChromeDriver的安裝與配置

  1. Selenium庫的安裝:pip install selenium (Anaconda Prompt)
    在這裏插入圖片描述
  2. ChromeDriver的安裝與配置
    • 查看自己chrome瀏覽器的版本。瀏覽器地址欄輸入地址: chrome://version
      在這裏插入圖片描述
    • 通過自己的版本下載相應的chromedriver.exe:下載地址:http://npm.taobao.org/mirrors/chromedriver/
    • 將下載下來的chromedriver.exe放在chrome安裝目錄下以及python安裝目錄下
    • 配置環境變量:右鍵點擊我的電腦–>屬性–>高級系統設置–>環境變量–>在path路徑下添加上文中瀏覽器文件所在的根目錄。
    • 查看是否安裝成功:命令行輸入 chromedriver -version
      在這裏插入圖片描述
# 導入selenium的瀏覽器驅動接口
from selenium import webdriver

# 要想調用鍵盤按鍵操作需要引入keys包
from selenium.webdriver.common.keys import Keys

# 導入chrome選項
from selenium.webdriver.chrome.options import Options

第一個程序:抓取頁面內容,生成頁面快照

# 創建chrome瀏覽器驅動,無頭模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)

# 加載百度頁面
driver.get("http://www.baidu.com/")
# time.sleep(3)

# 獲取頁面名爲wrapper的id標籤的文本內容
data = driver.find_element_by_id("wrapper").text
print(data)

# 打印頁面標題 "百度一下,你就知道"
print(driver.title)

# 生成當前頁面快照並保存
driver.save_screenshot("baidu.png")

# 關閉瀏覽器
driver.quit()
新聞
hao123
地圖
視頻
貼吧
學術
登錄
設置
更多產品
下載百度APP
有事搜一搜  沒事看一看
把百度設爲主頁關於百度About  Baidu百度推廣
©2019 Baidu 使用百度前必讀 意見反饋 京ICP證030173號  京公網安備11000002000001號 
百度一下,你就知道

模擬用戶輸入和點擊搜索

# 導入time模塊
import time
# 創建chrome瀏覽器驅動,無頭模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# get方法會一直等到頁面被完全加載,然後纔會繼續程序,通常測試會在這裏選擇 time.sleep(2)
driver.get("http://www.baidu.com/")
# id="kw"是百度搜索輸入框,輸入字符串"中央財經大學"
driver.find_element_by_id("kw").send_keys(u"中央財經大學")

# id="su"是百度搜索按鈕,click() 是模擬點擊
driver.find_element_by_id("su").click()
time.sleep(3)
# 獲取新的頁面快照
driver.save_screenshot("中央財經大學.png")
True
# 打印網頁渲染後的源代碼
print(driver.page_source)
# 獲取當前頁面Cookie
print(driver.get_cookies())
# ctrl+a 全選輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'a')

# ctrl+x 剪切輸入框內容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL, 'x')

# 輸入框重新輸入內容
driver.find_element_by_id("kw").send_keys("雙十一")

# 模擬Enter回車鍵
driver.find_element_by_id("su").send_keys(Keys.RETURN)
time.sleep(3)

# 清除輸入框內容
driver.find_element_by_id("kw").clear()

# 生成新的頁面快照
driver.save_screenshot("雙十一.png")

# 獲取當前url
print(driver.current_url)

# 關閉瀏覽器
driver.quit()

模擬用戶登錄

賬號+密碼

自行查看結果

# 創建chrome瀏覽器驅動,無頭模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# 加載微博登錄頁
driver.get("https://passport.weibo.cn/signin/login")
time.sleep(3)

# 找到輸入框,鍵入用戶名和密碼
driver.find_element_by_id('loginName').send_keys("[email protected]") # 綁定了手機號的賬號無法登錄
driver.find_element_by_id('loginPassword').send_keys("Qq94313805")

# 點擊登錄按鈕
driver.find_element_by_id('loginAction').click()
time.sleep(3)

# 快照顯示已經成功登錄
print(driver.save_screenshot('jietu.png'))
driver.quit()

True

爬取滾動加載頁面

from lxml import etree
# 創建chrome瀏覽器驅動,無頭模式
chrome_options = Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
# 唯品會女裝圖片鏈接無法直接獲得
# 請求唯品會頁面
driver.get("https://category.vip.com/search-3-0-1.html?q=3|129372||&rp=26594|10002321&ff=women|0|1|4&adidx=1&f=ad&adp=65001&adid=326630")
time.sleep(3)

# 逐漸滾動瀏覽器窗口,令ajax逐漸加載
for i in range(1, 10):
    js = "var q=document.documentElement.scrollTop=" + str(500 * i)  # 谷歌 和 火狐

    driver.execute_script(js)
    print('=====================================')
    time.sleep(3)

# 拿到頁面源碼
html = etree.HTML(driver.page_source)
all_img_list = []

# 得到所有圖片
img_group_list = html.xpath("//img[contains(@id,'J_pic')]")
# img_group_list = html.xpath("//img[starts-with(@id,'J_pic')]")
# 正則表達式匹配
# img_group_list = html.xpath(r'//img[re:match(@id, "J_pic*")]',namespaces={"re": "http://exslt.org/regular-expressions"})

# 收集所有圖片鏈接到列表
for img_group in img_group_list:
    img_of_group = img_group.xpath(".//@data-original | .//@data-img-back | .//@data-img-side")
    print(img_of_group)
    all_img_list.append('\n'.join(img_of_group) + '\n')

# 將收集到的數據寫入文件
with open('vip.txt', 'w', encoding='utf-8') as f:
    f.write('\n'.join(all_img_list))

# 退出瀏覽器
driver.quit()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章