Selenium文档

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。

Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。

Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。

PhantomJS

PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。

如果我们把 Selenium 和 PhantomJS 结合在一起,就可以运行一个非常强大的网络爬虫了,这个爬虫可以处理 JavaScrip、Cookie、headers,以及任何我们真实用户需要做的事情。

PhantomJS已经弃用,chrome用chromedriver代替

chromedriver下载地址

注意 :chromedriver的版本要与你使用的chrome版本对应,对应关系如下:

下载完成后:

windows 下,新建一个命名为chromedriver文件夹,将解压的chromedriver.exe放进文件夹,再配置进path环境变量

详细安装方法链接

Linux下,把下载好的文件放在 /usr/bin 目录下就可以了。

分享一个selenium中经常会有人遇到的坑

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

  问:“我循环去点击一列链接,但是只能点到第一个,第二个就失败了,为什么?”。

  原因就在这里:你点击第二个时已经是新页面,当然找不到之前页面的元素。

  问:“可是明明元素就在那里,没有变,甚至我是回退回来的,页面都没有变,怎么会说是新页面?”。

  这个就需要你明白页面长得一样不代表就是同一张页面,就像两个人长得一样不一定是同一个人,他们的身份证号不同。

  页面,甚至页面上的元素都是有自己的身份证号(id)的。

解决办法:

  目前只能sleep一下,让爬虫先把当前页面的内容爬完,再去跳转下一页吧。实则有效。

Selenium 库里有个叫 WebDriver 的 API。WebDriver 有点儿像可以加载网站的浏览器,但是它也可以像 BeautifulSoup 或者其他 Selector 对象一样用来查找页面元素,与页面上的元素进行交互 (发送文本、点击等),以及执行其他动作来运行网络爬虫。

案例一:斗鱼直播房间数据统计

源码下载,将源码仍进PyCharm直接运行即可

源码分析

#!/usr/bin/env python
# -*- coding:utf-8 -*- import unittest
from selenium import webdriver
from bs4 import BeautifulSoup as bs
from selenium.webdriver.chrome.options import Options
import time class douyu(unittest.TestCase):
# 初始化方法,必须是setUp()
def setUp(self):
# 配置自动化浏览器
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--shm-size=1g')
self.driver = webdriver.Chrome(chrome_options=chrome_options)
# self.driver = webdriver.Chrome()
self.num = 0
self.count = 0 # 测试方法必须有test字样开头
def testDouyu(self):
self.driver.get("https://www.douyu.com/directory/all") while True:
soup = bs(self.driver.page_source, "lxml")
# 房间名, 返回列表
names = soup.find_all("h3", {"class" : "ellipsis"})
# 观众人数, 返回列表
numbers = soup.find_all("span", {"class" :"dy-num fr"}) # zip(names, numbers) 将name和number这两个列表合并为一个元组 : [(1, 2), (3, 4)...]
for name, number in zip(names, numbers):
print (u"观众人数: -" + number.get_text().strip() + u"-\t房间名: " + name.get_text().strip() )
self.num += 1
#self.count += int(number.get_text().strip()) time.sleep(0.2) # 如果在页面源码里找到"下一页"为隐藏的标签,就退出循环
if self.driver.page_source.find("shark-pager-disable-next") != -1:
break # 一直点击下一页
self.driver.find_element_by_class_name("shark-pager-next").click() # 测试结束执行的方法
def tearDown(self):
# 退出PhantomJS()浏览器
print ("当前网站直播人数" + str(self.num) )
print ("当前网站观众人数" + str(self.count) )
self.driver.quit() if __name__ == "__main__":
# 启动测试模块
unittest.main()

  

案例二:煎蛋妹子图爬取

由于煎蛋的妹子图实在太多人爬取,所以网站做了一点反爬虫处理,所以要爬取不能想爬百度贴吧那么简单,必须使用Selenium与chromedriver的方式来爬取

源码下载,将源码仍进PyCharm直接运行即可

源码分析

# -*- coding:utf-8 -*-
# Author:shifu204 import urllib.request
import urllib.parse
from lxml import etree
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
from selenium.webdriver.chrome.options import Options def loadPage(url):
"""
作用:根据url发送请求,获取服务器响应文件
url: 需要爬取的url地址
""" chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--shm-size=1g')
driver = webdriver.Chrome(chrome_options=chrome_options) driver.get(url)
img_url = []
path = "G:/mm/" # 保存图片的路径 data = driver.page_source soup = BeautifulSoup(data, "lxml") images = soup.select("a.view_img_link") print(images) for image in images: dynamic = image.get('href') # if str('gif') in str(dynamic): #  去除gif
# pass
# else: http_url = "http:" + dynamic
img_url.append(http_url)
# print("http:%s" % dynamic) for j in img_url:
r = requests.get(j) print('正在下载 %s' % j) with open(path + j[-15:], 'wb')as jpg:
jpg.write(r.content) def tiebaSpider(url, beginPage, endPage):
"""
beginPage : 起始页
endPage : 结束页
"""
for page in range(beginPage, endPage + 1):
#filename = "第" + str(page) + "页.html"
fullurl = url + "/page-" + str(page) + "#comments"
# print (fullurl)
loadPage(fullurl)
#print (html) print("谢谢使用") if __name__ == "__main__":
kw = input("请输入需要爬取的内容: 1-搞笑,2-美女 :") if kw == '1':
k = 'pic'
else:
k = 'ooxx' beginPage = int(input("请输入起始页:"))
endPage = int(input("请输入结束页:")) # url = "http://jandan.net/pic/page-230#comments"
url = "http://jandan.net/" fullurl = url + k
# print(fullurl)
tiebaSpider(fullurl, beginPage, endPage)

  

案例三:优酷羽毛球教学视频链接批量爬取

这个纯粹个人爱好,优酷某些带版权的视频不能在客户端下载,然后,你懂的~~

将你关注频道的链接复制下来,例如下面这个

源码下载,将源码仍进PyCharm直接运行即可

源码分析

# -*- coding:utf-8 -*-
# Author:shifu204 import urllib.request
import urllib.parse
from lxml import etree
from selenium import webdriver
from bs4 import BeautifulSoup
import requests
from selenium.webdriver.chrome.options import Options def loadPage(url):
"""
作用:根据url发送请求,获取服务器响应文件
url: 需要爬取的url地址
""" chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--shm-size=1g')
driver = webdriver.Chrome(chrome_options=chrome_options) driver.get(url) # 点击视频链接
# divs = driver.find_elements_by_class_name("v-link")
# for links in divs:
# links.click() data = driver.page_source soup = BeautifulSoup(data, "lxml") video_urls = soup.select("div.v-link > a") for video_url in video_urls:
# video_url.click()
dynamic = video_url.get('href') http_url = "https:" + dynamic
# img_url.append(http_url)
print(http_url) def tiebaSpider(url, beginPage, endPage):
"""
beginPage : 起始页
endPage : 结束页
"""
for page in range(beginPage, endPage + 1):
fullurl = url + str(page) + ''
# print (fullurl)
loadPage(fullurl)
#print (html) print("谢谢使用") if __name__ == "__main__": beginPage = int(input("请输入起始页:"))
endPage = int(input("请输入结束页:")) # 关注频道页面的url黏贴到这里
fullurl = "http://i.youku.com/i/UNDIyMzkyNDMy/videos?spm=a2hzp.8253869.0.0&order=1&page=" # print(fullurl)
tiebaSpider(fullurl, beginPage, endPage)

  

爬虫 (4)- Selenium与PhantomJS(chromedriver)与爬取案例的更多相关文章

  1. 针对源代码和检查元素不一致的网页爬虫——利用Selenium、PhantomJS、bs4爬取12306的列车途径站信息

    整个程序的核心难点在于上次豆瓣爬虫针对的是静态网页,源代码和检查元素内容相同:而在12306的查找搜索过程中,其网页发生变化(出现了查找到的数据),这个过程是动态的,使得我们在审查元素中能一一对应看到 ...

  2. Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息

    #使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...

  3. 爬虫实例——爬取淘女郎相册(通过selenium、PhantomJS、BeautifulSoup爬取)

    环境 操作系统:CentOS 6.7 32-bit Python版本:2.6.6 第三方插件 selenium PhantomJS BeautifulSoup 代码 # -*- coding: utf ...

  4. python3爬虫-通过selenium登陆拉钩,爬取职位信息

    from selenium import webdriver from selenium.common.exceptions import NoSuchElementException from se ...

  5. 使用selenium+phantomJS实现网页爬取

    有些网站反爬虫技术设计的非常好,很难采用WebClient等技术进行网页信息爬取,这时可以考虑采用selenium+phantomJS模拟浏览器(其实是真实的浏览器)的方式进行信息爬取.之前一直使用的 ...

  6. 使用Selenium&PhantomJS的方式爬取代理

    前面已经爬取了代理,今天我们使用Selenium&PhantomJS的方式爬取快代理 :快代理 - 高速http代理ip每天更新. 首先分析一下快代理,如下 使用谷歌浏览器,检查,发现每个代理 ...

  7. 爬虫系列(六) 用urllib和re爬取百度贴吧

    这篇文章我们将使用 urllib 和 re 模块爬取百度贴吧,并使用三种文件格式存储数据,下面先贴上最终的效果图 1.网页分析 (1)准备工作 首先我们使用 Chrome 浏览器打开 百度贴吧,在输入 ...

  8. 爬虫系列(十) 用requests和xpath爬取豆瓣电影

    这篇文章我们将使用 requests 和 xpath 爬取豆瓣电影 Top250,下面先贴上最终的效果图: 1.网页分析 (1)分析 URL 规律 我们首先使用 Chrome 浏览器打开 豆瓣电影 T ...

  9. 爬虫系列(十一) 用requests和xpath爬取豆瓣电影评论

    这篇文章,我们继续利用 requests 和 xpath 爬取豆瓣电影的短评,下面还是先贴上效果图: 1.网页分析 (1)翻页 我们还是使用 Chrome 浏览器打开豆瓣电影中某一部电影的评论进行分析 ...

  10. 爬虫入门(三)——动态网页爬取:爬取pexel上的图片

    Pexel上有大量精美的图片,没事总想看看有什么好看的自己保存到电脑里可能会很有用 但是一个一个保存当然太麻烦了 所以不如我们写个爬虫吧(๑•̀ㅂ•́)و✧ 一开始学习爬虫的时候希望爬取pexel上的 ...

随机推荐

  1. MyEclipse 2014配置Maven

    1 配置maven (1)下载apache-maven-3.3.3和mvnRespo放在某个路径下,我这里是放在D盘根目录下. (2)修改D:\apache-maven-3.3.3\conf\sett ...

  2. IT博客汇

    做了个博客聚合网站,收集了一堆IT牛人的博客RSS订阅,每天自动更新. 一旦关注的作者发表了新的博客,第一时间就能看到. 地址在这儿,欢迎参观: http://www.wrox.cn

  3. 转:ios review推送与执行

    http://mp.weixin.qq.com/s?__biz=MzA4ODk0NjY4NA==&mid=409082578&idx=1&sn=2ca1e453d3c21caa ...

  4. Android RxJava/RxAndroid结合Retrofit使用

    概述 RxJava是一个在 Java VM 上使用可观測的序列来组成异步的.基于事件的程序的库.更重要的是:使用RxJava在代码逻辑上会非常简洁明了,尤其是在复杂的逻辑上.告别迷之缩进. RxAnd ...

  5. qq邮箱、qq空间点击后以word方式打开解决办法

    解决办法: Internet--工具--Internet选项--程序--设为默认值

  6. iOS设备定位服务开启判定

    应用CLLocationManager 的两个方法 [CLLocationManagerlocationServicesEnabled] 判断设备是否开启定位功能 [CLLocationManager ...

  7. Unity3D实现3D立体游戏原理及过程,需偏振眼镜3D显

    http://tieba.baidu.com/p/3038509618?fr=ala0&pstaala=3

  8. Android_WebView_全屏

    WebView(网络视图)能加载显示网页,能够将其视为一个浏览器. 它使用了WebKit渲染引擎加载显示网页,实现WebView有下面两种不同的方法: 第一种方法的步骤: 1.在要Activity中实 ...

  9. 算法笔记_089:蓝桥杯练习 7-2求arccos值(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 利用标准库中的cos(x)和fabs(x)函数实现arccos(x)函数,x取值范围是[-1, 1],返回值为[0, PI].要求结果准确 ...

  10. 使用python进行图像处理-调整图片大小

    python有一个图像处理库——PIL,可以处理图像文件.PIL提供了功能丰富的方法,比如格式转换.旋转.裁剪.改变尺寸.像素处理.图片合并等等等等,非常强大. 举个简单的例子,调整图片的大小: im ...