selenium自動翻頁抓取保監會資料
阿新 • • 發佈:2018-12-19
一、背景:
在抓取保監會官網產品檢索頁面下的所屬公司,產品名稱,備案日期,險種時,頁面較多需要翻頁抓取,經分析,在點選下一頁,網頁的url沒有任何變化,只是用js去載入了新的資料,然後動態地改變了table裡面的資料。這可和本菜以前爬的頁面可不一樣,所以這次要想辦法模擬翻頁,然後重新讀取新的html程式碼,再去解析。
實現翻頁可以有兩種辦法,第一種是分析js的實現來模擬翻頁。翻頁操作實際上js向後臺發出了請求,這裡肯定是帶著跳轉的目的頁碼請求了後臺,然後拿到新資料後重新渲染了html的表格部分。這種方法會更加高效,但難度也會更大一些。因為如果你已經能夠模擬請求了,那其實相當於你連人家的伺服器介面都已經知道了,那麼進一步分析下響應就可以拿到結果了,這甚至不需要再去分析html程式碼了是不是?第二種比較簡單暴力,也是我這裡用的方法,那就是模擬點選網頁中的下一頁按鈕,然後重新讀取html程式碼來解析。
二,思路
在前面已經說了,這裡把思路流程化:
1.開啟網頁 2.讀取當前頁面的html程式碼,解析列表裡面的明星名字 3.模擬點選“下一頁” 4.重複第2步的工作,直到頁面裡沒有“下一頁”的按鈕
在這裡開啟網頁和讀取網頁的html程式碼,是通過selenium實現的; selenium可直接拿到原始碼,我就直接正則將它匹配出來了,就沒有通過beautifulsoup解析html程式碼
三、實現
這裡需安裝: 1.selenium 2.與Chrome版本對應的chromedriver
四、分析資料來源
import requests
import re
from bs4 import BeautifulSoup
url = 'http://bxjg.circ.gov.cn/tabid/6532/Default.aspx'
res = requests.get(url)
html = res.text
soup = BeautifulSoup(html, 'html.parser')
#print(soup)
for results in soup:
results = str(results)
results = re.findall(r'<td align="left">(.*?)<\/td><td align="left">(.*?)<\/td><td align="center">(.*?)<\/td><td align="center">(.*?)<\/td><td align="center">' ,html)
#results = re.findall(r'<span class="l1">\d+</span>.*?title="(.*?)">.*?data-popper="\d+" data-poptype="1" href="(.*?)" target="_blank">(.*?)</a><input.*? class="l5">(.*?)</span>', html)
for result in results:
#print(result)
a = (result[0],result[1],result[2],result[3])
print(a)
五、程式碼
import re
import time
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
url = 'http://bxjg.circ.gov.cn/tabid/6532/Default.aspx'
driver = webdriver.Chrome('E:\python\Scripts\chromedriver.exe') # 建立一個driver用於開啟網頁,記得找到brew安裝的chromedriver的位置,在建立driver的時候指定這個位置
driver.get(url) # 開啟網頁
page = 0
while page < 50: # 共12964頁,這裡是手工指定的
WebDriverWait(driver, 15, 0.5).until(EC.presence_of_element_located((By.ID, 'ess_ctr16659_SearchRecordProduct_wuPager_lbtnNextPage')))
# 設定顯性等待
results = re.findall(r'<td align="left">(.*?)</td><td align="left">(.*?)</td><td align="center">(.*?)</td><td align="center">(.*?)</td><td align="center">',driver.page_source)
for result in results:
print(result[0], result[1], result[2], result[3])
driver.find_element_by_id("ess_ctr16659_SearchRecordProduct_wuPager_lbtnNextPage").click() # selenium的xpath用法,找到包含下一頁的標籤去點選
page = page + 1
time.sleep(2) # 睡2秒讓網頁載入完再去讀它的html程式碼
driver.quit()