最近需要从Veer网站上爬一些图,于是去研究了一下,这个网站有时候会出现滑动验证,出现情况不明,试了好几种方法都无法爬取,在此记录一下。
1.Request
用request请求,返回的是滑动验证界面,试着调整request body之类的参数也无效,用Fillter发送过去也是滑动验证洁界面。卒
2.Selenium
后来改用selenium,第一次测试,成功打开网页,获取到数据,以为成功了。在我把代码完善之后,再次测试发现,又出现了滑动验证的界面,且滑条下方有Error,手动滑无效。后面进行多次尝试,比如一些防止selenium被检测的手段,都没有用。后面换了一次ip(用手机热点),第一次成功,之后依旧出现之前的情况,猜测是有新的检测selenium手段,第一次请求发送过去被检测到了,于是后面就出现了滑动验证。卒
3.之前的代码
在网上搜了一下别人写的的Veer网站的爬虫,试了一下都不行。卒
4.Pyppeteer
用Pyppeteer可以正常的打开滑动界面,手动滑有效,可以进去,接下来需要解决滑动验证的问题,加入滑动验证功能后,进行测试,前面几次均成功进入,获取到数据,高兴没多久,可能是又被检测到了,用pyppeteer进行滑动失效,必须手动滑才能进去,猜测可能是有滑动速度检测,于是加入滑动速度调整的功能,仍然是无法进入。卒。放弃。
Pyppeteer的代码如下:
###selenium的代码
# from selenium import webdriver
# import time,re,requests,os,json
# from bs4 import BeautifulSoup
# from selenium.webdriver.chrome.options import Options
# from selenium import webdriver
# from selenium.webdriver import ChromeOptions
# browser = webdriver.Chrome()
# browser.get('https://www.veer.com/search-image/yazhouren/?sort=best&page=5')
###Pyppeteer的代码
import asyncio,time
import random
from pyppeteer import launch
from pyquery import PyQuery as pq
url = 'https://www.veer.com/search-image/yazhouren/?sort=best&page=5'
async def fetchUrl(url):
browser = await launch({'headless': False, 'dumpio': True, 'autoClose': False})
page = await browser.newPage()
await page.setViewport(viewport={'width': 1280, 'height': 1280})#调整网页大小
await page.evaluateOnNewDocument('() =>{ Object.defineProperties(navigator,'
'{ webdriver:{ get: () => false } }) }')
await page.goto(url)
time.sleep(1)
###滑动验证功能
# 将鼠标移动到滑块上,slide_id是滑块的位置
#网页中:<span id="nc_1_n1z" class="nc_iconfont btn_slide" style="left: 0px;"></span>
slide_id='span#nc_1_n1z'
await page.hover(slide_id)
# 2 按下鼠标
await page.mouse.down()
# 3 滑动
move_x=0
move_y=0
for i in range(10):#每滑动一段,随机停一会儿
move_x_random=random.randint(100,500)
move_y_random=random.randint(0,50)
move_x+=move_x_random
move_y+=move_y_random
sleep_random=random.uniform(0,0.2)
# print(move_x,move_y)
await page.mouse.move(move_x, move_y)
time.sleep(sleep_random)
# 4 松开鼠标
await page.mouse.up()
time.sleep(1)
print('HTML:', await page.content())
asyncio.get_event_loop().run_until_complete(fetchUrl(url))
怀疑这个网站用了AI反爬?如果有大佬解决了这个问题,请一定评论告诉我。。。。。