middlewars.py
from selenium import webdriver
#导入selinium库
from scrapy.http import HtmlResponse
import time
class SeliniumMilldewares(object):
def process_request(self, request, spider):
url = request.url
# 判断页面是否需要渲染
if 'monthdata' in url: #用来判断具体的url请求使用selinium
dr = webdriver.Chrome()
# 有可能页面加载完了,数据还没加载完
dr.get(url)
time.sleep(7)
data = dr.page_source #用于获取渲染之后的源码
# 关闭浏览器
dr.close()
# 构建响应
res = HtmlResponse(
url= url,
request=request,
body=data.encode(),
encoding="utf-8",
)
return res
在setting配置一下就可以了
Selenium
Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,也可以页面截屏。
PhantomJS
PhantomJS 是一个基于Webkit的“无界面”(headless)浏览器,它会把网站加载到内存并执行页面上的 JavaScript。在内存中加载渲染界面,是看不见摸不到。
使用Phantomjs?先使用selinium配合其他浏览器把代码写好了, 在部署的时候再换成Phantomjs,然后部署到服务器上。
selenium的安装
sudo pip3 install selenium
phantomJS的安装
下载 http://phantomjs.org/
tar -xvjf phantomjs-2.1.1-linux-x86_64.tar.bz2
sudo cp -r phantomjs-2.1.1-linux-x86_64 /usr/local/share/
sudo ln -sf /usr/local/share/phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/
Chrome浏览器驱动的安装
下载对应版本的浏览器驱动
解压后得到驱动的可执行文件,将其拷贝到任意环境变量目录
echo $PATH查看环境变量路径
1.浏览器驱动对象
1)库的导入
from selenium import webdriver
2)创建浏览器对象
driver = webdriver.xxx()
使用dir(driver)查看方法
3)浏览器尺寸相关操作
maximize_window() 最大化
4)浏览器的关闭操作
close() 关闭当前标签/窗口
quit() 关闭所有标签/窗口
创建一个浏览器对象 driver = webdriver.PhantomJS() 加载网页: driver.get("http://www.baidu.com/") 保存页面快照 driver.save_screenshot("baidu.png") 定位和操作: driver.find_element_by_xpath(“//*[@id="u1"]/a[1]”)
查看请求信息:
driver.page_source 获取源码
driver.get_cookies() 获取浏览器中存储的cookies
driver.current_url 查看当前url
driver.title 查看当前标签的标题
元素定位方法的分类(调用方式):直接调用型(推荐方式) el = driver.find_element_by_xpath(‘html/body/div/a’)
从定位到的元素中提取数据的方法el.get_attribute(key) 获取key属性名对应的属性值 el.text 获取开闭标签之间的文本内容
对定位到的元素的操作el.click() 对元素执行点击操作 el.submit() 对元素执行提交操作 el.clear() 清空可输入元素中的数据 el.send_keys(data) 向可输入元素输入数据
元素定位的两种方式(返回结果)
driver.find_element_by_xxx()
使用场景:
一般用于精确定位一个元素
返回结果为一个element对象
driver.find_elements_by_xxx ()
使用场景:
定位一组元素
返回结果为element对象列表
定位元素的8种方法:sel = driver.find_elements_by_id 使用id值定位 el = driver.find_elements_by_xpath 使用xpath定位 el = driver.find_elements_by_tag_name 使用标签名定位 el = driver.find_elements_by_link_text 使用文本定位 el = driver.find_elements_by_partial_link_text 使用部分文本定位 el = driver.find_elements_by_name 使用name属性值定位 el = driver.find_elements_by_class_name 使用class属性值定位 el = driver.find_elements_by_css_selector 使用css选择器定位
注意点:
by_link_text()和by_partial_link_text()区别:
全部文本和包含某个文本
文本需要含有链接
selenium执行js
重要的js代码* js = "window.scrollTo(x,y) " x为水平拖动距离,y为垂直拖动举例