苏州免费发布信息网站,制作公众号流程,深圳燃气公司电话,西安微官网自助建站公司继续#xff0c;书接上回#xff0c;这次我通过jsrpc#xff0c;也学会了不少逆向的知识#xff0c;感觉对于一般的网站应该都能应付了。当然我说的是简单的网站#xff0c;遇到那些混淆的#xff0c;还有那种猿人学里面的题目#xff0c;还是免谈了。那种需要的水平太高…继续书接上回这次我通过jsrpc也学会了不少逆向的知识感觉对于一般的网站应该都能应付了。当然我说的是简单的网站遇到那些混淆的还有那种猿人学里面的题目还是免谈了。那种需要的水平太高我学习爬虫的目的也不是找什么工作只是为了找数据能够满足我找数据的需要就好。
现在我的初步问题已经解决了原以为可以使用jsrpc一路搜集数据。可是还是遇到了新的问题。
接下来我想搜集这个网站的志愿服务项目的数据。发现这个网站的请求类型也比较复杂要抓到某一个项目的数据需要多次点击定位到那个项目而且进入项目的新页面好像jsrpc获得的参数也是没什么用的了。
不知道为什么。可以先看一下。 这时我知道这个query应该是也带bean参数。 那么再次截获它的i值就可以使用rpc获得bean参数吧想着时这样的。 这个query地址是/webapi/listProjectsFortisWeb/query
那么我们就找这个请求时的i i值有了可以直接请求了吧。但是结果令人失望 得到的结果一直是固定的那么几个东西。即使换了i换了参数也会得到同样的结果。我也不太明白为什么。可能是网站需要经过几次鼠标点击在点击的过程中请求变了我使用python请求并没有抓到他那个真实的请求。
过程太复杂我想我也研究不出来比不了那些搞网站的。所以眼看又进入了困境。
这时候想到了selenim。虽然一直以来都觉得selenium慢的要死。但是没办法啊我会的能够用的都用的差不多了不会的也学了学的也快吐了。不想再继续搞下去了想着selenium慢就慢吧好歹也是个办法。
browsermobproxy的使用
说干就干 但是还有一个问题就是我怎么能让senenium返回给我一个json也就是一个动态网站返回给我的东西我怎么截取这个json。selenium一旦渲染出来就是一个网页元素了。怎么抓取到服务器发给我的json呢。
这时候看到知乎上一个帖子介绍了browsermobproxy。感觉可以用就试了一下。
确实可以。简单来说这个库就是相当于一个python版的fiddler只不过fiddler是集成在一个软件里面python调用不方便。但是这个库直接安装到python里面就可以了。简单
直接pip install就可以。
然后我也放弃了使用rpc方法直接使用python模拟鼠标点击。 简单粗暴。就是慢点。
直接上代码
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(rE:\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_pathrvenv/Scripts/chromedriver-win64/chromedriver.exe, optionschrome_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没有发现内容)
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()芝罘区])), u没有发现内容)
item2 driver.find_element_by_xpath(//a[text()芝罘区])
item2.click()ele WebDriverWait(driver, 10, 0.2).until(EC.visibility_of_element_located((By.XPATH, u//div//a[text()已结项])), u没有发现内容)
item3 driver.find_element_by_xpath(//a[text()已结项])
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()已结项])), u没有发现内容)
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[classtable-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, encodingutf-8) as f:f.write(json.dumps(list1, ensure_asciiFalse))
# 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, encodingutf-8) as f:f.write(json.dumps(list1, ensure_asciiFalse))
代码也没怎么整理大致的意思就是使用selenium呼出浏览器然后在浏览器里面一步步找到我想要的东西最后把这些所有的包存放到一个har里面。后期在筛选har提取我想要的信息。
发现这个也是很无敌的直接免去了反反爬措施。因为就是浏览器除非网站对webdriver有检测不然也没办法。就老老实实的一个一个爬吧。