1、无头浏览器(headless browser)是什么

无头浏览器是指可以在图形界面情况下运行的,可以模拟多种浏览器的运行框架。研发可以通过编程来控制该框架执行各种任务,模拟真实的浏览器操作和各种任务,例如登录、js解析、ajax动态生成、获取cookie等。

2、无头浏览器适合的场景

无头浏览器的框架需要真实运行浏览器,因此系统开销大,采集运行速度慢,相对与一般的爬虫程序,其运行环境要求搭建的工具和库较多,因此如果目标网站反爬不是很难,可以直接通过简单的http请求进行采集,不适合使用无头浏览器方案。

当目标网站有多种验证机制,例如需要验证登录、ajax动生成、js反爬策略,如果研发不能进行网站行为分析的情况下,建议使用无头浏览器伪装正常用户,同时配合使用爬虫代理加强版进行数据采集。

3、无头浏览器框架推荐

无头浏览器有很多,我们推荐如下:

selenium+chrome+chrome driver+爬虫代理加强版

4、下面示例包括各种安装说明及代码

(1)下载chrome对应版本的chrome deriver

下载chrome https://www.google.com/chrome/

下载对应版本 driver https://chromedriver.chromium.org/downloads

注意chrome的版本和deriver的版本一定需要一致,可以查看具体的帮助说明,如果不一致,即使程序能够运行,也会出现爬虫代理认证信息失败,需要弹窗要求手动输入认证信息的问题。

(2)设置开发者模式

如果浏览器正常运行下,navigator.webdriver的值应该是undefined或者false,如果为true目标网站能检测到selenium,设置为开发者模式,可以防止目标网站识别

实例

fromselenium.webdriverimportChromeOptionsoption=ChromeOptions()option.add_experimental_option('excludeSwitches',['enable-automation'])#开启实验性功能browser=webdriver.Chrome(options=option)#修改get方法script='''Object.defineProperty(navigator,'webdriver',{get:()=>undefined})'''browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":script})

(3)配合使用爬虫代理加强版

通过无头浏览器模拟用户操作,同时结合爬虫代理加强版实现IP地址自动切换,可以真实的实现用户终端请求,获取相应的数据,下面是获取cookie的代码:

实例

importosimporttimeimportzipfilefromseleniumimportwebdriverfromselenium.common.exceptionsimportTimeoutExceptionfromselenium.webdriver.common.byimportByfromselenium.webdriver.supportimportexpected_conditionsasECfromselenium.webdriver.support.uiimportWebDriverWaitclassGenCookies(object):#随机useragentUSER_AGENT=open('useragents.txt').readlines()#代理服务器(产品官网www.16yun.cn)PROXY_HOST='t.16yun.cn'#proxyorhostPROXY_PORT=31111#portPROXY_USER='USERNAME'#usernamePROXY_PASS='PASSWORD'#password@classmethoddefget_chromedriver(cls,use_proxy=False,user_agent=None):manifest_json="""{"version":"1.0.0","manifest_version":2,"name":"ChromeProxy","permissions":["proxy","tabs","unlimitedStorage","storage","<all_urls>","webRequest","webRequestBlocking"],"background":{"scripts":["background.js"]},"minimum_chrome_version":"22.0.0"}"""background_js="""varconfig={mode:"fixed_servers",rules:{singleProxy:{scheme:"http",host:"%s",port:parseInt(%s)},bypassList:["localhost"]}};chrome.proxy.settings.set({value:config,scope:"regular"},function(){});functioncallbackFn(details){return{authCredentials:{username:"%s",password:"%s"}};}chrome.webRequest.onAuthRequired.addListener(callbackFn,{urls:["<all_urls>"]},['blocking']);"""%(cls.PROXY_HOST,cls.PROXY_PORT,cls.PROXY_USER,cls.PROXY_PASS)path=os.path.dirname(os.path.abspath(__file__))chrome_options=webdriver.ChromeOptions()#关闭webdriver的一些标志#chrome_options.add_experimental_option('excludeSwitches',['enable-automation'])ifuse_proxy:pluginfile='proxy_auth_plugin.zip'withzipfile.ZipFile(pluginfile,'w')aszp:zp.writestr("manifest.json",manifest_json)zp.writestr("background.js",background_js)chrome_options.add_extension(pluginfile)ifuser_agent:chrome_options.add_argument('--user-agent=%s'%user_agent)driver=webdriver.Chrome(os.path.join(path,'chromedriver'),chrome_options=chrome_options)#修改webdriverget属性#script='''#Object.defineProperty(navigator,'webdriver',{#get:()=>undefined#})#'''#driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument",{"source":script})returndriverdef__init__(self,username,password):#登录example网站self.url='https://passport.test.cn/signin/login?entry=example&r=https://m.test.cn/'self.browser=self.get_chromedriver(use_proxy=True,user_agent=self.USER_AGENT)self.wait=WebDriverWait(self.browser,20)self.username=usernameself.password=passworddefopen(self):"""打开网页输入用户名密码并点击:return:None"""self.browser.delete_all_cookies()self.browser.get(self.url)username=self.wait.until(EC.presence_of_element_located((By.ID,'loginName')))password=self.wait.until(EC.presence_of_element_located((By.ID,'loginPassword')))submit=self.wait.until(EC.element_to_be_clickable((By.ID,'loginAction')))username.send_keys(self.username)password.send_keys(self.password)time.sleep(1)submit.click()defpassword_error(self):"""判断是否密码错误:return:"""try:returnWebDriverWait(self.browser,5).until(EC.text_to_be_present_in_element((By.ID,'errorMsg'),'用户名或密码错误'))exceptTimeoutException:returnFalsedefget_cookies(self):"""获取Cookies:return:"""returnself.browser.get_cookies()defmain(self):"""入口:return:"""self.open()ifself.password_error():return{'status':2,'content':'用户名或密码错误'}cookies=self.get_cookies()return{'status':1,'content':cookies}if__name__=='__main__':result=GenCookies(username='180000000',password='16yun',).main()print(result)

更多相关文章

  1. 开发工具使用
  2. 开学第一课
  3. 编辑器VSCod的安装和http协议的理解
  4. 对http协议的请求与响应过程的理解
  5. python爬虫采集企查查数据
  6. 同为Chromium浏览器,Edge却被“特别关照”
  7. 面试官不讲码德,问我Chrome浏览器的渲染原理(6000字长文)
  8. Chrome团队:2020年了,浏览器兼容性还是一个大问题
  9. lynx浏览器的使用教程

随机推荐

  1. 抽屉类
  2. Android(安卓)中访问SDCARD
  3. Android Framework系统服务详解
  4. 转载:Android之PreferenceActivity
  5. Android 修改EditText的光标颜色和背景色
  6. android 实用代码片段整理
  7. 使用Eclipse+ADT开发android 1.5程序
  8. Android网络游戏之神农诀项目开发--视频
  9. 如何利用ant成生开源中的android初始环境
  10. Gradle sync failed: Cause: error in op