Scrapy 框架 使用 selenium 爬取动态加载内容
使用 selenium 爬取动态加载内容
-
开启中间件
DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543, }
-
在爬虫文件中 创建 浏览器对象
使用 爬虫文件的 init 方法
def __init__(self): self.bro = webdriver.Chrome(executable_path=r'C:\Users\old-boy\Desktop\爬虫+数据\爬虫_day04\chromedriver.exe')
数据解析:
start_urls = ['http://news.163.com/domestic/'] ....... def parse(self, response): div_list = response.xpath('//div[@class="ndi_main"]/div') for div in div_list: title = div.xpath('./div/div[1]/h3/a/text()').extract_first() detail_url = div.xpath('./div/div[1]/h3/a/@href').extract_first() print(title,detail_url)
-
操作在 process_response(self,request,response,spider) 中 编写 浏览器自动化操作
进行点击 或者 页面滚动
返回新的 response 对象
rom time import sleep from scrapy.http import HtmlResponse class WangyiproDownloaderMiddleware(object): #拦截所有的响应对象 def process_response(self, request, response, spider): # request.url 拦截到响应的 url 判断是否是请求的响应 对象 # 有些页面 不需要 使用 selenium 直接返回 response # 参数spider表示的就是爬虫类的一个对象 # 使用一个满足需求的新的响应对象替换原有的 bro = spider.bro # 浏览器对象 url = spider.start_urls[0] bro.get(url) bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') sleep(2) bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') sleep(2) bro.execute_script('window.scrollTo(0,document.body.scrollHeight)') sleep(2) a_tag = bro.find_elements_by_class_name('load_more_btn')[0] a_tag.click() sleep(2) page_text = bro.page_source #实例化一个新的响应对象 response = HtmlResponse(url=bro.current_url,body=page_text,encoding='utf-8',request=request) return response
-
关闭 浏览器对象
-
重写 closed(self,spider):
def closed(self,spider): self.bro.quit()
-