一、簡介
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方法