一、关于selenium
的介绍
根据百度百科介绍:
Selenium
是一个用于Web
应用程序测试的工具,在现在的爬虫领域中可以直接模拟浏览器请求web
服务器,使用场景:Ajax
加载的页面,现代前端框架react、vue、angular
开发的项目,你查看源代码根本看不到东西的那种情况下。
二、关于selenium
的下载与安装
-
1、安装
pip install selenium
-
2、还需要
ChromeDriver
才能驱动Chrome浏览器完成相应的操作。- 官网下载地址
-
在
window
下的配置在
Windows
下,建议直接将chromedriver.exe
文件拖到Python
的Scripts
目录下,或者工作空间下 -
在
mac
电脑下配置# 1.移动到文件夹下 sudo mv chromedriver /usr/bin # 2.配置环境变量 export PATH="$PATH:/usr/local/chromedriver" # 3.刷新 source ~/.profile
3、在黑窗口中测试(输入
chromedriver
)
三、基本的使用
-
1、模拟打开
github
网站from selenium import webdriver # 打开浏览器 browser = webdriver.Chrome() # 进去网页 browser.get(url='https://github.com/login') print(browser.page_source) # 关闭 # browser.quit()
-
2、获取元素及模拟登录
github
from selenium import webdriver from scrapy.selector import Selector import time # 打开浏览器 browser = webdriver.Chrome() # 进去网页 browser.get(url='https://github.com/login') # 休息几秒 time.sleep(20) browser.find_element_by_css_selector('#login_field').send_keys('kuangshp@126.com') browser.find_element_by_css_selector('#password').send_keys('*****') browser.find_element_by_css_selector('input[name="commit"]').click() print(browser.page_source) browser.quit()
-
3、在
selenium
中写javascript
的代码,(适用于滑动解锁登录的情况,写博客的时候没注意哪个网站是滑动解锁的)...(把上面的代码复制过来) time.sleep(3) browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")
四、方法一、写一个中间件将selenium
集成到scrapy
中抓取天猫上商品信息
-
1、中间件的写法
# 设置一个selenium的中间件 from selenium import webdriver from scrapy.http import HtmlResponse import time class SeleniumMiddleware(object): def __init__(self): self.browser = webdriver.Chrome() super(SeleniumMiddleware, self).__init__() def process_request(self, request, spider): if spider.name == 'tianmao': self.browser.get(request.url) time.sleep(5) print('你访问的网站:{0}'.format(request.url)) return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source, encoding="utf-8", request=request)
-
2、在
spider
获取值# -*- coding: utf-8 -*- import scrapy class TianmaoSpider(scrapy.Spider): name = 'tianmao' allowed_domains = ['detail.tmall.com'] start_urls = [ 'https://detail.tmall.com/item.htm?spm=a1z10.1-b-s.w5003-18239599942.10.7ecd6d22DnmNOX&id=558343675882&rn=aad6d07ecc49599549f5df50943947f3&skuId=3633466738509&scene=taobao_shop'] def parse(self, response): print('进来了-----') print(response.css('#J_PromoPrice .tm-price::text').extract_first(), '当前的价格')
五、直接在spider
中使用selenium
打开浏览器,然后在中间件中使用browser.get
去访问网站
-
1、关于
spider
的写法# -*- coding: utf-8 -*- import scrapy from selenium import webdriver from scrapy.xlib.pydispatch import dispatcher from scrapy import signals class TianmaoSpider(scrapy.Spider): name = 'tianmao' allowed_domains = ['detail.tmall.com'] start_urls = [ 'https://detail.tmall.com/item.htm?spm=a1z10.1-b-s.w5003-18239599942.10.7ecd6d22DnmNOX&id=558343675882&rn=aad6d07ecc49599549f5df50943947f3&skuId=3633466738509&scene=taobao_shop'] def __init__(self): self.browser = webdriver.Chrome() super(TianmaoSpider, self).__init__() # 设置信号监听spider_closed的时候关闭浏览器 dispatcher.connect(self.spider_closed, signals.spider_closed) def parse(self, response): print('进来了-----') print(response.css('#J_PromoPrice .tm-price::text').extract_first(), '当前的价格') def spider_closed(self, spider): self.browser.quit()
-
2、中间件的写法
# 设置一个selenium的中间件 from selenium import webdriver from scrapy.http import HtmlResponse import time class SeleniumMiddleware(object): def process_request(self, request, spider): if spider.name == 'tianmao': spider.browser.get(request.url) time.sleep(5) print('你访问的网站:{0}'.format(request.url)) return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding="utf-8", request=request)
3、在
settings.py
中配置