在scrapy中使用selenium的编码流程:
1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性)
2.重写spider的一个方法closed(self,spider),在该方法中执行浏览器关闭的操作
3.在下载中间件的process_response方法中,通过spider参数获取浏览器对象
4.在中间件的process_response中定制基于浏览器自动化的操作代码(获取动态加载出来的页面源码数据)
5.实例化一个响应对象,且将page_source返回的页面源码封装到该对象中
6.返回该新的响应对象
需求 在Scrapy框架中使用selenium来实现编程 网易页面
wangyi.py
import scrapy
from selenium import webdriver
# 实例化浏览器可以通过中间件的process_response中的spider来获取
#因此实例化浏览器可以写在这里
class WangyiSpider(scrapy.Spider):
name = 'wangyi'
# allowed_domains = ['www.xxx.com']
start_urls = ['http://war.163.com/']
#实例化浏览器对象 只能被调一次
def __init__(self):
self.bro = webdriver.Chrome(r'C:pacong_dataday3chromedriver.exe')
#不能写在这 因为这里也会被调多次
def parse(self, response):
div_list = response.xpath('//div[@class="data_row news_article clearfix "]')
for div in div_list:
title = div.xpath('.//div[@class="news_title"]/h3/a/text()').extract_first()
print(title)
#在整个爬虫结束之后才会被调用
def closed(self,spider):
print('关闭浏览器对象')
self.bro.quit()
middlewares.py
from time import sleep
#1 HtmlResponse是response对应的类
from scrapy.http import HtmlResponse
class WangyiproDownloaderMiddleware(object):
#拦截响应 重新生成一个新的响应对象 包含动态数据 实例化浏览器中不能写在这 这个方法可能会调多次
#实例化浏览器可以通过中间件的process_response中的spider来获取
#这里的request是response中所对应的请求对象
def process_response(self, request, response, spider):
# Called with the response returned from the downloader.
# Must either;
# - return a Response object
# - return a Request object
# - or raise IgnoreRequest
#核心内容 如何获取动态加载的数据 使用selenium
#获取实例化的浏览器对象 通过spider来获取
#让这个浏览器发送get请求 是请求的url
#也就是wangyi.py中的start_urls = ['http://war.163.com/'] 这个url
print('即将返回一个新的响应对象')
bro = spider.bro
bro.get(url=request.url)
#注意 这两个写法是一致的
# bro.get(url='http://war.163.com/')
# bro.get(url=spider.bro.current_url)
sleep(3)
#包含了动态加载出来的数据 获取到页面源码数据
page_text = bro.page_source
#body 响应体
return HtmlResponse(url=request.url,body=page_text,encoding='utf-8',request=request)
settings.py
BOT_NAME = 'wangyiPro'
SPIDER_MODULES = ['wangyiPro.spiders']
NEWSPIDER_MODULE = 'wangyiPro.spiders'
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
#USER_AGENT = 'wangyiPro (+http://www.yourdomain.com)'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
DOWNLOADER_MIDDLEWARES = {
'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
}