网站内容抓取工具(SeleniumWeb的自动化测试工具方式启动(汇百家之长,))

优采云 发布时间: 2022-01-03 04:14

  网站内容抓取工具(SeleniumWeb的自动化测试工具方式启动(汇百家之长,))

  © zebra(汇百家掌门人,一人之声)

  

  1.硒介绍

  Selenium 是一个网络自动化测试工具。它最初是为 网站 自动化测试而开发的。它还可以广泛用于动态网络爬虫,尤其是具有严格反作弊做法的网站。动态渲染后的爬虫技术往往可以达到久经考验的效果。

  类似于我们用来玩游戏的按钮精灵,它可以根据指定的命令自动执行。不同的是Selenium可以直接在浏览器上运行,并且支持所有主流浏览器(包括PhantomJS等非接口浏览器)。

  Selenium 可以让浏览器根据我们的指令自动加载页面以获取所需的网页。 Selenium 没有浏览器,不支持浏览器的功能。需要配合第三方浏览器使用。但是我们有时需要让它嵌入到代码中运行,而这些工具如 PhantomJS、Chrome、Firefox。

  PhantomJS 是一个基于 Webkit 的“无头”浏览器。它将 网站 加载到内存中并在页面上执行 JavaScript。因为它不显示图形界面,所以运行起来比一个完整的浏览器效率更高。新版 selenium 不再支持 phantomJS。

  browser = webdriver.PhantomJS()

  Chrome 已经支持 headless”(无头)

  browser = webdriver.Chrome()

  browser = webdriver.Firefox()

  2.安装2.1 安装chrome浏览器

  yum install chromium

查看chrome版本信息

yum list installed | grep chro

chromium.x86_64 85.0.4183.121-1.el7 @epel

chromium-common.x86_64 85.0.4183.121-1.el7 @epel

chrony.x86_64 3.2-2.el7 @anaconda

  2.2 安装chrome驱动

  此时必须与chrome版本一致。下载地址如下

  wget http://chromedriver.storage.googleapis.com/85.0.4183.83/chromedriver_linux64.zip

unzip chromedriver_linux64.zip

sudo mv chromedriver /usr/local/bin

cd /usr/local/bin

sudo chmod a+x chromedriver

chromedriver --version

ChromeDriver 85.0.4183.83 (94abc2237ae0c9a4cb5f035431c8adfb94324633-refs/branch-heads/4183@{#1658})

  2.3 安装硒

  pip3 install selenium

  2.4 测试代码

  from selenium import webdriver

opt = webdriver.ChromeOptions()

# 把chrome设置成无界面模式,不论windows还是linux都可以,自动适配对应参数

opt.set_headless()

#browser = webdriver.Chrome('/usr/local/bin/chromedriver',chrome_options=opt)

browser = webdriver.Chrome(chrome_options=opt)

browser.get('http://www.baidu.com/')

print(browser.title)

browser.quit()

  选项说明

  opt.add_argument('--no-sandbox')#解决DevToolsActivePort文件不存在的报错

opt.add_argument('window-size=1920x3000') #指定浏览器分辨率

opt.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug

opt.add_argument('--hide-scrollbars') #隐藏滚动条, 应对一些特殊页面

opt.add_argument('blink-settings=imagesEnabled=false') #不加载图片, 提升速度

opt.add_argument('--headless') #浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败

opt.binary_location = r"C:\Application\chrome.exe" #手动指定使用的浏览器位置

  3.其他操作3.1 渲染加速3.1.1不加载图片

  options = webdriver.ChromeOptions()

prefs = {

"profile.managed_default_content_settings.images": 2

}

options.add_experimental_option('prefs', prefs)

  3.1.2 Headless模式启动

  Headless Chrome 是 Chrome 浏览器的非接口形式。您无需打开浏览器即可使用 Chrome 支持的所有功能来运行您的程序。与现代浏览器相比,Headless Chrome 更方便测试网页应用、获取网站 的截图、做爬虫抓取信息等。相比早期的 PhantomJS、SlimerJS 等,Headless Chrome 更接近浏览器环境。

  options = webdriver.ChromeOptions()

options.headless = True

  3.2 发起异步请求

  url='http://....'

js = """

var xmlhttp=new XMLHttpRequest();

xmlhttp.open("GET",'%s',false);

xmlhttp.send();

return xmlhttp.responseText;

""" % (url)

resp = self.browser.execute_script(js)

# 需要退出浏览器不然进程依然存在

  3.3 配置等待

  from selenium.webdriver.support.wait import WebDriverWait

wait = WebDriverWait(self.browser, 10, 0.2)

searchipt = wait.until(lambda x: x.find_element_by_id("searchipt"))

# searchipt.send_keys('潇湘府')

# print(searchipt.text)

  3.1 使用代理3.1.1 无密码代理

  from selenium import webdriver

proxy = '127.0.0.1:9743'

chrome_options = webdriver.ChromeOptions()

chrome_options.add_argument('--proxy-server=http://' + proxy)

chrome = webdriver.Chrome(chrome_options=chrome_options)

chrome.get('http://httpbin.org/get')

  3.1.2 带密码的代理

  如果是认证代理的话,设置方法比较麻烦。需要在本地创建 manifest.json 配置文件和 background.js 脚本来设置认证代理,本质上是浏览器代理扩展。

  参考:

  def create_proxy_auth_extension(proxy_host, proxy_port, username, password)

manifest_json = """

{

"version": "1.0.0",

"manifest_version": 2,

"name": "Chrome Proxy",

"permissions": [

"proxy",

"tabs",

"unlimitedStorage",

"storage",

"",

"webRequest",

"webRequestBlocking"

],

"background": {

"scripts": ["background.js"]

},

"minimum_chrome_version":"22.0.0"

}

"""

background_js_template = """

var config = {

mode: "fixed_servers",

rules: {

singleProxy: {

scheme: "http",

host: "%s",

port: parseInt(%s)

},

bypassList: ["localhost"]

}

};

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {

return {

authCredentials: {

username: "%s",

password: "%s"

}

};

}

chrome.webRequest.onAuthRequired.addListener(

callbackFn,

{urls: [""]},

['blocking']

);

"""% (proxy_host, proxy_port, username, password)

with zipfile.ZipFile(plugin_path, 'w') as zp:

zp.writestr("manifest.json", manifest_json)

zp.writestr("background.js", background_js)

  plugin_path = './authProxy@http-dyn.abuyun.9020.zip'

# 添加插件及必要的配置

option = webdriver.ChromeOptions()

option.add_argument('--no-sandbox')

option.add_extension(plugin_path)

# 测试查看效果

driver = webdriver.Chrome(chrome_options=option)

driver.get("https://httpbin.org/ip")

print(driver.page_source)

  3.1.3 认证代理插件运行在非接口环境

  chromedriver在添加认证代理(使用扩展)时无法使用headless的问题。安装插件后,不能直接使用无界面模式运行,可以通过虚拟桌面技术间接实现pyvirtualdisplay。

  yum install Xvfb

pip3 install PyVirtualDisplay

  from pyvirtualdisplay import Display

def __init__(self):

self.display = Display(visible=0, size=(1024, 768))

self.display.start()

.....

def __del__(self):

self.display.stop()

  4.参考手册:

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线