一、反爬与爬虫之js异步
(一)反爬措施:改变网页数据获取架构。
数据不在页面直接渲染,而是通过前端js异步获取。js获取到数据需要:执行js才可以,即通过浏览器触发Ajax事件。但是使用requests模块获取到的js代码并不能执行。—js代码只包含Dom和Bom命令,并没有我们需要的数据。
解决的办法:如果能找到一个执行js的工具,是不是数据就出来了。浏览器中之所能够出现数据是因为浏览器就有执行js的功能。
同时我们python也有两个工具。
- selenium—驱动–让我们可以通过代码的方式来进行下面两个工具的控制。
- phantomjs—无界面浏览器
- chrome----有界面浏览器(谷歌)
(二)爬虫的基本流程
(三)Ajax 数据获取
如果提交表单之后,或从服务器获取信息之后,网站的页面不需要重新刷新,那么你访问的网站就在用 Ajax技术。
Ajax 全称是 Asynchronous JavaScript and XML(异步 JavaScript 和 XML),网站不需要使用单独的页面请求就可以和网络服务器进行交互(收发信息)。
二、Selenium 数据获取
(一)Selenium 简介
Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截 屏,或者判断网站上某些动作是否发生.
Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用。但是我们有时候需要让它内嵌在代码中运行,所以我们可以用一个叫 PhantomJS 的工具代替真实的浏览器。
pip 命令安装:推荐使用下列版本
pip install selenium==2.48.0
(二)PhantomJS 简介
PhantomJS 是一个基于 Webkit 的“无界面”(headless)浏览器,它会把网站加载到内存并 执行页面上的 JavaScript,因为不会展示图形界面,所以运行起来比完整的浏览器要高效。
因为 PhantomJS 是一个功能完善(虽然无界面)的浏览器而非一个 Python 库,所以它不需要像 Python 的其他库一样安装,但我们可以通过 Selenium 调用 PhantomJS 来直接使用。
下载与安装:
使用镜像源能提高下载速度,防止下载失败。
这里我们下载2.1.1的windows版本
解压后进入bin目录,找到.exe文件
若当前环境使用的是anaconda虚拟环境,复制该文件到anaconda下的script目录下即可。在命令行窗口运行phantomjs命令进行测试。
phantomjs
出现上述内容表明安装成功。
(三)Chrome(有界面)
可以用来测试一些复杂项目。
1、下载安装:
- 先要确定chrome浏览器是正版的(从官网下载)
下载安装:https://www.google.cn/chrome/ - 若已经安装,应打开已经安装的谷歌浏览器中的帮助——>关于Google里面的版本信息:
显示红框里的内容就说明该浏览器是正版,否则应卸载重新安装。同时还需要检查控制面板中是否有其他版本的谷歌浏览器,也应将其卸载,否则程序无法正常运行。
2、下载chromedirver的驱动:
第一步:百度搜索镜像源文件—>chromedriver
第二步:确定要下载的版本号,前三位一致,后一位相近
第三步:选择windos版本下载;
第四步:配置chromedirver:
找到里面exe工具,将这个工具放入anaconda/scripts文件夹下即可。
测试:打开cmd
三、selenium+phantomjs的操作。
参考代码如下:
"""
selenium+phantomjs入门
"""
from selenium import webdriver
import time
# 1、先要创建一个浏览器驱动
driver = webdriver.PhantomJS()
# driver = webdriver.Chrome()
# driver = webdriver.Firefox()
# driver = webdriver.Ie()
# driver = webdriver.Safari()
# 2、请求url
driver.get('https://www.baidu.com/')
# 3、等待
time.sleep(1)
# 4、这是driver就是浏览器。这个浏览器里面已经打开了百度的首页
# 获取页面截图
driver.save_screenshot('index.png')
# 获取页面元素
# find_element_by_id
result = driver.find_element_by_id('kw')
print(result)
# webelement的操作
# 如果是input:输入
result.send_keys('python')
# 找到按钮:点击
driver.find_element_by_id('su').click()
time.sleep(1)
# 找到元素位置
print(result.location)
print(result.size)
# 对于driver对象(浏览器对象)的属性
# 获取页面源代码--浏览器功能组件帮我们将js执行后得到页面内容。
print(driver.page_source)
案例主要有三个,请看下一篇:第五讲案例
案例https://blog.csdn.net/lxd1908717401/article/details/107326627