【爬虫重磅】Python+Scrapy+Selenium爬取京东【动态js页面加载】案例【比splash更加容易操作的动态js加载方法】

15 篇文章 0 订阅
4 篇文章 0 订阅

参考案例:https://www.cnblogs.com/cnkai/p/7570116.html

 

第一部分:实现爬虫类和初始化 Selenium火狐浏览器对象

scrapy_selenium_jd.py爬虫文件



# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,Response
from selenium import webdriver


class ScrapySeleniumJDSpider(scrapy.Spider):
    name = 'scrapy_selenium_jd'
    allowed_domains = ["jd.com"]
    url = "https://search.jd.com/Search?keyword=python&enc=utf-8"
    roll_js = 'document.getElementById("footer-2017").scrollIntoView(true)'

    def __init__(self,name=None,**kwargs):
        super().__init__(name, **kwargs)
        # 创建爬虫的同时初始化火狐浏览器配置并创建browser对象
        self.seleniumFirefoxInit()

    def seleniumFirefoxInit(self):
        # 设置火狐浏览器后台运行并创建browser对象
        # firefox_options = webdriver.FirefoxOptions()
        # firefox_options.add_argument('--headless')
        # self.browser = webdriver.Firefox(options=firefox_options)
        self.browser = webdriver.Firefox()
        self.browser.maximize_window()

    # 重写父类方法,浏览器对象关闭只能在这里,爬虫结束之后自动关闭
    def close(self,spider, reason):
        self.browser.quit()
        super().close(spider,reason)

    def start_requests(self):
        yield Request(url=self.url,callback=self.parse)


    def parse(self, response):
        res = response  # type:Response
        # print(res.text)
        ul = res.xpath('//ul[@class="gl-warp clearfix"]')
        li = ul.css(".gl-item")
        print(f'条数:{len(li)}')  #正确输出60条【如果没有执行滑动只会出来30条】

第二部分:通过自定义下载中间件Downloader Middleware拦截Request和Response对象,利用Selenium火狐浏览器对象动态加载js页面获取最终的数据,再重构Response对象【必须使用HtmlResponse或TextResponse】返回爬虫结果!

middlewares.py中间件文件之【下载中间件拦截Request和Response】


# 这里是拦截ScrapySelenium爬虫类的下载类型Middleware
class ScrapySeleniumMiddleware(object):
    def process_response(self, request, response, spider):
        try:
            spider.browser.get(request.url)
            time.sleep(3)
            # 发送完脚本一定要延迟,否则来不及执行!
            spider.browser.execute_script(spider.roll_js)
            time.sleep(5)
        except Exception:
            print('超时')
            # 发送完脚本一定要延迟,否则来不及执行!
            spider.browser.execute_script('window.stop()')
            time.sleep(5)
            raise Exception

        # 注:这里必须使用HtmlResponse或TextResponse,而不能使用Response构造对象,否则返回的text内容会错误!
        return HtmlResponse(url=spider.browser.current_url,
                        body=bytes(spider.browser.page_source,encoding="utf-8"),
                        request=request,
                        encoding="utf-8")

第三部分:【切记】我们的目的是拦截修改Response数据,所以中间件只能选择【Downloader Middleware】 

settings.py下载中间件配置:

DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.cookies.CookiesMiddleware':None,
    'scrapy_login.middlewares.MyCookiesMiddleware': 701,
    'scrapy_login.middlewares.ScrapySeleniumMiddleware': 702,

}

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值