一、简介
selenium是一个用于web应用程序测试工具,可以直接运行在浏览器,就像用户在操作一样。
二、文档
apiurl
安装:进入虚拟环境,pip install selenium
三、使用selenium登陆微博
from selenium import webdriver
from scrapy.selector import Selector
import time
browser = webdriver.Chrome(executable_path='D:\Chrome Download\chromedriver_win32\chromedriver.exe') #chrom driver的路径
browser.get('https://weibo.com/')
#browser也提供了很多获取元素的方法但是会比scrapy的慢,所以尽量用scrapy
time.sleep(15)
#selenium 微博模拟登陆
browser.find_element_by_css_selector('#loginname').send_keys('账号') #输入账号
browser.find_element_by_css_selector('.info_list.password input[type="password"]').send_keys('密码') #输入密码
browser.find_element_by_css_selector('.info_list.login_btn a[node-type="submitBtn"]').click() #点击
四、使用selenium控制鼠标下拉
browser.get('https://www.oschina.net/blog/')
time.sleep(15)
for i in range(3):
browser.execute_script(''
'window.scrollTo(0,document.body.scrollHeight);'
' var lenOfPage = document.body.scrollHeight;'
'return lenOfPage;'
)
time.sleep(3)
五、设置不加载图片
#设置chromedriver不加载图片
chrome_opt = webdriver.ChromeOptions()
prefs = {'profile.managed_default_content_settings.images': 2} #把这个设置为2就是不加载图片
chrome_opt.add_experimental_option('prefs', prefs) #把设置的值放进去
browser = webdriver.Chrome(executable_path='D:\Chrome Download\chromedriver_win32\chromedriver.exe',chrome_options=chrome_opt) #chrom driver的路径
browser.get('https://www.taobao.com')
六 phantomjs
#phantomjs,无界面的浏览器,多进程情况下phantomjs性能会下降很严重
browser = webdriver.PhantomJS(executable_path='D:/Chrome Download/phantomjs-2.1.1-windows/bin/phantomjs.exe') #phantomjs的路径
browser.get('https://item.taobao.com/item.htm?spm=a1z10.1-c-s.w5003-18178698956.4.2673684cOq4jIr&id=586987010790&scene=taobao_shop')
print(browser.page_source)
browser.quit()
七、selenium集成到scrapy中
在middleware中添加
from selenium import webdriver
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
# 初始化browser 这样就不用没请求一个地址打开一个浏览器了
def __init__(self):
self.browser = webdriver.Chrome(
executable_path='D:\Chrome Download\chromedriver_win32\chromedriver.exe') # chrom driver的路径
super(JSPageMiddleware, self).__init__()
# 通过chrome请求动态网页
def process_request(self, request, spider):
if spider.name == 'nga':
self.browser.get(request.url)
import time
time.sleep(5)
print('访问:{0}'.format(request.url))
# 在这里通过Chrome请求之后让它不再发送到下载器,没必要再去下载一遍了
# 通过返回来的browser.page_source对HtmlResponse做初始化就可以了
# 一旦遇到HtmlResponse,scrapy就不会再向downloader发送而是返回给spider
return HtmlResponse(url=self.browser.current_url, body=self.browser.page_source, encoding='utf-8',
request=request)
更改settngs文件:
DOWNLOADER_MIDDLEWARES = {
#'NgaSpider.middlewares.NgaspiderDownloaderMiddleware': 543,
'NgaSpider.middlewares.JSPageMiddleware': 1,
}```
可以直接把Chrome初始化代码放到scrapy中,
…
from scrapy.xlib.pydispatch import dispatcher
from scrapy import signals
def init(self):
self.browser = webdriver.Chrome(
executable_path=‘D:\Chrome Download\chromedriver_win32\chromedriver.exe’) # chrom driver的路径
super(NgaSpider, self).init()
dispatcher.connect(self.spider_close,signals.spider_closed)
def spider_close(self,spider):
#当爬虫退出时关闭Chrome
print('spider closed')
self.browser.quit()
...
更改middleware为:
from scrapy.http import HtmlResponse
class JSPageMiddleware(object):
# 通过chrome请求动态网页
def process_request(self, request, spider):
if spider.name == 'nga':
spider.browser.get(request.url)
import time
time.sleep(5)
print('访问:{0}'.format(request.url))
# 在这里通过Chrome请求之后让它不再发送到下载器,没必要再去下载一遍了
# 通过返回来的browser.page_source对HtmlResponse做初始化就可以了
# 一旦遇到HtmlResponse,scrapy就不会再向downloader发送而是返回给spider
return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding='utf-8',
request=request)
这里使用了信号量,当爬虫关闭时调用spider_close方法