1. 程式人生 > >selenium自動翻頁抓取保監會資料

selenium自動翻頁抓取保監會資料

一、背景:

在抓取保監會官網產品檢索頁面下的所屬公司,產品名稱,備案日期,險種時,頁面較多需要翻頁抓取,經分析,在點選下一頁,網頁的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()