python+selenium實現的谷歌爬蟲(超詳細)

python+selenium實現的谷歌爬蟲

接到一個需求,需要從谷歌圖庫中爬取圖片。於是按照之前的爬取國內網站的圖片的方法,進入谷歌圖庫的圖片頁面,打開谷歌開發者工具,選中network面板,然後翻頁,以此找到返回圖片地址的json數組的請求url,結果硬是找不到。在這裏不得不說,國外的網站安全性比國內還是要高,國內的什麼百度圖庫、搜狗圖庫、一些圖片收費網站按照上面的方法輕鬆爬取。
既然此路不通,那就換一種方法,在此選擇了使用selenium自動化測試工具來配合python完成爬蟲。

1、selenium

Selenium 是一款強大的基於瀏覽器的開源自動化測試工具,最初由 Jason Huggins 於 2004 年在 ThoughtWorks 發起,它提供了一套簡單易用的 API,模擬瀏覽器的各種操作,方便各種 Web 應用的自動化測試。
  Selenium 的初衷是打造一款優秀的自動化測試工具,但是慢慢的人們就發現,Selenium 的自動化用來做爬蟲正合適。我們知道,傳統的爬蟲通過直接模擬 HTTP 請求來爬取站點信息,由於這種方式和瀏覽器訪問差異比較明顯,很多站點都採取了一些反爬的手段,而 Selenium 是通過模擬瀏覽器來爬取信息,其行爲和用戶幾乎一樣,反爬策略也很難區分出請求到底是來自 Selenium 還是真實用戶。而且通過 Selenium 來做爬蟲,不用去分析每個請求的具體參數,比起傳統的爬蟲開發起來更容易。Selenium 爬蟲唯一的不足是慢,如果你對爬蟲的速度沒有要求,那使用 Selenium 是個非常不錯的選擇。Selenium 提供了多種語言的支持(Java、.NET、Python、Ruby 等)。
  selenium安裝參照下面地址的博客,網上關於這個很多。
  https://blog.csdn.net/sinat_35100573/article/details/80272040

2、 爬蟲實現思路

selenium就是用來模擬瀏覽器操作的,在這裏我們首先首先打開瀏覽器進入谷歌首頁:https://www.google.com.hk/,然後找到搜索輸入框,通過selenium的API得到輸入框對象

input=browser.find_elements_by_xpath("//input[@class=‘gLFyf gsfi’]")[0]

在這裏插入圖片描述
接下來在輸入框中寫入關鍵字,按下enter鍵即會搜索

input.send_keys(“路飛”)
input.send_keys(Keys.ENTER) #按下enter鍵

在這裏插入圖片描述
進入到上面這個頁面,在點擊“圖片”這個超鏈接就進入到了谷歌圖庫頁面

a = browser.find_element_by_xpath("//div[@id=‘hdtb-msb-vis’]/div[2]/a")
a.click()

進入到頁面之後,我們就可以拿到頁面的html源碼,找到圖片的url地址,然後利用xpath或者bs4、正則等提取圖片的的url
在這裏插入圖片描述
但是,這樣操作之後發現我們在這個頁面提取到的url數量只有三十多個,這是爲什麼呢?因爲谷歌圖庫的圖片是動態加載的,我們這個纔是第一頁,那我們該怎樣才能獲取到更多的數據呢?此頁面的翻頁是滑動頁面右側的滾動條進行翻頁的,但是selenium的WebDriver驅動中沒有提供對滾動條相應的方法,所以需要藉助JS中的方法來控制滾動條,再通過WebDriver中的execute_script()執行JS代碼。

js = “q=document.documentElement.scrollTop=1903” # 將頁面滾動條往下拖
browser.execute_script(js)

總結 : 利用selenium實現的爬蟲邏輯上非常簡單,代碼的具體實現多在網上找找資料也沒什麼難度。

3、完整代碼

博主碼子不易,閱讀完了,點個讚唄!

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from selenium.webdriver.common.keys import Keys
import lxml
from lxml import etree
import os
import urllib.request
import json
import uuid

def get_image_urls(keyword,path):
    #創建一個參數對象,用來控制chrome以無界面模式打開
    ch_op = Options()
    #設置谷歌瀏覽器的頁面無可視化
    ch_op.add_argument('--headless')
    ch_op.add_argument('--disable-gpu')
    ch_op.add_argument('blink-settings=imagesEnabled=false')  # 不加載圖片, 提升速度
    url = "https://www.google.com.hk/"
    browser = webdriver.Chrome(chrome_options=ch_op)
    browser.get(url)
    time.sleep(2)
    input=browser.find_elements_by_xpath("//input[@class='gLFyf gsfi']")[0]
    input.send_keys(keyword)
    input.send_keys(Keys.ENTER) #按下enter鍵
    time.sleep(2)
    # browser.save_screenshot('4.png') #截圖
    # a=browser.find_elements_by_link_text("圖片")
    # hdtb-msb-vis   hdtb-mitem hdtb-imb
    a = browser.find_element_by_xpath("//div[@id='hdtb-msb-vis']/div[2]/a")
    a.click()
    # 因爲WebDriver驅動中沒有提供對滾動條相應的方法,所以需要藉助JS中的方法來控制滾動條
    # 再通過WebDriver中的execute_script()執行JS代碼
    js = "q=document.documentElement.scrollTop=1903"  # 將頁面滾動條拖到底部
    browser.execute_script(js)
    time.sleep(5)

    response = browser.page_source
    response = lxml.etree.HTML(response)
    image_urls = response.xpath("//div[@jscontroller='Q7Rsec']/div[@class='rg_meta notranslate']/text()")
    print(len(image_urls))
    for m in image_urls:
        try:
            image_url = str2json(m)
            print(image_url)
            download_pic(image_url,str(uuid.uuid1()),path)
        except Exception as e:
            print(e)
            continue
    # browser.quit()

def download_pic(url,name,path):
    '''
    下載圖片
    :param url: 圖片url
    :param name: 圖片名字
    :param path: 圖片存儲路徑
    '''
    if not os.path.exists(path):
        os.makedirs(path)
    res=urllib.request.urlopen(url,timeout=5).read()
    with open(path+name+'.jpg','wb') as file:
        file.write(res)
        file.close()


def str2json(strs):
    '''
    字符串轉換爲json,並得到json對象值
    :param strs: 字符串
    :return: 圖片url
    '''
    strjson = json.loads(strs)
    image_url = strjson.get('ou')
    return image_url


if __name__ == '__main__':
    keywords = ['路飛','娜美','索隆']
    path = 'd:\\谷歌爬蟲'
    for keyword in keywords:
        try:
            temp = path +"\\"+keyword+"\\"
            if not os.path.exists(temp):
                os.makedirs(temp)
            get_image_urls(keyword,temp)
        except Exception as e:
            print(str(e))
            print(keyword+"——下載出錯")
            continue


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章