关于selenium在python爬虫过程中的使用

一、关于selenium的介绍

根据百度百科介绍:Selenium是一个用于Web应用程序测试的工具,在现在的爬虫领域中可以直接模拟浏览器请求web服务器,使用场景:Ajax加载的页面,现代前端框架react、vue、angular开发的项目,你查看源代码根本看不到东西的那种情况下。

二、关于selenium的下载与安装

  • 1、安装

    pip install selenium
  • 2、还需要ChromeDriver才能驱动Chrome浏览器完成相应的操作。

    • 官网下载地址
    • window下的配置

      Windows下,建议直接将chromedriver.exe文件拖到PythonScripts目录下,或者工作空间下

    • 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中配置

上一篇:Python爬虫-Scrapy框架的工作原理


下一篇:Scrapy翻页爬取糗事百科所有段子后,我总结出的...