爬虫之selenium和PhantomJS

---恢复内容开始---

selenium

selenium是什么?

是Python的一个第三方库,对外提供的接口可以操作浏览器,然后让浏览器完成自动化的操作

环境搭建

1.安装: pip install selenium

2.获取对应的驱动:以谷歌为例
2.1.查看谷歌浏览器帮助中的关于Google Chrome  查看版本

2.2映射表地址:  
# 查看对应的驱动
http:
//blog.csdn.net/huilan_same/article/details/51896672 2.3谷歌浏览器驱动下载地址: # 根据映射表下载对应驱动
http:
//chromedriver.storage.googleapis.com/index.html

注意:如果是Anaconda3的jupyter的情况,不能直接下载到本地的cpython解释器  要在Anaconda3\Scripts中指定下载

示例:先运行下看下结果

from time import sleep
from selenium import webdriver

# 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
driver = webdriver.Chrome(r'F:\Python\10爬虫\包\chromedriver_win32\chromedriver.exe')

# 用get打开百度页面
driver.get("http://www.baidu.com")
# 查找页面的“设置”选项,并进行点击
driver.find_elements_by_link_text('设置')[0].click()
sleep(2)
# # 打开设置后找到“搜索设置”选项,设置为每页显示50条
driver.find_elements_by_link_text('搜索设置')[0].click()
sleep(2)

# 选中每页显示50条
m = driver.find_element_by_id('nr')
sleep(2)
m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
m.find_element_by_xpath('.//option[3]').click()
sleep(2)

# 点击保存设置
driver.find_elements_by_class_name("prefpanelgo")[0].click()
sleep(2)

# 处理弹出的警告页面   确定accept() 和 取消dismiss()
driver.switch_to_alert().accept()
sleep(2)
# 找到百度的输入框,并输入 美女
driver.find_element_by_id('kw').send_keys('美女')
sleep(2)
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)
# 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
driver.find_elements_by_link_text('美女_百度图片')[0].click()
sleep(3)

# 关闭浏览器
driver.quit()

代码介绍:

#导包
from selenium import webdriver  
#创建浏览器对象,通过该对象可以操作浏览器
browser = webdriver.Chrome('驱动路径')
#使用浏览器发起指定请求
browser.get(url)

#使用下面的方法,查找指定的元素进行操作即可
    find_element_by_id            根据id找节点
    find_elements_by_name         根据name找
    find_elements_by_xpath        根据xpath查找
    find_elements_by_tag_name     根据标签名找
    find_elements_by_class_name   根据class名字查找

phantomJs

PhantomJS是一款无界面的浏览器,其自动化操作流程和上述操作谷歌浏览器是一致的。由于是无界面的,为了能够展示自动化操作流程,PhantomJS为用户提供了一个截屏的功能,使用save_screenshot函数实现。

示例:

from time import sleep
from selenium import webdriver

# 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
driver = webdriver.Chrome(r'F:\Python\10爬虫\包\chromedriver_win32\chromedriver.exe')

# 用get打开百度页面
driver.get("http://www.baidu.com")
# 查找页面的“设置”选项,并进行点击
driver.find_elements_by_link_text('设置')[0].click()
sleep(2)
# # 打开设置后找到“搜索设置”选项,设置为每页显示50条
driver.find_elements_by_link_text('搜索设置')[0].click()
sleep(2)

# 选中每页显示50条
m = driver.find_element_by_id('nr')
sleep(2)
m.find_element_by_xpath('//*[@id="nr"]/option[3]').click()
m.find_element_by_xpath('.//option[3]').click()
sleep(2)

# 点击保存设置
driver.find_elements_by_class_name("prefpanelgo")[0].click()
sleep(2)

# 处理弹出的警告页面   确定accept() 和 取消dismiss()
driver.switch_to_alert().accept()
sleep(2)
# 找到百度的输入框,并输入 美女
driver.find_element_by_id('kw').send_keys('美女')
sleep(2)
# 点击搜索按钮
driver.find_element_by_id('su').click()
sleep(2)
# 在打开的页面中找到“Selenium - 开源中国社区”,并打开这个页面
driver.find_elements_by_link_text('美女_百度图片')[0].click()
sleep(3)

# 关闭浏览器
driver.quit()

谷歌无界面使用

# selenium 对 无头谷歌 的调用

#########################################################
#固定格式 
from selenium import webdriver
import time
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
#########################################################


path = r'F:\Python\视屏\10爬虫\包\chromedriver_win32\chromedriver.exe'
bro = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)  # 此时 属于无界面的调用谷歌浏览器

# 请求的发送
bro.get(url='https://www.baidu.com')

#根据find系列的函数定位到指定的标签
baidu_input = bro.find_element_by_id('kw')

baidu_input.send_keys('python')  # 百度搜索框输入  python
time.sleep(0.5)


bro.find_element_by_id('su').click()   # 找到百度一下
time.sleep(1)
response = bro.find_element_by_xpath('//*[@id="1"]/h3/a[1]').click()  
time.sleep(6)

bro.quit()

重点:selenium+phantomjs 就是爬虫终极解决方案:有些网站上的内容信息是通过动态加载js形成的,所以使用普通爬虫程序无法回去动态加载的js内容。例如豆瓣电影中的电影信息是通过下拉操作动态加载更多的电影信息。

 #需求:爬取豆瓣电影动态加载出的电影详情数据

from time import sleep
from selenium import webdriver

# 后面是你的浏览器驱动位置,记得前面加r'','r'是防止字符转义的
driver = webdriver.Chrome(r'F:\Python\视屏\10爬虫\包\chromedriver_win32\chromedriver.exe')

url = 'https://movie.douban.com/typerank?type_name=%E7%88%B1%E6%83%85&type=13&interval_id=100:90&action='  # 豆瓣的url


driver.get(url=url)  # 调用浏览器访问豆瓣

js = 'window.scrollTo(0,document.body.scrollHeight)'  # 滚动下拉当前屏幕对应像素的js代码

driver.execute_script(js)  # 下拉滚动第一次
sleep(2)

driver.execute_script(js)  # 下拉滚动第二次
sleep(2)

driver.execute_script(js)  # 下拉滚动第三次
sleep(2)


page_text = driver.page_source  #  类似requests.get(url).text
# print(page_text)

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

 qq空间登录爬取

from time import sleep
from selenium import webdriver
from lxml import etree

#登录qq空间
bro = webdriver.Chrome(executable_path=r'F:\Python\视屏\10爬虫\包\chromedriver_win32\chromedriver.exe')
url = 'https://qzone.qq.com/'
#请求的发送
bro.get(url=url)
sleep(1)
#定位到指定的iframe  # 使用的组件嵌套 点位组件
bro.switch_to.frame('login_frame')

bro.find_element_by_id('switcher_plogin').click()  # 定位切换账号密码登录
sleep(1)

userName = bro.find_element_by_id('u')  # 账号输入框
userName.send_keys('qq账号')

passWord = bro.find_element_by_id('p')  # 密码输入栏
passWord.send_keys('qq密码.')
sleep(1)
bro.find_element_by_id('login_button').click()  # 点击登录
sleep(1)
js = 'window.scrollTo(0,document.body.scrollHeight)'  # 向下滚动的js代码
bro.execute_script(js)  # 1次
sleep(3)
bro.execute_script(js)  # 2次
sleep(3)
bro.execute_script(js)  # 3次
sleep(3)
bro.execute_script(js)  # 3次
sleep(3)
bro.execute_script(js)  # 3次
sleep(3)
page_text = bro.page_source  # 获取页面的response.text的内容
print(page_text)
sleep(5)

#解析
tree = etree.HTML(page_text)  # DOM数

div_list = tree.xpath('//div[@class="f-info qz_info_cut"] | //div[@class="f-info"]')  # 获取 说说 或者其他转发dom节点
for div in div_list:
    text = div.xpath('.//text()')  # 得到每一个节点的文本内容
    text = "".join(text)   
    print(text)
    
bro.quit()

猜你喜欢

转载自www.cnblogs.com/clbao/p/10252528.html