企業(yè)信用信息公示系統(tǒng)福建谷歌優(yōu)化技巧
繼續(xù),書接上回,這次我通過jsrpc,也學(xué)會了不少逆向的知識,感覺對于一般的網(wǎng)站應(yīng)該都能應(yīng)付了。當(dāng)然我說的是簡單的網(wǎng)站,遇到那些混淆的,還有那種猿人學(xué)里面的題目,還是免談了。那種需要的水平太高,我學(xué)習(xí)爬蟲的目的也不是找什么工作,只是為了找數(shù)據(jù),能夠滿足我找數(shù)據(jù)的需要就好。
現(xiàn)在我的初步問題已經(jīng)解決了,原以為可以使用jsrpc一路搜集數(shù)據(jù)??墒沁€是遇到了新的問題。
接下來我想搜集這個網(wǎng)站的志愿服務(wù)項目的數(shù)據(jù)。發(fā)現(xiàn)這個網(wǎng)站的請求類型也比較復(fù)雜,要抓到某一個項目的數(shù)據(jù),需要多次點擊,定位到那個項目,而且進(jìn)入項目的新頁面,好像jsrpc獲得的參數(shù)也是沒什么用的了。
不知道為什么??梢韵瓤匆幌?。
這時,我知道這個query應(yīng)該是也帶bean參數(shù)。
?那么再次截獲它的i值,就可以使用rpc,獲得bean參數(shù)吧,想著時這樣的。
這個query,地址是:/webapi/listProjectsFortisWeb/query
那么我們就找這個請求時的i
?i值有了,可以直接請求了吧。但是結(jié)果令人失望
得到的結(jié)果一直是固定的那么幾個東西。即使換了i,換了參數(shù),也會得到同樣的結(jié)果。我也不太明白為什么??赡苁蔷W(wǎng)站需要經(jīng)過幾次鼠標(biāo)點擊,在點擊的過程中,請求變了,我使用python請求,并沒有抓到他那個真實的請求。
過程太復(fù)雜,我想我也研究不出來,比不了那些搞網(wǎng)站的。所以眼看又進(jìn)入了困境。
這時候,想到了selenim。雖然一直以來都覺得selenium慢的要死。但是沒辦法啊,我會的,能夠用的都用的差不多了,不會的也學(xué)了,學(xué)的也快吐了。不想再繼續(xù)搞下去了,想著selenium慢就慢吧,好歹也是個辦法。
browsermobproxy的使用
說干就干,?但是還有一個問題,就是我怎么能讓senenium返回給我一個json,也就是一個動態(tài)網(wǎng)站返回給我的東西,我怎么截取這個json。selenium一旦渲染出來,就是一個網(wǎng)頁元素了。怎么抓取到服務(wù)器發(fā)給我的json呢。
這時候看到知乎上一個帖子介紹了browsermobproxy。感覺可以用,就試了一下。
確實可以。簡單來說,這個庫就是相當(dāng)于一個python版的fiddler,只不過fiddler是集成在一個軟件里面,python調(diào)用不方便。但是這個庫直接安裝到python里面就可以了。簡單
直接pip install就可以。
然后我也放棄了使用rpc方法,直接使用python模擬鼠標(biāo)點擊。
?簡單粗暴。就是慢點。
直接上代碼,
import json
import os
import requests
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from browsermobproxy import Server
from selenium.webdriver.chrome.options import Options
import timeserver = Server(r'E:\code\codeForArticle2023\sdzyfw2\sdzyfw2.0\browsermob-proxy-2.1.4\bin\browsermob-proxy.bat')
server.start()
proxy = server.create_proxy()
print(proxy.proxy)
proxy.new_har("my_baidu", options={"captureHeaders": True, "captureContent":True})chrome_options = Options()
chrome_options.add_argument('--proxy-server={0}'.format(proxy.proxy))
chrome_options.add_argument('--ignore-certificate-errors')
chrome_options.add_experimental_option("excludeSwitches", ["ignore-certificate-errors"])driver = webdriver.Chrome(executable_path=r'venv/Scripts/chromedriver-win64/chromedriver.exe', options=chrome_options)
driver.get("http://sd.chinavolunteer.mca.gov.cn/subsite/shandong/project")ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="煙臺市"]')), u'沒有發(fā)現(xiàn)內(nèi)容')
item = driver.find_element_by_xpath("//div//a[text()='煙臺市']")
item.click()ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="芝罘區(qū)"]')), u'沒有發(fā)現(xiàn)內(nèi)容')
item2 = driver.find_element_by_xpath("//a[text()='芝罘區(qū)']")
item2.click()ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="已結(jié)項"]')), u'沒有發(fā)現(xiàn)內(nèi)容')
item3 = driver.find_element_by_xpath("//a[text()='已結(jié)項']")
item3.click()try:WebDriverWait(driver, 10).until(EC.presence_of_element_located(By.CSS_SELECTOR, "div.panel-card"))except Exception as e:doNthing = e# ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="已結(jié)項"]')), u'沒有發(fā)現(xiàn)內(nèi)容')
panels = driver.find_elements_by_css_selector(".panel-card")
p1 = panels[0]link = p1.find_element_by_css_selector('h2')
link.click()win_hans = driver.window_handles
driver.switch_to.window(win_hans[-1])shijian = driver.find_element_by_xpath("//span[text()='時長公示']")
shijian.click()table = driver.find_element_by_xpath("//table[@class='table-list']")
trs = table.find_elements_by_xpath('//tbody//tr')
len(trs)if len(trs) == 13:page = driver.find_element_by_xpath("//a[text()='下一頁']")page.textpage.click()
else:pass# driver.close()result = proxy.harwith open("sdzyfw2/sdzyfw2.0/har_all.json", 'w', encoding='utf-8') as f:f.write(json.dumps(list1, ensure_ascii=False))
# print(str(result))list1 =[]
for rs in result['log']['entries']:if "china" in rs['request']['url']:if "chinavolunteer" in rs['request']['url']:print(rs['request']['url'])# response = rs['response']list1.append(rs)with open("sdzyfw2/sdzyfw2.0/har.json", 'w', encoding='utf-8') as f:f.write(json.dumps(list1, ensure_ascii=False))
代碼也沒怎么整理,大致的意思就是使用selenium呼出瀏覽器,然后在瀏覽器里面一步步找到我想要的東西,最后把這些所有的包存放到一個har里面。后期在篩選har,提取我想要的信息。
發(fā)現(xiàn)這個也是很無敵的,直接免去了反反爬措施。因為就是瀏覽器,除非網(wǎng)站對webdriver有檢測,不然也沒辦法。就老老實實的一個一個爬吧。