前面介绍了Seleniums的入门应用,现在为大家介绍它的一个插件Selenium Wire。现如今部分网站都设置了反爬机制,常见的就是在接口请求头中有js代码生成的请求参数,那么一般通过js破解参数难度较大,于是就可以借助Selenium Wire来获取解析后的参数,可以实现这样一个功能
Selenium Wire扩展了Selenium的Python绑定,使您能够访问浏览器发出的底层请求。您以与使用Selenium相同的方式编写代码,但是您获得了额外的api,用于检查请求和响应,并动态地对它们进行更改。
Selenium Wire的工作原理是将浏览器流量重定向到它在后台运行的内部代理服务器。当请求流经代理服务器时,它们被拦截和捕获。捕获请求可能会使事情变慢,但你可以做一些事情来限制被捕获的内容。
from seleniumwire import webdriver # Import from seleniumwire
# Create a new instance of the Chrome driver
driver = webdriver.Chrome()
# Go to the Google home page
driver.get('https://www.google.com')
# Access requests via the `requests` attribute
for request in driver.requests:
if request.response:
print(
request.url,
request.response.status_code,
request.response.headers['Content-Type']
)
Prints:
https://www.google.com/ 200 text/html; charset=UTF-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png 200 image/png
https://consent.google.com/status?continue=https://www.google.com&pc=s×tamp=1531511954&gl=GB 204 text/html; charset=utf-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 200 image/png
https://ssl.gstatic.com/gb/images/i2_2ec824b0.png 200 image/png
https://www.google.com/gen_204?s=webaft&t=aft&atyp=csi&ei=kgRJW7DBONKTlwTK77wQ&rt=wsrt.366,aft.58,prt.58 204 text/html; charset=UTF-8
...
可以看到遍历返回了请求的URL,以及状态码和Content-Type值,那么我将通过一个小案例来实现。
通过某网站的数据接口来获取请求的接口的headers。下面这个网站就设有反爬机制,通过接口看到有数据返回。
经过我的反复测试观察发现在它的请求headers中有一个参数名为ehsy-verify的字段。
通过postman POST请求方式模拟请求这个接口发现只有带上这个参数值才能够正常的返回得到数据。这样的话就得出这是一个JS加密后的参数,按照以往正常的方法就得去找到对应的JS代码逆向解析出它是怎样产生的,过程比较复杂,难度较大,那么现在就可以借用Selenium Wire来获取的得到这个接口的请求headers,ehsy-verify的值就在headers中。代码实现如下:
from selenium.webdriver.chrome.options import Options as ChromeOptions
from seleniumwire import webdriver
def getweb():
chrome_options = ChromeOptions()
chrome_options.add_argument('--headless') # 配置对象添加开启无界面模式的命令
chrome_options.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
chrome_options.add_argument('window-size=1920x1080') # 指定浏览器分辨率
chrome_options.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug # 禁用GPU加速
chrome_options.add_argument('--start-maximized') # 浏览器最大化
chrome_options.add_argument(
'--user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36"') # 设置请求头的User-Agent
chrome_options.add_argument('--incognito') # 隐身模式(无痕模式)
browser = webdriver.Chrome(
executable_path='C:\Program Files\Google\Chrome\Application\chromedriver.exe',
options=chrome_options
)
return browser
def get_headers():
browser = getweb()
browser.get('https://xxxxxxxxxxxxxxxxxxxxx/index?catId=2249&parentId=2961&name=%E7%BB%BC%E5%90%88%E5%A5%97%E8%A3%85')
for requests in browser.requests:
if requests.headers["ehsy-verify"] != None :
token = requests.headers["ehsy-verify"]
get_headers()
从上面的代码可以看出也涉及到了selenium的一些基础应用,对seleniumwire 的使用就涉及几行简短的代码,对比去通过逆向解析js代码而言就显得非常的简单了。可以看到最后得到了ehsy-verify的结果,在后续的爬取数据中用到这个ehsy-verify值时就可以直接使用,当然这个值也是具有一定的实效性的,当然你也可以编写定时程序去运行脚本得到它的值。
通过一个简单的小例子实现了接口的请求的拦截,除此之外,它还可以实现请求对象、响应对象、添加请求头、替换已存在的请求头、添加响应头、增加请求参数、在POST请求体中更新JSON等操作。如果大家感兴趣的话后序在继续分享更新。