Python爬蟲(chóng)日記六:Selenium+xpath+bs4爬取亞馬遜數(shù)據(jù)保存到mongodb

一:前言

上周末非常開(kāi)心,第一次去北京然后參見(jiàn)了zealer和夸克瀏覽器的聯(lián)合線下沙龍會(huì)議,和大家交流很多收獲很多,最讓我吃驚的是他們團(tuán)隊(duì)非常年輕就有各種能力舅桩,每個(gè)人都很強(qiáng)哥放。一個(gè)結(jié)論:我要繼續(xù)努力!
貼上我們的合影峭弟,我很帥!:)

zealer&夸克瀏覽器.jpg

夸克瀏覽器合影.JPG

這次爬蟲(chóng)是使用selenium來(lái)模擬輸入關(guān)鍵字(我是測(cè)試輸入各種圖書(shū))然后把全部頁(yè)數(shù)的相關(guān)的商品數(shù)據(jù)保存到mongodb跷乐,期間遇到各種問(wèn)題浅侨,很多網(wǎng)站不是很容易就一次可以把網(wǎng)頁(yè)解析好,很輕松的提取數(shù)據(jù)订歪。這個(gè)亞馬遜就是有點(diǎn)怪眼虱,這次是提取商品的名稱,圖片地址舶赔,價(jià)格,時(shí)間,因?yàn)槲业某跏寄康氖浅鋈胗嘘P(guān)圖書(shū)的關(guān)鍵字焕窝,所以時(shí)間就是圖書(shū)出版時(shí)間垃沦。

關(guān)于‘python’關(guān)鍵字如圖所示,爬取了300條數(shù)據(jù)休涤。


mongodb數(shù)據(jù).png

二:運(yùn)行環(huán)境

  • IDE:Pycharm
  • Python3.6
  • Selenium 3.4.0
  • pymongo 3.3.0
  • BeautifulSoup 4.5.3

三: 爬蟲(chóng)中重要(keng)的部分

  • 商品的時(shí)間使用Beautifulsoup是提取不出來(lái)的,使用正則表達(dá)式也搞不定糯钙,我最后用xpath才提取出來(lái)
  • 每個(gè)商品框架都是獨(dú)立id嗅蔬,沒(méi)有使用共同的class吴趴,所以要想獲取他們使用正則表達(dá)式挺合適的
  • 因?yàn)樯唐返拿Q,圖片地址趋厉,價(jià)格這三個(gè)是使用beautifulsoup提取的,而時(shí)間是用的xpath提取翼馆,要想把他們一起裝入一個(gè)字典中然后寫(xiě)入mongodb就需要用到zip這個(gè)函數(shù)了魔吐。
    像這樣的處理兩個(gè)列表一起迭代for item, time in zip(content, date)

四:實(shí)戰(zhàn)代碼

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium import webdriver
from bs4 import BeautifulSoup
import lxml.html
import pymongo
import re

MONGO_URL = 'localhost'
MONGO_DB = 'amazon'
MONGO_TABLE = 'amazon-python'
SERVICE_ARGS = ['--load-images=false', '--disk-cache=true']
KEYWORD = 'python'
client = pymongo.MongoClient(MONGO_URL)
db = client[MONGO_DB]

browser = webdriver.PhantomJS(service_args=SERVICE_ARGS)
# browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)
browser.set_window_size(1400, 900)


def search():
    print('正在搜索')
    try:
        browser.get('https://www.amazon.cn/')
        input = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#twotabsearchtextbox'))
        )
        submit = wait.until(
            EC.element_to_be_clickable((By.CSS_SELECTOR, '#nav-search > form > div.nav-right > div > input')))
        input.send_keys(KEYWORD)
        submit.click()
        total = wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '#pagn > span.pagnDisabled')))
        get_products()
        print('一共' + total.text + '頁(yè)')
        return total.text
    except TimeoutException:
        return search()


def next_page(number):
    print('正在翻頁(yè)', number)
    try:
        wait.until(EC.text_to_be_present_in_element(
            (By.CSS_SELECTOR, '#pagnNextString'), '下一頁(yè)'))
        submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#pagnNextString')))
        submit.click()
        wait.until(EC.text_to_be_present_in_element(
            (By.CSS_SELECTOR, '.pagnCur'), str(number)))
        get_products()
    except TimeoutException:
        next_page(number)


def get_products():
    try:
        wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#s-results-list-atf')))
        html = browser.page_source
        soup = BeautifulSoup(html, 'lxml')
        doc = lxml.html.fromstring(html)
        date = doc.xpath('//*[@class="s-result-item  celwidget "]/div/div[2]/div[1]/span[2]/text()')
        content = soup.find_all(attrs={"id": re.compile(r'result_\d+')})
        for item, time in zip(content, date):
            product = {
                'title': item.find(class_='s-access-title').get_text(),
                'image': item.find(class_='s-access-image cfMarker').get('src'),
                'price': item.find(class_='a-size-base a-color-price s-price a-text-bold').get_text(),
                'date': time
            }
            save_to_mongo(product)
            print(product)
    except Exception as e:
        print(e)


def save_to_mongo(result):
    try:
        if db[MONGO_TABLE].insert(result):
            print('存儲(chǔ)到mongodb成功', result)
    except Exception:
        print('存儲(chǔ)到mongodb失敗', result)


def main():
    try:
        total = int(search())
        for i in range(2, total + 1):
            next_page(i)
    except Exception as e:
        print('出錯(cuò)啦', e)
    finally:
        browser.close()


if __name__ == '__main__':
    main()

五:總結(jié)

這次學(xué)習(xí)的東西還是很多,selenium用的模塊很多垃瞧,也利用了無(wú)頭瀏覽器PhantomJS的不加載圖片和緩存。爬取數(shù)據(jù)的時(shí)候使用了不同的方式碳默,并用zip函數(shù)一起迭代保存為字典成功導(dǎo)入到mongodb中。
貼出我的github地址顶燕,我的爬蟲(chóng)代碼和學(xué)習(xí)的基礎(chǔ)部分都放進(jìn)去了,有喜歡的朋友一起學(xué)習(xí)交流吧!github.com/rieuse/learnPython

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赞咙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碰凶,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件野宜,死亡現(xiàn)場(chǎng)離奇詭異扫步,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)匈子,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)河胎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虎敦,你說(shuō)我怎么就攤上這事游岳。” “怎么了其徙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵胚迫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我唾那,道長(zhǎng)访锻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任闹获,我火速辦了婚禮期犬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘避诽。我一直安慰自己哭懈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布茎用。 她就那樣靜靜地躺著遣总,像睡著了一般。 火紅的嫁衣襯著肌膚如雪轨功。 梳的紋絲不亂的頭發(fā)上旭斥,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音古涧,去河邊找鬼垂券。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菇爪。 我是一名探鬼主播算芯,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凳宙!你這毒婦竟也來(lái)了熙揍?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氏涩,失蹤者是張志新(化名)和其女友劉穎届囚,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體是尖,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡意系,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了饺汹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛔添。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兜辞,靈堂內(nèi)的尸體忽然破棺而出作郭,到底是詐尸還是另有隱情,我是刑警寧澤弦疮,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布夹攒,位于F島的核電站,受9級(jí)特大地震影響胁塞,放射性物質(zhì)發(fā)生泄漏咏尝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一啸罢、第九天 我趴在偏房一處隱蔽的房頂上張望编检。 院中可真熱鬧,春花似錦扰才、人聲如沸允懂。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蕾总。三九已至,卻和暖如春琅捏,著一層夾襖步出監(jiān)牢的瞬間生百,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工柄延, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚀浆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像市俊,于是被迫代替她去往敵國(guó)和親杨凑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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