selenium處理網(wǎng)頁(yè)下拉加載數(shù)據(jù)爬取并存入excel

2019-7-17    seo達(dá)人

如果您想訂閱本博客內(nèi)容,每天自動(dòng)發(fā)到您的郵箱中, 請(qǐng)點(diǎn)這里

前言
之前有個(gè)同學(xué)詢(xún)問(wèn)我是否能夠爬取知乎的全部回答,當(dāng)初只會(huì)Scrapy無(wú)法實(shí)現(xiàn)下拉的數(shù)據(jù)全部加載。后來(lái)在意外中接觸了selenium的自動(dòng)化測(cè)試,看出了selenium的模擬能力的強(qiáng)大,而昨天有個(gè)同學(xué)問(wèn)我能否爬取中國(guó)工商銀行遠(yuǎn)程銀行的精彩回答,我說(shuō)可以試試。

思路
selenium模擬下拉直至底部
然后通過(guò)selenium獲取數(shù)據(jù)集合
通過(guò)pandas寫(xiě)入excel
selenium模擬下拉直至底部
此處全靠一位大佬的博客點(diǎn)撥,實(shí)在不好意思的是,selenium就看了下常用的api,實(shí)在不懂如何判斷是否加載完畢,而該博客代碼的原理也好理解,通過(guò)不斷下拉判斷與上一次高度進(jìn)行對(duì)比,知道前端頁(yè)面的滾動(dòng)高度屬性就懂了,當(dāng)然思想最重要。
見(jiàn)代碼:

#將滾動(dòng)條移動(dòng)到頁(yè)面的底部
all_window_height =  []  # 創(chuàng)建一個(gè)列表,用于記錄每一次拖動(dòng)滾動(dòng)條后頁(yè)面的最大高度
all_window_height.append(self.driver.execute_script("return document.body.scrollHeight;")) #當(dāng)前頁(yè)面的最大高度加入列表
while True:
self.driver.execute_script("scroll(0,100000)") # 執(zhí)行拖動(dòng)滾動(dòng)條操作
time.sleep(3)
check_height = self.driver.execute_script("return document.body.scrollHeight;")
if check_height == all_window_height[-1]:  #判斷拖動(dòng)滾動(dòng)條后的最大高度與上一次的最大高度的大小,相等表明到了最底部
print("我已下拉完畢")
break
else:
all_window_height.append(check_height) #如果不想等,將當(dāng)前頁(yè)面最大高度加入列表。
print("我正在下拉")

然后通過(guò)selenium獲取數(shù)據(jù)集合
通過(guò)find_elements_by_css_selector方法獲取元素對(duì)象列表,然后通過(guò)遍歷列表獲取單個(gè)對(duì)象,通過(guò)對(duì)象的text屬性獲取數(shù)據(jù)。
代碼與"通過(guò)pandas寫(xiě)入excel"代碼想結(jié)合。

通過(guò)pandas寫(xiě)入excel
example.xlsx

批量將數(shù)據(jù)依次寫(xiě)入excel,此處個(gè)人知道有兩種寫(xiě)法,推薦后者。
寫(xiě)法一:

problem = cls.driver.find_elements_by_css_selector("li h2.item-title a")
data = pd.read_excel('example.xlsx', sheet_name = 'Sheet1')
problemtext = []
for i in problem:
problemtext .append(i.text)
replytext = []
reply = cls.driver.find_elements_by_css_selector("div.item-right p")
for j in reply:
    replytext.append(j.text)
    data.loc[row,'答案'] = j.text
data['問(wèn)題'] = problemtext
data['答案'] = replytext

DataFrame(data).to_excel('test.xlsx', sheet_name='Sheet1')

寫(xiě)法二:

problem = cls.driver.find_elements_by_css_selector("li h2.item-title a")
data = pd.read_excel('example.xlsx', sheet_name = 'Sheet1')
row = 1
for i in problem:
    data.loc[row,'問(wèn)題'] = i.text
    row += 1
row = 1
reply = cls.driver.find_elements_by_css_selector("div.item-right p")
for j in reply:
    data.loc[row,'答案'] = j.text
    row += 1

DataFrame(data).to_excel('test.xlsx', sheet_name='Sheet1')

完整代碼
import pandas as pd
from pandas import DataFrame
import unittest
import time
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.support.select import Select
from selenium.webdriver.support.ui import WebDriverWait

class autoLogin(unittest.TestCase):

URL = 'http://zhidao.baidu.com/business/profile?id=87701'


@classmethod
def setUpClass(cls):
cls.driver = webdriver.Firefox()
cls.driver.implicitly_wait(20)
cls.driver.maximize_window()



def test_search_by_selenium(self):
self.driver.get(self.URL)
self.driver.title
time.sleep(1)
#將滾動(dòng)條移動(dòng)到頁(yè)面的底部
all_window_height =  []
all_window_height.append(self.driver.execute_script("return document.body.scrollHeight;"))
while True:
self.driver.execute_script("scroll(0,100000)") 
time.sleep(3)
check_height = self.driver.execute_script("return document.body.scrollHeight;")
if check_height == all_window_height[-1]:  
print("我已下拉完畢")
break
else:
all_window_height.append(check_height) 
print("我正在下拉")

@classmethod
def tearDownClass(cls):
html=cls.driver.page_source
problem = cls.driver.find_elements_by_css_selector("li h2.item-title a")
data = pd.read_excel('example.xlsx', sheet_name = 'Sheet1')
row = 1
for i in problem:
    data.loc[row,'問(wèn)題'] = i.text
    row += 1
row = 1
reply = cls.driver.find_elements_by_css_selector("div.item-right p")
for j in reply:
    data.loc[row,'答案'] = j.text
    row += 1
    
DataFrame(data).to_excel('test.xlsx', sheet_name='Sheet1')

#保存成網(wǎng)頁(yè)
with open("index.html", "wb") as f:
f.write(html.encode())
f.close()
cls.driver.quit()

if __name__ == '__main__':
unittest.main(verbosity=2)

text.xlsx


總結(jié)
在使用Scrapy爬蟲(chóng)時(shí),可以通過(guò)selenium來(lái)執(zhí)行網(wǎng)頁(yè)中的一些js腳本,但是如何將二者結(jié)合起來(lái),以及各種框架之間的靈活運(yùn)用,都將是我需要面對(duì)的。
--------------------- 
藍(lán)藍(lán)設(shè)計(jì)bouu.cn )是一家專(zhuān)注而深入的界面設(shè)計(jì)公司,為期望卓越的國(guó)內(nèi)外企業(yè)提供卓越的UI界面設(shè)計(jì)、BS界面設(shè)計(jì) 、 cs界面設(shè)計(jì) 、 ipad界面設(shè)計(jì) 、 包裝設(shè)計(jì) 、 圖標(biāo)定制 、 用戶(hù)體驗(yàn) 、交互設(shè)計(jì)、網(wǎng)站建設(shè) 、平面設(shè)計(jì)服務(wù)

分享本文至:

日歷

鏈接

個(gè)人資料

存檔