当前位置:   article > 正文

python之Headless Chrome_java 调用headless chrome 打印

java 调用headless chrome 打印

我们之前都是使用slenium + PhantomJS来获取渲染后的页面,但是因为PhantomJS不再更新了,selenium也是不再对PhantomJS提供支持,但是我们还有Headless Chrome,这个是Chrome推出的能实现和PhantomJS一样的功能,

使用方式:以抓取京东商城的商品为例,京东商城的商品一页显示30个商品,但是如果我们向下拉的话,还会再加载30个商品,

我们就使用Headless Chrome来模拟这一过程,获取一页60个商品

selenium的核心思想就是我们在下载中间件的 process_request 将我们的reqeust转化成selenium的请求

jd.py

  1. # -*- coding: utf-8 -*-
  2. import scrapy
  3. import re
  4. from jingdong.items import JingdongItem
  5. from selenium import webdriver
  6. from selenium.webdriver.chrome.options import Options
  7. class JdSpider(scrapy.Spider):
  8. def __init__(self):
  9. chrome_options = Options()
  10. # 加上这个参数就可以了,能够实现跟PhantomJS 一样的功能
  11. chrome_options.add_argument('--headless')
  12. # chrome_options.add_argument('--disable-gpu')
  13. self.browser = webdriver.Chrome(chrome_options=chrome_options)
  14. # self.browser = webdriver.Chrome()
  15. self.browser.set_page_load_timeout(30)
  16. def closed(self, spider):
  17. print("spider closed")
  18. self.browser.close()
  19. name = 'jd'
  20. allowed_domains = ['jd.com']
  21. start_urls = ['https://search.jd.com/Search?keyword=%E7%BE%8E%E9%A3%9F&enc=utf-8']
  22. def parse(self, response):
  23. goods_list = response.xpath('//div[@id="J_goodsList"]/ul/li')
  24. for goods in goods_list:
  25. item = JingdongItem()
  26. item['goods_name'] = goods.xpath('.//div[@class="p-name p-name-type-2"]/a/em/text()').extract_first()
  27. item['price'] = goods.xpath('.//div[@class="p-price"]/strong/i/text()').extract_first()
  28. item['shop'] = goods.xpath('.//div[@class="p-shop"]/span/a/text()').extract_first()
  29. yield item

middlewares.py

  1. # -*- coding: utf-8 -*-
  2. # Define here the models for your spider middleware
  3. #
  4. # See documentation in:
  5. # https://doc.scrapy.org/en/latest/topics/spider-middleware.html
  6. from scrapy import signals
  7. from selenium import webdriver
  8. from selenium.common.exceptions import TimeoutException
  9. from selenium.webdriver.common.by import By
  10. from selenium.webdriver.support.ui import WebDriverWait
  11. from selenium.webdriver.support import expected_conditions as EC
  12. from scrapy.http import HtmlResponse
  13. import time
  14. class JingdongDownloaderMiddleware(object):
  15. def process_request(self, request, spider):
  16. if spider.name == 'jd':
  17. try:
  18. spider.browser.get(request.url)
  19. spider.browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
  20. except TimeoutException as e:
  21. print('超时')
  22. spider.browser.execute_script('window.stop()')
  23. time.sleep(2)
  24. return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source,
  25. encoding="utf-8", request=request)

我们要记住process_request的返回值,如果返回的是None,那么就继续scrapy的运行流程,如果返回request,scrapy就会重新发送这个request,如果返回response,则不会再经过其他的process_request和process_exception,这就相当于直接得到了返回值,会进入返回值的流程。

那么selenium做了什么呢,他就相当于是截取了原本的request,然后自己请求,并返回结果,这个reqeust就没有由scrapy的下载器来下载response,这一步由selenium来做了

以上的两个是最关键的步骤,剩下的settings,items就跟其他的爬虫没啥区别,该开的开,该写的写

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/90190
推荐阅读
相关标签
  

闽ICP备14008679号