Python:使用selenium模擬瀏覽器抓取數(shù)據

有些js動態(tài)網站和反抓取的網站,對requests的檢查比較嚴格, 使用requests包很難抓取數(shù)據。這時可以考慮使用 selenium 模擬瀏覽器,它可以建立一個真實的瀏覽器窗口,并模擬鼠標點擊、鍵盤輸入等操作。

安裝selenium

selenium是調用本地的瀏覽器程序,所以本機上需要安裝好Firefox等瀏覽器,并配置好系統(tǒng)環(huán)境PATH變量。
使用Firefox瀏覽器時,需要額外安裝geckodriver驅動,下載并解壓縮以后, 把geckodriver.exe復制一份到firefox.exe的目錄即可。

pip install selenium

常用方法

selenium的功能非常強大, 包括元素選擇、模擬鼠標移動點擊、嵌套網頁切換等等,也可以編寫批量操作,這里只寫下面實例需要用到的。

from selenium import webdriver
driver = webdriver.Firefox()  # 會打開firefox瀏覽器窗口, 也可以使用headless模式
driver.get(url)           # 打開鏈接
button = driver.select_element_by_css_selector()    # 使用CSS選擇器語法選定指定的按鈕
button.click()           # 對按鈕進行點擊操作

實例

使用selenium打開搜狗微信搜索,抓取第一頁的搜索結果和鏈接。

from selenium import webdriver
from time import sleep  # 這個后面會用到
# 創(chuàng)建Firefox驅動, 也可以按注釋方法使用 headless 模式
# options = webdriver.firefox.options.Options()
# options.add_argument('-headless')
# driver = webdriver.Firefox(firefox_options=options)
driver = webdriver.Firefox()
# 打開搜狗微信網址
url = 'https://weixin.sogou.com/'
driver.get(url)

# 選擇網頁頂部的搜索組件
searchInput = driver.find_element_by_name('searchForm')
# 選擇搜索組件中的輸入框, 并輸入關鍵字
searchInput.find_element_by_name('query').send_keys('零食')
# 選擇搜索組件中的搜文件章按鈕, 并模擬鼠標點擊
searchInput.find_element_by_class_name('swz').click()

# 選擇搜索結果
infoList = driver.find_element_by_css_selector('ul.news-list').find_elements_by_class_name('txt-box')

# 提取結果信息
result = []
for info in infoList:
    result.append({
        'title':info.find_element_by_tag_name('h3>a').text,
        'url':info.find_element_by_tag_name('h3>a').get_property('href'),
        'summary':info.find_element_by_tag_name('p').text,
    })

不過抓取到的 url 并非是微信的鏈接,而是以https://weixin.sogou.com/link開頭的鏈接,并且訪問時會有搜狗的驗證。所以需要使用selenium的模擬點擊,獲取到真實的微信文章鏈接。
# 提取結果信息 部分的代碼做如下修改:

# 提取結果信息
result = []
# 保存當前標簽頁的句柄, 留做返回使用
mainHandle = driver.current_window_handle
for info in infoList:
    result.append({
        'title':info.find_element_by_tag_name('h3>a').text,
        'summary':info.find_element_by_tag_name('p').text,
    })
    # 模擬點擊, 打開文章的新窗口
    info.find_element_by_tag_name('h3').click()
    # 切換瀏覽標簽頁到新窗口, 切換前需要等待下, 以便瀏覽器完成重定向
    sleep(3)
    driver.switch_to_window(driver.window_handles[1])
    # 保存當前瀏覽器標簽頁面的url
    result[-1]['url'] = driver.current_url
    print(result[-1])
    # 關閉當前標簽頁
    driver.close()
    # 返回原搜索結果的標簽頁
    driver.switch_to_window(mainHandle)

好了, 這時候獲得的 url 都是以 https://mp.weixin.qq.com/s 開頭的微信鏈接,可以正常訪問查看文章內容了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容