使用 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()
-