爬虫进阶(四)
總第71篇
01|背景:
前段時間給人填報志愿,無意間發現這個網站的:http://gkcx.eol.cn/soudaxue/queryschoolgufen.html,這個網站整體不錯,會根據生源地、高考分數、和文理科來推薦一些可以報考的學校,但是使用不是很方便,不可以設置多個條件(比如我想把東三省的學校挑出來),只能一個省份一個去點擊。再比如我想要錄取概率在50%以上的學校,同樣也做不到,要是能下載excel中的話可以多條件篩選的,平日里學的爬蟲終于派上用場了。
但是在爬取的過程中發現了一個問題在審查元素中存在的內容但在網頁源代碼中不存在,所以通過request請求得到的response內容中也不存在,導致我們最后在用find_all查找的時候結果為空,于是乎就各種百度終于找到了解決方案,原來是因為我們要查找的數據是通過AJAX來加載的。關于js數據的獲取,發現一篇前人寫的很不錯的文章,現在貼出來:https://sanwen8.cn/p/46fgV6R.html
在之前也寫過一篇關于AJAX加載的數據,上次那一篇是直接通過查找XHR中來獲取js數據:爬蟲進階(一),這次我們用selenium來獲取js數據。
02|明確爬蟲目的:
我想要爬取該網站的學校名字、學校類別、報該學校的風險大小以及錄取概率。
03|獲取目標url:
該網站的網頁構成還是相對簡單,由基礎的網頁域名+一些參數就是目標url。這里有一個重點內容是將字符串轉化為url參數,需要利用urlencode.
base="http://gkcx.eol.cn/soudaxue/queryschoolgufen.html"for i in range(1,10): ?#這里的10根據結果頁數來調整data={ ? ? ? ?"mark":450,"fsxxxS":"山西", ? ? ? ?"examineeType":"理科", ? ? ? "page":i}dated=urllib.parse.urlencode(data)url=base+"?"+dated這里的mark(分數)、fsxxxs(生源地)、examineeType(文科or理科)均可以修改。
04|請求目標url:
這里因為我們需要的數據是通過AJAX加載的,利用request請求不能夠直接得到我們想要的內容(我們想要的數據未加載出來),這里我們利用selenium模擬瀏覽器讓網頁數據全部加載完成(包括我們想要的數據)。
browser = webdriver.Chrome()#創建一個瀏覽器對象 browser.get(url) html=browser.page_source#將selenium加載出來的網頁內容傳遞給html05|解析selenium所獲得的內容:
這里我們還是借助Beautifulsoup庫來進行解析。
06|獲取我們需要的內容:
這里我們利用正則表達式來獲取我們所需要的內容。需要注意的是re.search的被匹配內容需要是字符串,所以用str將soup列表中的內容轉化。
soup1=soup.find_all("tr") for m in range(1,len(soup1),2): ? ? ?result=re.search("<a.*?title=.*?>(\S+)</a>.*?<span>(\S+)</span>.*?<span class=.*?>(\S+)</span>(\S+)</td>",str(soup1[m]))school.append(result.group(1))category.append(result.group(2))risk.append(result.group(3))probability.append(result.group(4))?school、category、risk、probability是用來存放對應值而建立的空列表。最后將這些列表利用pandas進行合并導出為excel即可。可以參考下文:
房天下數據爬取及簡單數據分析
07|本篇的一些重點:
1)將字符串urlencode成url參數。
2)利用selenium對js數據進行加載。
3)利用正則表達式取出想要的多個內容。
總結
- 上一篇: 花脸冯骥才原文赏析 花脸冯骥才原文赏析是
- 下一篇: 快手电商:全年将拿出至少600亿流量激励