继续上一个爬虫,所以说selenium加browsermobproxy

继续,书接上回,这次我通过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(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'没有发现内容')
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[@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,提取我想要的信息。

发现这个也是很无敌的,直接免去了反反爬措施。因为就是浏览器,除非网站对webdriver有检测,不然也没办法。就老老实实的一个一个爬吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/107684.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python-爬虫-urllib3

导入模块 import urllib3urllib3:功能强大、条理清晰、用于HTTP客户端的python网络请求库 重要特征 1.线程安全 2.连接池 3.客户端SSL/TLS验证 4.使用分段编码长传文件 5.重试请求和处理HTTP复位的助手 6.支持gzip和deflate编码 7.HTTP和SOCKS的代理支持 8.100%的…

【Linux网络】TCP/IP三次握手、四次挥手流程

目录 一、三次握手,建立连接 二、四次挥手,断开连接 三、主要字段 1、标志位(Flags) 2、序号(sequence number) 3、确认号(acknowledgement number) 四、三次握手的报文变化 五…

linux 查看进程的几个方法

linux 查看进程的几个方法 一、ps aux a:显示当前终端下的所有进程信息,包括其他用户的进程。 u:使用以用户为主的格式输出进程信息。 x:显示当前用户在所有终端下的进程。 ps命令用于报告当前系统的进程状态。可以搭配kill指…

【网络编程】深入理解TCP协议一(三次握手四次挥手、标记位、确认应答机制、超时重传机制)

TCP协议 1.三次握手四次挥手2.TCP协议段格式3.标记位介绍4.确认应答机制5.超时重传机制 1.三次握手四次挥手 当客户端发起连接请求时,SYN需要被设置位1,告诉服务器客户端希望建立一个链接服务器收到响应之后会回复 SYNACK,表示确认了客户端地…

基于SSM的海鲜自助餐厅系统的设计与实现

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

如何实现一个数据库的 UDF?图数据库 NebulaGraph UDF 功能背后的设计与思考

大家好,我是来自 BOSS直聘的赵俊南,主要负责安全方面的图存储相关工作。作为一个从 v1.x 用到 v3.x 版本的忠实用户,在见证 NebulaGraph 发展的同时,也和它一起成长。 BOSS直聘和 NebulaGraph 关于 NebulaGraph 在 BOSS直聘的应…

手搓消息队列【RabbitMQ版】

什么是消息队列? 阻塞队列(Blocking Queue)-> 生产者消费者模型 (是在一个进程内)所谓的消息队列,就是把阻塞队列这样的数据结构,单独提取成了一个程序,进行独立部署~ --------&…

C++之智能指针shared_ptr死锁问题(二百)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

芯科蓝牙BG27开发笔记4-SSV5 IDE的使用

1. 如何转移工作区的项目文件到新的文件夹,并且可以继续使用ssv5编辑、编译? 从默认的工作区将目标工程整体拷贝出来 目标文件夹: 进入ssv5点击导入工程,并选择目标文件夹 继续下一步,修改项目文件夹所在位置为其源码…

零代码编程:用ChatGPT批量删除文件标题中的字符

文件夹中有上百个文件,现在希望删除包括这些字符的文件标题: TIMESAVER EDIT - TIMESAVER EDIT - FULL Q&A Warren Buffett Charlie Munger TIMESAVER EDIT TIMESAVER EDIT FULL Q&A Warren Buffett Charlie Munger 在ChatGPT中输入提示词&…

谷粒商城篇章6 ---- P193-P210 ---- 异步线程池商品详情【分布式高级篇三】

目录 1. 异步 1.1 初始化线程的 4 种方式 1.1.1 继承 Thread 1.1.2 实现 Runnable 接口 1.1.3 实现 Callable 接口 FutureTask 1.1.4 线程池 1.1.5 以上 4 种方式总结: 1.2 线程池详解 1.2.1 初始化线程池的 2 种方式 1.2.1.1 使用 Executors 创建 1.2…

Java——》synchronized互斥性

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…