Python+PhantomJS+selenium+BeautifulSoup實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)爬蟲(chóng)

Python+PhantomJS+selenium+BeautifulSoup實(shí)現(xiàn)簡(jiǎn)易網(wǎng)絡(luò)爬蟲(chóng)

簡(jiǎn)易網(wǎng)絡(luò)小爬蟲(chóng)飒硅,目標(biāo)站:http://www.toutiao.com/

已實(shí)現(xiàn)的功能

日期 功能
2017.08.12 可獲取首頁(yè)輪播圖數(shù)據(jù)并保存到本地?cái)?shù)據(jù)庫(kù)
2017.08.16 可獲取首頁(yè)新聞列表每一項(xiàng)的全部數(shù)據(jù)(作者頭像除外)并保存到本地?cái)?shù)據(jù)庫(kù)
僅供學(xué)習(xí)使用倦踢,如有侵權(quán),敬請(qǐng)?jiān)彙?lt;(?????)>

Github地址: https://github.com/LalaTeam/PythonTrip

介紹

PhantomJS+selenium可以說(shuō)是...無(wú)敵的...

一一介紹一下:

PhantomJS: 實(shí)質(zhì)上就是一個(gè)沒(méi)有界面的瀏覽器,最主要的功能是能夠讀取js加載的頁(yè)面耗帕。

selenium: 瀏覽器自動(dòng)化測(cè)試框架.能夠模擬用戶的一些行為操作,比如填寫(xiě)指定輸入框,下拉操作等。

BeautifulSoup: 它是python的一個(gè)庫(kù)彪标,最主要的功能是從網(wǎng)頁(yè)抓取數(shù)據(jù)。配合lxml解析,快速獲取指定標(biāo)簽掷豺。

設(shè)計(jì)

基本思路:

  • 利用PhantomJS模擬請(qǐng)求url
  • 拿到網(wǎng)頁(yè)源碼,解析xml
  • 獲取指定標(biāo)簽
  • 根據(jù)標(biāo)簽?zāi)玫叫枰膶傩灾?/li>
  • 存入本地?cái)?shù)據(jù)庫(kù)

網(wǎng)站分析

首先看一下我們能要拿的數(shù)據(jù)

首頁(yè)有一個(gè)輪播圖和一個(gè)新聞列表

輪播圖包括圖片和文字標(biāo)題

新聞列表包括圖片,標(biāo)題,時(shí)間,分類(lèi),作者昵稱,評(píng)論數(shù)等等

打開(kāi)瀏覽器開(kāi)發(fā)者模式,分析一下標(biāo)簽內(nèi)容,

發(fā)現(xiàn)每個(gè)標(biāo)簽都帶有一個(gè)類(lèi)似key的東西作為唯一標(biāo)識(shí),

QQ20171021-120809@2x.png

截取a標(biāo)簽的href屬性group后面的一串?dāng)?shù)字作為唯一標(biāo)識(shí),

QQ20171021-121133@2x.png

點(diǎn)擊每一條新聞,發(fā)現(xiàn)新聞詳情的Url是頭條首頁(yè)Url+這個(gè)唯一標(biāo)識(shí),

新聞詳情url暫時(shí)不獲取,這里只是先獲取首頁(yè)數(shù)據(jù).

再分析一下,

每一類(lèi)標(biāo)簽都是相同的標(biāo)簽名并且有相同的class,這樣就好辦了許多,只需要找到這一堆相同class的標(biāo)簽,再遍歷獲取里面的屬性值就可以了.

想到這里,基本就可以開(kāi)工了,

但實(shí)際上還是有一個(gè)問(wèn)題,

就是新聞列表不是一次性加載出來(lái)的,并且新聞的圖片是懶加載的,怎么辦?

思前想后,還是利用PhantomJS去滾動(dòng)頁(yè)面,

由于圖片是懶加載捞烟,所以必須滾動(dòng)一遍到底部停留3秒才可以拿到圖片URL 否則是圖片拿到的是svg+xml的Base64,

一直獲取到新聞時(shí)間為一天前就停止獲取,

但是這樣還是會(huì)獲取到有重復(fù)的新聞,

所以,還是利用它自帶的key去判斷是否已存在,不存在則存入數(shù)據(jù)庫(kù).

Perfect~

開(kāi)工

driver = webdriver.PhantomJS()
driver.get(web_url)
# driver.page_source:網(wǎng)頁(yè)源碼
# 利用lxml解析源碼拿到標(biāo)簽
# 找到指定的一類(lèi)標(biāo)簽
item_tags = BeautifulSoup(driver.page_source, 'lxml')
                                           .find_all('div', class_='bui-box single-mode')

獲取每一類(lèi)數(shù)據(jù)的標(biāo)簽

        for itemTag in item_tags:
            # key
            k = itemTag.find('div', class_='bui-left single-mode-lbox')
                                                           .a['href'].split('/')[2]
            # 圖片
            u = itemTag.find('div', class_='bui-left single-mode-lbox').a.img['src']
            # 時(shí)間
            t = itemTag.find('div', class_='single-mode-rbox')
                                      .find('span', class_='footer-bar-action').text
            # 標(biāo)題
            title = itemTag.find('div', class_='title-box').a.text
            # 分類(lèi)
            type = itemTag.find('div', class_='bui-left footer-bar-left').a.text
            # 作者頭像
            # head = itemTag.find('div', class_='single-mode-rbox')
            #                 .find('a', class_='footer-bar-action media-avatar')
            # 作者昵稱
            name = itemTag.find('div', class_='bui-left footer-bar-left')
                                     .find_all('a', class_='footer-bar-action source')
            na = "" if len(name) == 0 else name[0].text
            # 評(píng)論數(shù)
            num = itemTag.find('div', class_='bui-left footer-bar-left')
                                      .find_all('a',class_='footer-bar-action source')

數(shù)據(jù)庫(kù)判斷插入或更新

@staticmethod
def isExistList(self, list):
    try:
            with connection.cursor() as cursor:
                for item in list:
                    key = item[2]
                    cursor.execute(list_select_sql, (key))
                    result = cursor.fetchone()
                    if result is None:
                        self.db_operate(list_insert_sql, item)
                    else:
                        temp = (item[0], item[1], item[5], item[8], item[2])
                        self.db_operate(list_update_sql, temp)
    finally:
            # connection.close()
            print('isExistList finally')

滾動(dòng)到底部的三種方式

# 滾動(dòng)到底部三種方式
# 1、driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 2当船、actions = ActionChains(driver)
# actions.move_to_element(e).perform()
elems = driver.find_elements_by_class_name("lazy-load-img")
driver.execute_script("arguments[0].scrollIntoView();", elems[len(elems) - 1])
# 停留三秒
time.sleep(3)

各種SQL語(yǔ)句

home_insert_sql = "INSERT INTO `tt_home_page` (`content`, `pic_url`,`click_key`,`create_time`,`type`) VALUES (%s,%s,%s,%s,%s)"
home_select_sql = "SELECT `*` FROM `tt_home_page` WHERE `click_key`=%s"
home_update_sql = "UPDATE tt_home_page SET content = %s, pic_url = %s WHERE click_key = %s"

list_insert_sql = "INSERT INTO `tt_home_list` (`content`, `pic_url`,`click_key`,`create_time`,`type`,`web_time`,`author_name`,`author_head`,`comment_num`) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s)"
list_select_sql = "SELECT `*` FROM `tt_home_list` WHERE `click_key`=%s"
list_update_sql = "UPDATE tt_home_list SET content = %s, pic_url = %s, web_time = %s, comment_num = %s WHERE click_key = %s"

獲取到的數(shù)據(jù)

  • 首頁(yè)列表數(shù)據(jù)
QQ20171021-120846@2x.png
  • 首頁(yè)輪播數(shù)據(jù)
QQ20171021-120913@2x.png

以上一個(gè)簡(jiǎn)單爬蟲(chóng)就完成了,很有意思~

具體項(xiàng)目可看Github,歡迎Star~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末题画,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子德频,更是在濱河造成了極大的恐慌婴程,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抱婉,死亡現(xiàn)場(chǎng)離奇詭異档叔,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)蒸绩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén)衙四,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人患亿,你說(shuō)我怎么就攤上這事传蹈。” “怎么了步藕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵惦界,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我咙冗,道長(zhǎng)沾歪,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任雾消,我火速辦了婚禮灾搏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘立润。我一直安慰自己狂窑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布桑腮。 她就那樣靜靜地躺著泉哈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丛晦,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天奕纫,我揣著相機(jī)與錄音,去河邊找鬼采呐。 笑死若锁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的斧吐。 我是一名探鬼主播又固,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼煤率!你這毒婦竟也來(lái)了仰冠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蝶糯,失蹤者是張志新(化名)和其女友劉穎洋只,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體昼捍,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡识虚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妒茬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片担锤。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖乍钻,靈堂內(nèi)的尸體忽然破棺而出肛循,到底是詐尸還是另有隱情,我是刑警寧澤银择,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布多糠,位于F島的核電站,受9級(jí)特大地震影響浩考,放射性物質(zhì)發(fā)生泄漏夹孔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一怀挠、第九天 我趴在偏房一處隱蔽的房頂上張望析蝴。 院中可真熱鬧,春花似錦绿淋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春裁赠,著一層夾襖步出監(jiān)牢的瞬間殿漠,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工佩捞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绞幌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓一忱,卻偏偏與公主長(zhǎng)得像莲蜘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子帘营,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 1 前言 作為一名合格的數(shù)據(jù)分析師票渠,其完整的技術(shù)知識(shí)體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲(chǔ)芬迄、數(shù)據(jù)提取问顷、數(shù)據(jù)分析、數(shù)據(jù)挖掘禀梳、...
    whenif閱讀 18,061評(píng)論 45 523
  • Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲(chóng)主要分3個(gè)大的版塊:抓取杜窄,分析,存儲(chǔ) 另外算途,比較常用的爬蟲(chóng)框架Scrapy塞耕,這里最后也詳細(xì)...
    楚江數(shù)據(jù)閱讀 1,461評(píng)論 0 6
  • 1,Selenium Selenium是一個(gè)Web的自動(dòng)化測(cè)試工具郊艘,最初是為網(wǎng)站自動(dòng)化測(cè)試而開(kāi)發(fā)的荷科,類(lèi)型像我們玩游...
    曉可加油閱讀 1,536評(píng)論 0 6
  • 早上,閨女趴在我胸前沖我嘻嘻笑纱注,嘴巴不停向我叨叨今天又看見(jiàn)好多芝麻小蟲(chóng)子(自從我夸她看見(jiàn)小蟲(chóng)子就能想到像芝...
    問(wèn)元元閱讀 1,314評(píng)論 4 1
  • hi小仙女 之前是說(shuō)的每做一個(gè)小改變都要給你們發(fā)感受的畏浆,不過(guò)懶著懶著就忘了,倒不是學(xué)網(wǎng)紅搞什么化妝教程啥的狞贱,只...
    李李李美麗呀閱讀 443評(píng)論 0 0