selenium動態網頁與請求簡單學習

一、簡介
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方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章