第一部分:实现爬虫类和初始化 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,
}