阿里測試工程師推薦——Python下利用Selenium獲取動態(tài)頁面數(shù)據(jù)

利用python爬取網(wǎng)站數(shù)據(jù)非常便捷湿弦,效率非常高,但是常用的一般都是使用BeautifSoup汞扎、requests搭配組合抓取靜態(tài)頁面(即網(wǎng)頁上顯示的數(shù)據(jù)都可以在html源碼中找到,而不是網(wǎng)站通過js或者ajax異步加載的),這種類型的網(wǎng)站數(shù)據(jù)爬取起來較簡單掌腰。但是有些網(wǎng)站上的數(shù)據(jù)是通過執(zhí)行js代碼來更新的,這時傳統(tǒng)的方法就不是那么適用了张吉。這種情況下有如下幾種方法:

  清空網(wǎng)頁上的network信息齿梁,更新頁面,觀察網(wǎng)頁發(fā)送的請求肮蛹,有些網(wǎng)站可以通過這種方法構(gòu)造參數(shù)勺择,從而簡化爬蟲孤个。但是適用范圍不夠廣泛各谚。

  使用selenium模擬瀏覽器行為更新網(wǎng)頁獲取更新后的數(shù)據(jù)。本文接下來著重講述這種方法航厚。

  一气忠、準(zhǔn)備工作

  模擬瀏覽器需要用到兩個工具:

  1.selenium,可直接通過pip install selenium進行安裝赋咽。

  2.PhantomJS,這是一個無界面的冬耿,可腳本編程的WebKit瀏覽器引擎,百度進行搜索亦镶,在其官網(wǎng)下進行下載日月,下載后無需安裝,放到指定路徑下缤骨,在使用時只需指定文件所在路徑即可爱咬。

  二、使用selenium模擬瀏覽器

  本文爬取網(wǎng)站示例為:http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346(最新測試發(fā)現(xiàn)網(wǎng)站已無法打開绊起,2021年5月25日)

  學(xué)習(xí)示例時請不要爬取太多頁面精拟,走一遍流程了解怎么抓就行。

  打開網(wǎng)站后,可以看到需要爬取的數(shù)據(jù)為一個規(guī)則的表格蜂绎,但是有很多頁栅表。

  在這個網(wǎng)站中,點擊下一頁頁面的url不發(fā)生變化师枣,是通過執(zhí)行一段js代碼更新頁面的怪瓶。因此本文思想就是利用selenium模擬瀏覽器進行點擊,點擊“下一頁”后頁面數(shù)據(jù)進行更新践美,獲取更新后的頁面數(shù)據(jù)即可洗贰。下面是完整代碼:

  # -*- coding:utf-8 -*-

  import requests

  from bs4 import BeautifulSoup

  import json

  import time

  from selenium import webdriver

  import sys

  reload(sys)

  sys.setdefaultencoding( "utf-8" )

  curpath=sys.path[0]

  print curpath

  def getData(url):

  ? ? # 使用下載好的phantomjs,網(wǎng)上也有人用firefox陨倡,chrome敛滋,但是我沒有成功,用這個也挺方便

  driver =webdriver.PhantomJS(executable_path="C:/phantomjs.exe")

  driver.set_page_load_timeout(30)

  time.sleep(3)

  html=driver.get(url[0])? # 使用get方法請求url兴革,因為是模擬瀏覽器绎晃,所以不需要headers信息

  for page in range(3):

  html=driver.page_source? # 獲取網(wǎng)頁的html數(shù)據(jù)

  soup=BeautifulSoup(html,'lxml')? # 對html進行解析,如果提示lxml未安裝帖旨,直接pip install lxml即可

  table=soup.find('table',class_="report-table")

  name=[]

  for th in table.find_all('tr')[0].find_all('th'):

  name.append(th.get_text())? # 獲取表格的字段名稱作為字典的鍵

  flag=0? # 標(biāo)記箕昭,當(dāng)爬取字段數(shù)據(jù)是為0,否則為1

  for tr in table.find_all('tr'):

  # 第一行為表格字段數(shù)據(jù)解阅,因此跳過第一行

  if flag==1:

  dic={}

  i=0

  for td in tr.find_all('td'):

  dic[name[i]]=td.get_text()

  i+=1

  jsonDump(dic,url[1])#保存數(shù)據(jù)

  flag=1

  ? # 利用find_element_by_link_text方法得到下一頁所在的位置并點擊落竹,點擊后頁面會自動更新,只需要重新獲取driver.page_source即可

  driver.find_element_by_link_text(u"下一頁").click()

  def jsonDump(_json,name):

  """store json data"""

  with open(curpath+'/'+name+'.json','a') as outfile:

  json.dump(_json,outfile,ensure_ascii=False)

  with open(curpath+'/'+name+'.json','a') as outfile:

  outfile.write(',\n')

  if __name__ == '__main__':

  url=['http://datacenter.mep.gov.cn:8099/ths-report/report!list.action?xmlname=1465594312346','yzc']? # yzc為文件名货抄,此處輸入中文會報錯述召,前面加u也不行,只好保存后手動改文件名……

  getData(url)? # 調(diào)用函數(shù)

  本文中獲取下一頁的位置是通過driver.find_element_by_link_text方法來實現(xiàn)的蟹地,這是因為在此網(wǎng)頁中积暖,這個標(biāo)簽沒有唯一可標(biāo)識的id,也沒有class怪与,如果通過xpath定位的話夺刑,第一頁和其他頁的xpath路徑又不完全相同,需要加個if進行判斷分别。因此直接通過link的text參數(shù)進行定位遍愿。click()函數(shù)模擬在瀏覽器中的點擊操作。

  selenium的功能非常強大耘斩,用在爬蟲上能夠解決很多一般爬蟲解決不了的問題沼填,它可以模擬點擊、鼠標(biāo)移動括授,可以提交表單(應(yīng)用如:登陸郵箱賬號坞笙、登陸wifi等,網(wǎng)上有很多實例籍茧,本人暫時還沒有嘗試過)却邓,當(dāng)你遇到一些非常規(guī)的網(wǎng)站數(shù)據(jù)爬取起來非常棘手時院水,不妨嘗試一下selenium+phantomjs。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撬腾,一起剝皮案震驚了整個濱河市恢恼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漓踢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喧半,死亡現(xiàn)場離奇詭異挺据,居然都是意外死亡脖隶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門婉称,熙熙樓的掌柜王于貴愁眉苦臉地迎上來构蹬,“玉大人,你說我怎么就攤上這事瘫筐☆硪Γ” “怎么了肛捍?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵拙毫,是天一觀的道長棺禾。 經(jīng)常有香客問我,道長膘婶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任衅码,我火速辦了婚禮脊岳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奶躯。我一直安慰自己亿驾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布参淹。 她就那樣靜靜地躺著乏悄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪檩小。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天筐付,我揣著相機與錄音瓦戚,去河邊找鬼。 笑死较解,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的印衔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瞎暑,長吁一口氣:“原來是場噩夢啊……” “哼与帆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鲤桥,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤茶凳,失蹤者是張志新(化名)和其女友劉穎播揪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體猪狈,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡雇庙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了寒跳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竹椒。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖书释,靈堂內(nèi)的尸體忽然破棺而出赊窥,到底是詐尸還是另有隱情,我是刑警寧澤锨能,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站叔收,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏饺律。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一脖卖、第九天 我趴在偏房一處隱蔽的房頂上張望巧颈。 院中可真熱鬧,春花似錦砸泛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琢融,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宿亡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工她混, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泊碑,地道東北人。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓臭脓,卻偏偏與公主長得像腹忽,于是被迫代替她去往敵國和親砚作。 傳聞我的和親對象是個殘疾皇子嘹锁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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