爬蟲實(shí)戰(zhàn)之Selenuim爬取某寶美食數(shù)據(jù)

淘寶可以說是一個檢驗(yàn)爬蟲技術(shù)是否過關(guān)的最強(qiáng)關(guān)卡了赡若,下面來打破它吧肃拜。

淘寶的所有操作差不多都是在登錄的狀態(tài)下進(jìn)行的,這時候想要對淘寶進(jìn)行請求獲取信息就必須在登錄的狀態(tài)下進(jìn)行了咆课。

方式一:(selenium)
使用selenium模塊棍厂,使用自動化模塊進(jìn)行爬取淘寶颗味,對自己需要的信息進(jìn)行爬取下來,這是一個很簡單的方式牺弹,但是這也是一個效率比較低下的爬蟲形式浦马。這個簡單的自動化爬取形式就不詳細(xì)講解了。但是有一個值得注意的點(diǎn)就是登陸的時候例驹,會被檢測出內(nèi)容輸入的速度過快捐韩,之后彈出一個滑動驗(yàn)證條,需要對驗(yàn)證條進(jìn)行處理才能夠登陸成功鹃锈。

方式二:(requests)
使用requests模塊荤胁,對淘寶頁面發(fā)起請求,但是在發(fā)起請求之前就需要攜帶上淘寶賬號的cookies信息屎债,如果沒有攜帶cookies信息仅政,那么對淘寶發(fā)起的所有請求都沒有任何有用信息返回垢油。

1. selenium簡介

使用selenium模塊,使用自動化模塊進(jìn)行爬取淘寶圆丹,對自己需要的信息進(jìn)行爬取下來滩愁,這是一個很簡單的方式,但是這也是一個效率比較低下的爬蟲形式辫封。這個簡單的自動化爬取形式就不詳細(xì)講解了硝枉。但是有一個值得注意的點(diǎn)就是登陸的時候,會被檢測出內(nèi)容輸入的速度過快倦微,之后彈出一個滑動驗(yàn)證條妻味,需要對驗(yàn)證條進(jìn)行處理才能夠登陸成功。

1.1 針對瀏覽器的主要操作方法:

創(chuàng)建瀏覽器對象:driver = webdriver.xxx()
窗口最大化:maximize_window()
獲取瀏覽器尺寸:get_window_size()
設(shè)置瀏覽器尺寸:set_window_size()
獲取瀏覽器位置:get_window_position()
設(shè)置瀏覽器位置:set_window_position(x,y)
關(guān)閉當(dāng)前標(biāo)簽/窗口:close()
關(guān)閉所有標(biāo)簽/窗口:quit()

1.2 selenium定位元素

因?yàn)閟elenium是模仿真實(shí)點(diǎn)擊瀏覽器的行為欣福,所以必須要先定位網(wǎng)頁元素责球,才能進(jìn)行各種操作。

「定位頁面元素的8種主要方式」
id定位:driver.find_element_by_id(value)
name屬性值定位:driver.find_element_by_name(value)
類名定位:driver.find_element_by_class_name(value)
標(biāo)簽名定位:driver.find_element_by_tag_name(value)
鏈接文本定位:driver.find_element_by_link_text(value)
部分鏈接文本:driver.find_element_by_partial_link_text(value)
xpath路徑表達(dá)式:driver.find_element_by_xpath(value)
css選擇器:driver.find_element_by_css_selector(value)

1.3 selenium操作網(wǎng)頁

定位元素后拓劝,需要對網(wǎng)頁進(jìn)行各種操作雏逾,比如點(diǎn)擊、刷新郑临、保存等栖博。

點(diǎn)擊展開新的頁面,點(diǎn)擊方法:element.click()

其他主要操作方法:
請求某個url:driver.get(url)
刷新頁面操作:refresh()
回退到之前的頁面:back()
前進(jìn)到之后的頁面:forward()
獲取當(dāng)前訪問頁面url:current_url
獲取當(dāng)前瀏覽器標(biāo)題:title
保存圖片:get_screenshot_as_png()/get_screenshot_as_file(file)
網(wǎng)頁源碼:page_source

2. 爬取流程

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

import time, datetime, random

# 創(chuàng)建Chrome瀏覽器對象厢洞,這會在電腦中打開一個窗口
browser = webdriver.Chrome('C:/Users/dell/Downloads/chromedriver_win32 (1)/chromedriver.exe')
wait = WebDriverWait(browser, 10)

# 保存圖片笛匙;
def savepic():
    basepath = 'F:/test/'
    filename = "{:%Y%m%d%H%M%S}-{:03}.png".format(datetime.datetime.now(), random.randint(1,100))
    browser.save_screenshot(basepath+filename)
    # 生成頁面快照并保存

def search():
    browser.get('https://www.taobao.com/')
    input = wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
    )  # 選擇輸入框

    # 點(diǎn)擊搜索按鈕
    submit = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
    time.sleep(1)
    input.send_keys('美食')
    time.sleep(1)
    submit.click()

    # login
    input_username = wait.until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input')))
    input_password = wait.until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input')))
    input_login = wait.until(EC.presence_of_element_located(
        (By.CSS_SELECTOR, '#login-form > div.fm-btn > button')))

    input_username.send_keys('*******')
    print('賬戶名輸入完成')
    time.sleep(1)
    input_password.send_keys('*******')
    print('密碼輸入完成')
    # input_password.send_keys(Keys.ENTER)
    time.sleep(1)
    # 等待登錄按鈕
    input_login.click()
    print('登錄成功!')

def main():
    search()

if __name__ == '__main__':
    main()

顯示出搜索頁了


查看頁數(shù)

翻頁:輸入每一頁 頁碼,不使用下一頁犀变,防止出錯;


圖片.png
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pyquery import PyQuery as pq
from config import *

import time, datetime, random, re, pymongo

# 創(chuàng)建Chrome瀏覽器對象秋柄,這會在電腦中打開一個窗口
browser = webdriver.Chrome('C:/Users/dell/Downloads/chromedriver_win32 (1)/chromedriver.exe')
wait = WebDriverWait(browser, 10)

client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]


def search():
    try:
        browser.get('https://www.taobao.com/')
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, "#q"))
        )  # 選擇輸入框

        # 點(diǎn)擊搜索按鈕
        submit = WebDriverWait(browser, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#J_TSearchForm > div.search-button > button')))
        time.sleep(1)
        input.send_keys('美食')
        time.sleep(1)
        submit.click()

        # login
        input_username = wait.until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input')))
        input_password = wait.until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input')))
        input_login = wait.until(EC.presence_of_element_located(
            (By.CSS_SELECTOR, '#login-form > div.fm-btn > button')))

        input_username.send_keys('')
        print('賬戶名輸入完成')
        time.sleep(1)
        input_password.send_keys('')
        print('密碼輸入完成')
        # input_password.send_keys(Keys.ENTER)
        time.sleep(1)
        # 等待登錄按鈕
        input_login.click()
        print('登錄成功!')

        # 頁數(shù)
        total = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.total')))
        get_products()
        return total.text
    except TimeoutException:
        return search()   # 超時重新請求获枝;

def next_page(page_number):
    try:
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > input')))
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > div.form > span.btn.J_Submit')))
        input.clear()
        input.send_keys(page_number)
        submit.click()
        time.sleep(2)

        # 判斷是否翻頁成功
        wait.until(EC.text_to_be_present_in_element(
            (By.CSS_SELECTOR, '#mainsrp-pager > div > div > div > ul > li.item.active > span'), str(page_number)))

        get_products()

    except TimeoutException:
        next_page(page_number)

def get_products():
    # 寶貝信息
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#mainsrp-pager .items .item')))
    html = browser.page_source
    doc = pq(html)
    items = doc('#mainsrp-pager .items .item').items()
    for item in items:
        product = {
            'image': item.find('.pic .img').attr('src'),
            'price': item.find('.price').text(),
            'deal': item.find('.deal-cnl').text()[:-3],
            'title': item.find('.title').text(),
            'shop': item.find('.shop').text(),
            'location': item.find('.location').text()
        }
        print(product)
        save_to_mongo(product)

def save_to_mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('保存到mongo_DB成功', result)
    except Exception:
        print('保存到mongo失敗', result)




def main():
    total = search()
    total = int(re.compile('(\d+)').search(total).group())
    for i in range(2, 3):
        next_page(i)

    print(total)

if __name__ == '__main__':
    main()
# config.py
MONGO_URL = 'localhost'
MONGO_DB = 'taobao'
MONGO_TABLE = 'product'

聲明:本爬蟲僅供學(xué)習(xí), 若被他人用于商業(yè)用途與本人無關(guān)骇笔!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末省店,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子笨触,更是在濱河造成了極大的恐慌懦傍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芦劣,死亡現(xiàn)場離奇詭異粗俱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)虚吟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門寸认,熙熙樓的掌柜王于貴愁眉苦臉地迎上來签财,“玉大人,你說我怎么就攤上這事偏塞〕簦” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵灸叼,是天一觀的道長神汹。 經(jīng)常有香客問我,道長古今,這世上最難降的妖魔是什么屁魏? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮沧卢,結(jié)果婚禮上蚁堤,老公的妹妹穿的比我還像新娘。我一直安慰自己但狭,他們只是感情好披诗,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著立磁,像睡著了一般呈队。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唱歧,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天宪摧,我揣著相機(jī)與錄音,去河邊找鬼颅崩。 笑死几于,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沿后。 我是一名探鬼主播沿彭,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尖滚!你這毒婦竟也來了喉刘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤漆弄,失蹤者是張志新(化名)和其女友劉穎睦裳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體撼唾,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廉邑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鬓催。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡肺素,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宇驾,到底是詐尸還是另有隱情倍靡,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布课舍,位于F島的核電站塌西,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏筝尾。R本人自食惡果不足惜捡需,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望筹淫。 院中可真熱鬧站辉,春花似錦、人聲如沸损姜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摧阅。三九已至汰蓉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棒卷,已是汗流浹背顾孽。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留比规,地道東北人若厚。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像蜒什,于是被迫代替她去往敵國和親盹沈。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容