selenium与Chrome Headless的基本用法

selenium

通过写代码去操作浏览器,模拟人在用浏览器
是一个Python的一个第三方库,对外提供的接口可以操作你的浏览器,然后让浏览器完成自动化操作

基本函数:

find_element_by_id 根据id找节点
find_elements_by_link_text 根据链接内容查找对象
find_elements_by_xpath 根据xpath查找
find_elements_by_tag_name 根据标签名来找
find_elements_by_class_name 根据class名字查找
find_elements_by_css_selector 根据选择器查找
get\send_keys\click 进入网址 \ post请求 \ 点击操作
quit() 关闭浏览器
execute_script( js信息 ) 发送script信息
page_source 查看页面源码

示例:

1、模拟使用百度搜索:

# PhantomJS 是一款无界面浏览器,selenium + PhantomJS是爬虫的终极解决方案
# 但是PhantomJS自从18年就停更了,所以只能用Google Headless来代替
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
# 启动无头模式,实际上是用命令行来对Google浏览器进行限制
chrome_options.add_argument('--headless')
# 加上这个东东用来防止bug
chrome_options.add_argument('--disable-gpu')
# 妈的不知道怎么搞的,Chrome突然崩溃了,只能在非沙箱中运行,害的我浪费好多时间,以后得已知这么带了
chrome_options.add_argument('--no-sandbox')

# 输入文件路径
path = r'F:\……\chromedriver.exe'
# chrome_options 已经由上面定义好了,这下直接导入就能无头了,要有头就不导入
browser = webdriver.Chrome(chrome_options=chrome_options, executable_path=path)
# print(browser)
url = 'http://www.baidu.com/'
browser.get(url=url)
time.sleep(3)
# 查找input输入框,通过id来找
my_input = browser.find_element_by_id('kw')
my_input.send_keys('美女')
time.sleep(3)

# 查找搜索按钮
# 注意find_elements和find_element的区别,一个能找多个,一个只能找一个
# find_elements_by_class_name找到的是一个列表
# 只用写一个类就行了
button = browser.find_elements_by_class_name('s_btn')[0]
button.click()
time.sleep(3)

image = browser.find_elements_by_class_name('op-img-address-link-imgs')[1]
image.click()
time.sleep(4)

browser.quit()

2、模拟鼠标下滑:

用来处理动态加载的信息

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
# chrome_options.add_argument('--headless')
# chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')

path = r'F:\……\chromedriver.exe'
# chrome_options 已经由上面定义好了,这下直接导入就能无头了,要有头就不导入
browser = webdriver.Chrome(chrome_options=chrome_options, executable_path=path)
# print(browser)
url = 'https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action='
browser.get(url)
time.sleep(3)

# 将JavaScript数据传上,模拟鼠标下滑到最底部,加载所有的ajax数据
# 可以不用抓XHR接口也能爬取全部页面,但是会慢,应为要停止,来等网页数据传来
# 这是万般无奈时采用的
# js = 'document.body.scrollTop=10000'
# js = 'document.documentElement.scrollTop=10000'
# 第一个参数是向右滚动,第二个参数是向下滚动,目前看来上面两个都不能用,只能用下面这个
for step in range(1, 10):
    js = 'window.scrollBy(0,3000)'
    browser.execute_script(js)
    time.sleep(1)

html = browser.page_source
browser.quit()

with open('douban.html', 'w', encoding='utf-8')as fp:
    fp.write(html)


3、对站长图库的爬取:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')

path = r'F:\……\chromedriver.exe'
browser = webdriver.Chrome(chrome_options=chrome_options, executable_path=path)
# print(browser)
url = 'http://sc.chinaz.com/tupian/omeitupian.html'
browser.get(url)
time.sleep(3)
# js = 'document.body.scrollTop=10000'
# js = 'document.documentElement.scrollTop=100000'
# 发现上面那个两个js好像用不了???只能用下面这个
# 发现其实是可以用的,只是100000设置得太小,而且也不符合逻辑,有谁能一下子刷那么多的?
# 用下面这个保险一点
for step in range(1, 10):
    js = 'window.scrollBy(0,3000)'
    browser.execute_script(js)
    time.sleep(1)
# browser.execute_script(js)
html = browser.page_source
time.sleep(3)
browser.quit()
with open('chinaz.html', 'w', encoding='utf-8')as fp:
    fp.write(html)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值