快捷搜索:  as

Python网络爬虫实战之七:动态网页爬取案例实战

目录:Python收集爬虫实战系列

Python收集爬虫实战之一:收集爬虫理论根基

Python收集爬虫实战之二:情况支配、根基语法、文件操作

Python收集爬虫实战之三:基础对象库urllib和requests

Python收集爬虫实战之四:BeautifulSoup

Python收集爬虫实战之五:正则表达式

Python收集爬虫实战之六:静态网页爬取案例实战

Python收集爬虫实战之七:动态网页爬取案例实战 Selenium + PhantomJS

Python收集爬虫实战之八:动态网页爬取案例实战 Selenium + Headless Chrome

Python收集爬虫实战之九:Selenium进阶操作与爬取京东商批评论

Python收集爬虫实战之十:使用API进行数据采集

Python收集爬虫实战之十一:Scrapy爬虫框架入门先容

Python收集爬虫实战之十二:Scrapy爬虫三个实战小案例

Python收集爬虫实战之十三:Scrapy爬取名侦察柯南漫画集

Python收集爬虫实战之十四:Scrapy结合scrapy-splash爬取动态网页数据

正文:

一、Selenium

1、Selenium是什么

Selenium 是什么?一句话,自动化测试对象。它支持各类浏览器,包括 Chrome,Safari,Firefox 等主流界面式浏览器,假如你在这些浏览器里面安装一个 Selenium 的插件,那么便可以方便地实现Web界面的测试。换句话说叫 Selenium 支持这些浏览器驱动。

2、安装Selenium

措施一:pip install selenium

措施二:下载源码后解压,进入解压后的目录,履行 python setup.py install

3、安装浏览器驱动

应用谷歌浏览器,则下载chromedriver.exe,下载成功后,把chromedriver.exe复制到Python安装路径下的Scripts目录中

应用其他浏览器措施类似

4、快速体验Selenium

应用pyhon打开浏览器,并自动造访百度首页

from selenium import webdriver

browser = webdriver.Chrome()

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

打开浏览器,并自动在百度中搜索“Python”关键词

from selenium import webdriver

from selenium.webdriver.common.keys import Keys

browser = webdriver.Chrome()

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

input = browser.find_element_by_id('kw')

input.send_keys('Python')

input.send_keys(Keys.ENTER)

5、爬取网页代码:自动在百度中搜索“Python”关键词后的网页

from selenium import webdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.common.keys import Keys

from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.wait import WebDriverWait

browser = webdriver.Chrome()

try:

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

input = browser.find_element_by_id('kw')

input.send_keys('Python')

input.send_keys(Keys.ENTER)

wait = WebDriverWait(browser, 10)

wait.until(EC.presence_of_element_located((By.ID, 'content_left')))

print(browser.current_url)

print(browser.get_cookies())

print(browser.page_source)

finally:

browser.close()

Selenium的更具体资料可参考Selenium with Python中文翻译文档

二、PhantomJS

1、PhantomJs是什么?

PhantomJs是什么?是一个基于Webkit的"无界面"(headless)浏览器,它会把网站加载到内存并履行页面上的JavaScript,由于不会展示图形界面,以是运行起来比完备的浏览器更高效。

爬取动态网页的时刻,平日是PhantomJS 用来衬着解析JS,Selenium 用来驱动以及与 Python 的对接,Python 进行后期的处置惩罚,完美的三剑客!

2、安装PhantomJS

PhantomJS官方下载地址

下载成功后,解压获得phantomjs-2.1.1-windows文件夹,bin目录下的phantomjs.exe文件才是我们真正必要的,example目录下的文件时官方示例代码。

可以经由过程设置情况变量来应用PhantomJS,也可以经由过程指定路径来操作。设置情况变量的办程序把phantomjs-2.1.1-windows的bin设置设置设备摆设摆设到path中,比如我的路径是D:\python\PythonLibs\phantomjs-2.1.1-windows\bin

经由过程输出PhantomJS来查验PhantomJS是否可用:

假如设置设置设备摆设摆设了系统情况变量,在cmd节制台直接输入:phantomjs -v

假如没有设置设置设备摆设摆设系统全局变量,则进入到phantomjs.exe文件的所在目录,比如:D:\Python\PythonLibs\phantomjs-2.1.1-windows\bin,然后再履行 phantomjs -v

3、快速体验PhantomJS

应用措施:进入phantomjs.exe所在目录,然后履行 phantomjs 文件绝对路径

履行官方示例中的hello.js文件(假设没有设置设置设备摆设摆设系统全局变量)

D:\DataguruPyhton>cd D:\python\PythonLibs\phantomjs-2.1.1-windows\bin

D:\Python\PythonLibs\phantomjs-2.1.1-windows\bin>phantomjs D:\python\PythonLibs\pha

ntomjs-2.1.1-windows\examples\hello.js

运行结果是:Hello, world!

此中hello.js中的代码是:

"use strict";

console.log('Hello, world!');

phantom.exit();

履行官方示例中的version.js文件(假设没有设置设置设备摆设摆设系统全局变量)

D:\Python\PythonLibs\phantomjs-2.1.1-windows\bin>phantomjs D:\python\PythonLibs\pha

ntomjs-2.1.1-windows\examples\version.js

运行结果是:using PhantomJS version 2.1.1

此中version.js中的代码是:

"use strict";

console.log('using PhantomJS version ' +

phantom.version.major + '.' +

phantom.version.minor + '.' +

phantom.version.patch);

phantom.exit();

PhantomJS更具体资料可参考PhantomJS官方文档

三、Selenium+PhantomJS结合应用

Selenium + PhantomJS 实例一

from selenium import webdriver

# 调用键盘按键操作必要引入keys包

from selenium.webdriver.common.keys import Keys

# 调用指定的PhantomJS浏览器创建浏览器工具(没有在情况变量中指定PhantomJS位置)

driver = webdriver.PhantomJS(executable_path=r'D:\python\PythonLibs\phantomjs-2.1.1-windows\bin\phantomjs')

# 调用情况变量指定的PhantomJS浏览器创建浏览器工具(假如已经在情况变量中指定了PhantomJS位置)

# driver = webdriver.PhantomJS()

driver.set_window_size(1366, 768)

# get措施会不停等到页面加载,然后才会继承法度榜样,平日测试会在这里选择time.sleep(2)

driver.get("http://www.baidu.com/")

# 获取页面名为wraper的id标签的文本内容

data = driver.find_element_by_id('wrapper').text

# 打印数据内容

print(data)

# 把百度设为主页关于百度AboutBaidu百度推广

# ©2018 Baidu 应用百度前必读 意见反馈 京ICP证030173号京公网安备11000002000001号

print(driver.title)# result: 百度一下,你就知道

# 天生页面快照并保存

driver.save_screenshot(r'D:\DataguruPyhton\PythonSpider\images\baidu.png')

# id="kw"是百度搜索输入框,输入字符串"长城"

driver.find_element_by_id('kw').send_keys(u'长城')

# id="su"是百度搜索按钮,click()是模拟点击

driver.find_element_by_id('su').click()

# 获取新的页面快照

driver.save_screenshot(r'D:\DataguruPyhton\PythonSpider\images\长城.png')

# 打印网页衬着后的源代码

print(driver.page_source)

# 获取当前页面Cookie

print(driver.get_cookies())

driver.quit()

Selenium + PhantomJS 实例二

from selenium import webdriver

import time

# 调用键盘按键操作必要引入keys包

from selenium.webdriver.common.keys import Keys

# 调用指定的PhantomJS浏览器创建浏览器工具(没有在情况变量中指定PhantomJS位置)

driver = webdriver.PhantomJS(executable_path=r'D:\python\PythonLibs\phantomjs-2.1.1-windows\bin\phantomjs')

# 调用情况变量指定的PhantomJS浏览器创建浏览器工具(假如已经在情况变量中指定了PhantomJS位置)

# driver = webdriver.PhantomJS()

driver.set_window_size(1366, 768)

# get措施会不停等到页面加载,然后才会继承法度榜样,平日测试会在这里选择time.sleep(2)

driver.get("http://www.baidu.com/")

# id="kw"是百度搜索输入框,输入字符串"情人节"

driver.find_element_by_id('kw').send_keys(u'情人节')

# ctrl+a全选输入框内容

driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a')

# ctrl+x剪切输入框内容

driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'x')

# 输入框从新输入内容

driver.find_element_by_id('kw').send_keys('鲜花')

# 模拟Enter回车键

driver.find_element_by_id('su').send_keys(Keys.RETURN)

time.sleep(5)

# 清空输入框内容

driver.find_element_by_id('kw').clear()

# 天生新的页面快照

driver.save_screenshot(r'D:\DataguruPyhton\PythonSpider\images\鲜花.png')

# 获取当前url

print(driver.current_url)

driver.quit()

Selenium + PhantomJS 实例三:爬取包孕Ajax的动态网页数据

## Selenium+PhantomJS爬取包孕Ajax的动态网页数据:经由过程手动延时

from selenium import webdriver

import time

driver = webdriver.PhantomJS(executable_path=r'D:\python\PythonLibs\phantomjs-2.1.1-windows\bin\phantomjs')

driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")

# driver.page_source

time.sleep(3)

print(driver.find_element_by_id("content").text)

driver.close()

完善后的代码

## Selenium+PhantomJS爬取包孕Ajax的动态网页数据:经由过程反省页面是否加载完毕

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.PhantomJS(executable_path=r'D:\python\PythonLibs\phantomjs-2.1.1-windows\bin\phantomjs')

driver.get("http://pythonscraping.com/pages/javascript/ajaxDemo.html")

try:

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "loadedButton")))

finally:

print(driver.find_element_by_id("content").text)

driver.close()

Selenium + PhantomJS 实例四:爬取重定向的动态网页数据

from selenium import webdriver

from selenium.common.exceptions import StaleElementReferenceException

def waitForLoad(driver):

elem = driver.find_element_by_tag_name("html")

count = 0

while True:

count += 1

if count > 20:

print("Timing out after 10 seconds and returning")

return

time.sleep(.5)

try:

elem == driver.find_element_by_tag_name("html")

except StaleElementReferenceException:

return

driver = webdriver.PhantomJS(executable_path=r'D:\python\PythonLibs\phantomjs-2.1.1-windows\bin\phantomjs')

driver.get("http://pythonscraping.com/pages/javascript/redirectDemo1.html")

waitForLoad(driver)

print(driver.page_source)

四、Selenium+PhantomJS应用时报错缘故原由及办理规划

1、征象

报错日志:

UserWarning: Selenium support for PhantomJS has been deprecated, please use headless versions of Chrome or Firefox instead warnings.warn('Selenium support for PhantomJS has been deprecated, please use headless '

便是说selenium已经放弃PhantomJS,了,建议应用火狐或者谷歌无界面浏览器。

2、办理规划

规整洁:selenium版本降级,卸载当前selenium,重现安装低版本的selenium,比如pip install selenium==3.8.0

规划二:应用 Selenium + Headless Firefox 或 Selenium + Headless Chrome

将鄙人篇文章中具体先容 Selenium + Headless Chrome

五、本篇文章中的代码,运行情况

Python 3.6.4

selenium 3.8.0

phantomjs-2.1.1-windows

chromedriver.exe

六、彩蛋:pillow对图片进行处置惩罚

为今后读取图片验证码铺垫

# 必要先安装pillow,安装措施:pip install pillow

from PIL import Image, ImageFilter

kitten = Image.open(u"D:\DataguruPyhton\PythonSpider\images\girl1.jpg")

blurryKitten = kitten.filter(ImageFilter.GaussianBlur)

blurryKitten.save(u"D:\DataguruPyhton\PythonSpider\images\girl2.jpg")

blurryKitten.show()

您可能还会对下面的文章感兴趣: