pyppeteer与selenium对比
pyppeteer与selenium对比
requests 爬取下来的只能是服务器端网页的源码,这和浏览器渲染以后的页面内容是不一样的。因为,真正的数据是经过 JavaScript 执行后,渲染出来的,数据来源可能是 Ajax,也可能是页面里的某些 Data,或者是一些 ifame 页面等。不过,大多数情况下极有可能是 Ajax 接口获取的。
很多情况我们需要分析 Ajax请求,分析这些接口的调用方式,通过抓包工具或者浏览器的“开发者工具”,找到数据的请求链接,然后再用程序来模拟。但是,抓包分析流的方式,也存在一定的缺点。
一是:因为有些接口带着加密参数,比如 token、sign 等等,模拟难度较大;
二是:抓包的方式只适合量小的情况。如果有一百、一千个,甚至五千、一万个网站要处理时,该如何处理?还一个一个分析数据流?一个一个去抓包吗?
由于Selenium流行已久,现在稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很容易就可以判断出是真人访问还是webdriver。虽然也可以通过中间代理的方式进行js注入屏蔽webdriver检测,但是webdriver对浏览器的模拟操作(输入、点击等等)都会留下webdriver的标记,同样会被识别出来,要绕过这种检测,只有重新编译webdriver,麻烦自不必说,难度不是一般大。
由于Selenium流行已久,现在稍微有点反爬的网站都会对selenium和webdriver进行识别,网站只需要在前端js添加一下判断脚本,很容易就可以判断出是真人访问还是webdriver。虽然也可以通过中间代理的方式进行js注入屏蔽webdriver检测,但是webdriver对浏览器的模拟操作(输入、点击等等)都会留下webdriver的标记,同样会被识别出来,要绕过这种检测,只有重新编译webdriver,麻烦自不必说,难度不是一般大。
学习笔记
基本操作
打开网页
executable_path=r'C:\Users\txmmy\AppData\Local\Google\Chrome\Application\chrome.exe'
browser=await launch(headless=False,executable_path=executable_path)
page=await browser.newPage()
await page.goto('https://www.baidu.com/')
执行pyppeteer:
import asyncio
from pyppeteer import launch
if __name__ == '__main__':
asyncio.get_event_loop().run_until_complete(main())
来个实例
#下拉滚动条
await page.evaluate('window.scrollBy(0,window.innerHeight)')
await asyncio.sleep(random.random() * random.randint(3, 5))
#提取搜索第一页标题、网址链接 #JX evaluate??
title_element = await page.Jx('//*[contains(@class,"result c-container")]//h3/a')
for t in title_element:
title = await page.evaluate('t => t.textContent', t)
link = await (await t.getProperty('href')).jsonValue()
#清空搜索框的关键字
await page.evaluate('document.querySelector("input[id=kw]").value=""')
pager.Jx
page.evaluate
page.getPorperty

浙公网安备 33010602011771号