企業(yè)信用信息公示系統(tǒng)福建谷歌優(yōu)化技巧
繼續(xù),書(shū)接上回,這次我通過(guò)jsrpc,也學(xué)會(huì)了不少逆向的知識(shí),感覺(jué)對(duì)于一般的網(wǎng)站應(yīng)該都能應(yīng)付了。當(dāng)然我說(shuō)的是簡(jiǎn)單的網(wǎng)站,遇到那些混淆的,還有那種猿人學(xué)里面的題目,還是免談了。那種需要的水平太高,我學(xué)習(xí)爬蟲(chóng)的目的也不是找什么工作,只是為了找數(shù)據(jù),能夠滿足我找數(shù)據(jù)的需要就好。
現(xiàn)在我的初步問(wèn)題已經(jīng)解決了,原以為可以使用jsrpc一路搜集數(shù)據(jù)。可是還是遇到了新的問(wèn)題。
接下來(lái)我想搜集這個(gè)網(wǎng)站的志愿服務(wù)項(xiàng)目的數(shù)據(jù)。發(fā)現(xiàn)這個(gè)網(wǎng)站的請(qǐng)求類(lèi)型也比較復(fù)雜,要抓到某一個(gè)項(xiàng)目的數(shù)據(jù),需要多次點(diǎn)擊,定位到那個(gè)項(xiàng)目,而且進(jìn)入項(xiàng)目的新頁(yè)面,好像jsrpc獲得的參數(shù)也是沒(méi)什么用的了。
不知道為什么??梢韵瓤匆幌隆?/p>
這時(shí),我知道這個(gè)query應(yīng)該是也帶bean參數(shù)。
?那么再次截獲它的i值,就可以使用rpc,獲得bean參數(shù)吧,想著時(shí)這樣的。
這個(gè)query,地址是:/webapi/listProjectsFortisWeb/query
那么我們就找這個(gè)請(qǐng)求時(shí)的i
?i值有了,可以直接請(qǐng)求了吧。但是結(jié)果令人失望
得到的結(jié)果一直是固定的那么幾個(gè)東西。即使換了i,換了參數(shù),也會(huì)得到同樣的結(jié)果。我也不太明白為什么??赡苁蔷W(wǎng)站需要經(jīng)過(guò)幾次鼠標(biāo)點(diǎn)擊,在點(diǎn)擊的過(guò)程中,請(qǐng)求變了,我使用python請(qǐng)求,并沒(méi)有抓到他那個(gè)真實(shí)的請(qǐng)求。
過(guò)程太復(fù)雜,我想我也研究不出來(lái),比不了那些搞網(wǎng)站的。所以眼看又進(jìn)入了困境。
這時(shí)候,想到了selenim。雖然一直以來(lái)都覺(jué)得selenium慢的要死。但是沒(méi)辦法啊,我會(huì)的,能夠用的都用的差不多了,不會(huì)的也學(xué)了,學(xué)的也快吐了。不想再繼續(xù)搞下去了,想著selenium慢就慢吧,好歹也是個(gè)辦法。
browsermobproxy的使用
說(shuō)干就干,?但是還有一個(gè)問(wèn)題,就是我怎么能讓senenium返回給我一個(gè)json,也就是一個(gè)動(dòng)態(tài)網(wǎng)站返回給我的東西,我怎么截取這個(gè)json。selenium一旦渲染出來(lái),就是一個(gè)網(wǎng)頁(yè)元素了。怎么抓取到服務(wù)器發(fā)給我的json呢。
這時(shí)候看到知乎上一個(gè)帖子介紹了browsermobproxy。感覺(jué)可以用,就試了一下。
確實(shí)可以。簡(jiǎn)單來(lái)說(shuō),這個(gè)庫(kù)就是相當(dāng)于一個(gè)python版的fiddler,只不過(guò)fiddler是集成在一個(gè)軟件里面,python調(diào)用不方便。但是這個(gè)庫(kù)直接安裝到python里面就可以了。簡(jiǎn)單
直接pip install就可以。
然后我也放棄了使用rpc方法,直接使用python模擬鼠標(biāo)點(diǎn)擊。
?簡(jiǎn)單粗暴。就是慢點(diǎn)。
直接上代碼,
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()="煙臺(tái)市"]')), u'沒(méi)有發(fā)現(xiàn)內(nèi)容')
item = driver.find_element_by_xpath("//div//a[text()='煙臺(tái)市']")
item.click()ele = WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u'//div//a[text()="芝罘區(qū)"]')), u'沒(méi)有發(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é)項(xiàng)"]')), u'沒(méi)有發(fā)現(xiàn)內(nèi)容')
item3 = driver.find_element_by_xpath("//a[text()='已結(jié)項(xiàng)']")
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é)項(xiàng)"]')), u'沒(méi)有發(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()='時(shí)長(zhǎng)公示']")
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()='下一頁(yè)']")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))
代碼也沒(méi)怎么整理,大致的意思就是使用selenium呼出瀏覽器,然后在瀏覽器里面一步步找到我想要的東西,最后把這些所有的包存放到一個(gè)har里面。后期在篩選har,提取我想要的信息。
發(fā)現(xiàn)這個(gè)也是很無(wú)敵的,直接免去了反反爬措施。因?yàn)榫褪菫g覽器,除非網(wǎng)站對(duì)webdriver有檢測(cè),不然也沒(méi)辦法。就老老實(shí)實(shí)的一個(gè)一個(gè)爬吧。