文章目录

  • 动态网页处理
  • PhantomJS
  • Selenium
    • 处理异步请求
    • 模拟键盘操作
    • 页面等待
      • 显示等待
      • 隐式等待
    • Phantomjs+Selenuim爬取淘宝

动态网页处理

很多网站都采用AJAX技术,SPA技术,部分内容都是异步动态加载的。可以提高用户体验。
但是,对于爬虫程序爬取到的HTML页面相当于页面模板,动态内容不再其中。
解决办法之一,如果能构造一个包含JS引擎的浏览器,让它加载网页并和网站交互,我们编程从这个浏览器获取内容包括动态内容。

PhantomJS

它是一个headless无头浏览器,支持JavaScript。可以运行在windows、linux、mac os等。所谓的无头浏览器就是包含JS引擎,浏览器排版引擎等核心组件,但是没有和用户交互的界面浏览器。
官网
http://phantomjs.org/
Casper下载地址:
http://casperjs.org/

PhantomJS是可以运行js脚本,下面有个例子



访问浏览器对象

phantomjs的webpage模块

// 加载模块
var webPage = require('webpage');
// 创建对象
var page = webPage.create();
//打开页面
// page.open(
//     'https://www.baidu.com/',
//     function(status) {
//         console.log('请求响应状态码',status)
//         phantom.exit();
//     }
// );
//page.open('https://fanyi.baidu.com/sug','POST','kw=test',function(status) {console.log('请求响应状态码',status)console.log(page.content)phantom.exit();});

将example中的hello改成上面的代码,在cmd中 运行js脚本

var webPage = require('webpage');
// 创建对象
var page = webPage.create();
page.open('http://www.huanqiu.com/',function (status) {console.log('evaluate:', status)result = page.evaluate(function (p1) {// console.log('测试参数:',p1);   // 这个内部执行,不输出str_agent = window.navigator.userAgent;   // 得到浏览器的user-agentstr_title = window.document.title;   // 文档标题 window可以省略// 下面访问DOMvar node = document.querySelector('body > div.wrap > div.navTop > div > div > div.navTopOther > a.wxLogo');var dom_title = node.attributes['title'].valuereturn [p1, str_agent, str_title, dom_title];}, '参数1');console.log('处理结果', result)phantom.exit();}

需要保存页面图片的话 在function内加render函数 具体代码如下
`
var webPage = require(‘webpage’);
// 创建对象
var page = webPage.create();
page.open(
‘http://www.huanqiu.com/’,
function(status) {
console.log(‘请求响应状态码’,status);
page.render(
‘huanqiu.png’,
{
format: ‘png’,
quality: 100
});
phantom.exit();
}
);

page.onLoadStarted = function () {
console.log(‘页面加载完毕’);
}`

Selenium

Selenium是一个自动化测试的工具。它可以直接运行在浏览器中,支持主流的浏览器,包括PhantomJS
在pycharm中 pip install 即可安装
下面我们来看看如何使用

from selenium.webdriver.chrome.options import Options
from selenium.webdriver import PhantomJS
from selenium.webdriver.phantomjs.webdriver import WebDriver
from selenium.webdriver.common.by import By
import time
options = Options()
options.headless = Falsedriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe')
driver.set_window_size(1280,1080) #有的浏览器是你拉取多大 显示多少内容  所以尽量设置大一点
driver.get('https://login.taobao.com')
driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/test.png')

处理异步请求

bing的查询结果是通过异步请求返回结果,多以,直接访问页面不能直接获取搜索结果

from selenium.webdriver import PhantomJS
from selenium.webdriver.phantomjs.webdriver import WebDriverdriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe')
driver.set_window_size(1280,1080)
driver.get('https://cn.bing.com/search?q=%E5%89%91%E6%9D%A5&qs=n&form=QBLH&sp=-1&pq=jianl&sc=8-5&sk=&cvid=8E8155699B16437BA16D9788700EABAC')
driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/test1.png')


由于异步请求 加载需要时间 这里我们延迟三秒在保存图片
代码同上 在保存图片前加time.sleep(3)

模拟键盘操作

这里我们模拟百度关键字搜索


from selenium.webdriver.chrome.options import Options
from selenium.webdriver import PhantomJS
import time
options = Options()
options.headless = False
driver = PhantomJS('E:/phantomjs/bin/phantomjs.exe')
driver.set_window_size(1280,1080) #有的浏览器是你拉取多大 显示多少内容  所以尽量设置大一点
driver.get('https://www.baidu.com')
try:input= driver.find_element_by_id('kw')input.send_keys('zzh')submit = driver.find_element_by_id('su')submit.click()
except:raise Exceptiondriver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/test3.png')

下拉框和上面操作差不多 f12找到下拉框的位置 然后用xpath定位 用Select保存元素操作
元素的值只有两种find方式 一个通过index 一个通过value

页面等待

越来越多的页面采用AJAX这样的异步技术,这导致页面代码中要访问的元素,没有被加载就被访问了,抛出异常
解决方法一:
上面使用的线程休眠,使用time.sleep来等待数据加载
方法二:Selenium等待
Selenium等待有两种:显示等待和隐式等待

显示等待

指定一个条件,一直等到这个条件成立后继续执行,也可以设置超时时间,超时抛异常
| expected_conditions | 说明 |
| presence_of_element_located | 判断某个元素是否被加载到DOM树里,但不一定是可见的
| visibility_of_element_located | 判断元素是否可见 |
| invisibility_of_element_located | 判断某个元素没被加载到DOM树里或不可见的 |
| element_to_be_clickable | 某个元素是否可见且可被点击 |

from selenium.webdriver import PhantomJS
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECdriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe')
driver.set_window_size(1280,1080) #有的浏览器是你拉取多大 显示多少内容  所以尽量设置大一点
driver.get('https://www.baidu.com')
try:ele= WebDriverWait(driver,10).until(EC.presence_of_element_located  #元素已加载到DOM,但不保证是可见的((By.ID,'111')))
except Exception as e:print(e)finally:driver.quit()


打印type(e)是超时异常 ,并不是找不到

隐式等待

隐式等待等于加载了配置,所以访问元素都等待特定的时间

from selenium.webdriver import PhantomJS
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as ECdriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe')
driver.set_window_size(1280,1080) #有的浏览器是你拉取多大 显示多少内容  所以尽量设置大一点
driver.implicitly_wait(10) #隐式等待
driver.get('https://www.baidu.com')
try:ele= driver.find_element_by_id('111')
except Exception as e:print(e,type(e))finally:driver.quit()


这里显示没找到异常

Phantomjs+Selenuim爬取淘宝

from selenium.webdriver import PhantomJS
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
import timedriver = PhantomJS('E:/phantomjs/bin/phantomjs.exe')
driver.set_window_size(1280,1080) #有的浏览器是你拉取多大 显示多少内容  所以尽量设置大一点
# driver.implicitly_wait(10) #隐式等待
driver.get('https://www.taobao.com')
try:ele= driver.find_element_by_xpath('//*[@id="J_SiteNavLogin"]/div[1]/div[1]/a[1]')print(type(ele))time.sleep(3)ele.click()time.sleep(3)username  =driver.find_element_by_xpath('//*[@id="TPL_username_1"]')time.sleep(3)username.send_keys('17356526030')time.sleep(3)password = driver.find_element_by_xpath('//*[@id="TPL_password_1"]')password.send_keys('zzh807651901.')driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/log.png')time.sleep(3)button = driver.find_element_by_xpath('//*[@id="J_SubmitStatic"]')time.sleep(3)button.click()time.sleep(3)driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/PlantomJS2.png')except Exception as e:print(e,type(e))finally:driver.save_screenshot('C:/Users/Administrator/PycharmProjects/test/PlantomJS3.png')driver.quit()

PhantomJS+Selenium爬取淘宝相关推荐

  1. [Python3网络爬虫开发实战] 7-动态渲染页面爬取-4-使用Selenium爬取淘宝商品

    在前一章中,我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过Ajax获取的,但是这些Ajax接口参数比较复杂,可 ...

  2. 利用Selenium爬取淘宝商品信息

    文章来源:公众号-智能化IT系统. 一.  Selenium和PhantomJS介绍 Selenium是一个用于Web应用程序测试的工具,Selenium直接运行在浏览器中,就像真正的用户在操作一样. ...

  3. 使用selenium爬取淘宝实战.md

    ##使用selenium爬取淘宝实战 确定要爬取的内容 爬取左侧的一级类型(女装/男装/内衣等等),和右侧的二级类型(秋上新/连衣裙等等) 导入selenium 在这之前需要安装webdriver 可 ...

  4. 使用selenium爬取淘宝店铺信息

    使用selenium +PhantomJS()/Chrome爬取 淘宝页面,存储到mongdb中 使用config进行一些设置 MONGO_URL = 'localhost' MONGO_DB = ' ...

  5. Python + selenium 爬取淘宝商品列表及商品评论 2021-08-26

    Python + selenium 爬取淘宝商品列表及商品评论[2021-08-26] 主要内容 登录淘宝 获取商品列表 获取评论信息 存入数据库 需要提醒 主要内容 通过python3.8+ sel ...

  6. 使用Selenium爬取淘宝商品(绕过登录页面)

    文章目录 1.准备工作 2.接口分析 3.页面分析 4.获取商品列表 5.解析商品列表 6.保存到MongoDB 7.遍历每页 8.异常处理(绕过登录反爬机制) 方法一:修改ChromeDriver. ...

  7. selenium爬取淘宝商品基础数据以及商品详情(茶叶数据)

    selenium爬取淘宝商品基础数据以及商品详情 目录 网页分析 确定要爬取的数据 分析网页构成 爬取流程 登入 爬取基础数据以及商品详情 爬取基础数据 爬取商品详情 淘宝滑动验证码 保存EXCEL中 ...

  8. python爬虫——用selenium爬取淘宝商品信息

    python爬虫--用selenium爬取淘宝商品信息 1.附上效果图 2.淘宝网址https://www.taobao.com/ 3.先写好头部 browser = webdriver.Chrome ...

  9. 爬虫学习笔记——Selenium爬取淘宝商品信息并保存

    在使用selenium来模拟浏览器操作,抓取淘宝商品信息前,先完成一些准备工作. 准备工作:需要安装selenium,pyquery,以及Chrome浏览器并配置ChromeDriver. 安装sel ...

最新文章

  1. fusioncompute中cpu可以设置的qos参数有哪些?_kubernetes 中 Qos 的设计与实现
  2. 聊聊storm的AggregateProcessor的execute及finishBatch方法
  3. bzoj 3329: Xorequ
  4. CVPR 2021 | Facebook提出FP-NAS:搜索速度更快、分类精度更高、性能更好
  5. 管道实现进程间通讯 、WaitNamedPipe
  6. 【转载】Android Animation 简介(官方文档翻译) ---- 翻译的很好!
  7. solid测序列原理_SOLID原理简介
  8. 【Redis】Redis 基础知识 常用命令 命令积累
  9. 单片机ADC采样算法----中位值滤波法
  10. sqli注入前置知识
  11. php 替换alt,PHP 实现自动添加或者替换 内容的IMG标签的 alt title 属性
  12. centos 安装 lua运行环境   非yum安装
  13. 常用的NoSQL数据库
  14. redis—redis概述
  15. 走进Dubbo——RPC框架简介
  16. 信号与系统——阶跃信号与冲激信号
  17. Introduction to Track-To-Track Fusion
  18. 电子工程师计算机相关论文题目,电子信息工程师职称论文
  19. 北京高级软件需求分析师培训招生!
  20. 我和关注我的1w个粉丝“合影”啦–爬取上万个粉丝的数据并进行数据可视化分析,收获满满

热门文章

  1. 搞个网站需要多少钱【网站费用】
  2. python爬虫面试问题及答案_关于Python爬虫面试50道题
  3. 04-MongoDB集群和安全
  4. ogm 算法_如何在Windows Vista中播放.OGM视频文件
  5. 百度地图线路颜色_你是铁路大亨吗?五个值得收藏的铁路地图网站
  6. JS内存问题:栈和堆
  7. 史上最全最新前端面试题(不定期更新,有问题欢迎评论区对线)
  8. 【DevOps】我们忽视了Daily Build(每日构建)吗?
  9. Android之SharedPreferences使用
  10. 你好 Redis,能回答我 7 个问题吗?